2011-10-31 86 views
0

在具有Canvas ItemsPanel的ListBox的上下文中,我需要为多个DataTemplates中的每个控件(该列表显示几个对象类型)访问Cavas.ZIndex。它不足以使用从DataTemplate访问ItemsPanel属性

<ListBox.ItemContainerStyle> 
    <Setter Property="Canvas.ZIndex" ..... /> 

因为有几个数据模板,每个都有几个控件,我想控制每个控件的绝对zindex。 这甚至可能吗?

+0

任何人都可以确认这是不可能的吗? – Ricibob

+0

这是WPF的缺陷。你可以通过几行XAML来完成一些复杂的东西 - 但是然后像设置一个absolution z-order这样的简单事情就变成了一次巨大的考验... – Ricibob

回答

1

据我所知,这是不可能的

的原因是,当一个列表框渲染,它呈现像这样(假设你指的是你在your other question有相同的代码):

<Canvas> 
    <ListBoxItem> 
     <ContentPresenter> 
      <Grid> 
       <TextBlock /> 
       <Line /> 
      </Grid> 
     </ContentPresenter> 
    </ListBoxItem> 
    <ListBoxItem> 
     <ContentPresenter> 
      <Grid> 
       <TextBlock /> 
       <Line /> 
      </Grid> 
     </ContentPresenter> 
    </ListBoxItem> 
    <ListBoxItem> 
     <ContentPresenter> 
      <Grid> 
       <TextBlock /> 
       <Line /> 
      </Grid> 
     </ContentPresenter> 
    </ListBoxItem> 
    ... 
</Canvas> 

如您所见,每个ListBoxItem都呈现为一组嵌套控件。您不能将所有TextBlocks绘制在所有行的顶部,因为它们不共享同一个父级,并且ZIndex用于对同一父级容器内的项目进行排序。

解决方法是使用两个单独的ItemsControl,彼此重叠。因此,所有的线条都将绘制在Bottom ItemsControl上,而所有TextBlocks都将绘制在Top ItemsControl上。

<Grid> 
    <ItemsControl ItemsSource="{Binding MyData}" 
        ItemTemplate="{DynamicResource MyLineTemplate}" /> 

    <ItemsControl ItemsSource="{Binding MyData}" 
        ItemTemplate="{DynamicResource MyTextBlockTemplate}" /> 
</Grid> 
+0

恐怕你说得对:-(我只是想仔细检查一下,有人想出了一个神奇的工作...双列表/ itemscontrol解决方案将弄乱一些其他代码 - 不知道它是否可行。 – Ricibob

+0

也许有一个代码背后的方法吗?或者将遭受同样的问题? – Ricibob

+0

@Ricibob如果你在代码隐藏中设置ZIndex并不重要,控件仍然属于不同的父母,所以ZIndex不会被应用。使用双ItemsControls有什么问题? – Rachel