在具有Canvas ItemsPanel的ListBox的上下文中,我需要为多个DataTemplates中的每个控件(该列表显示几个对象类型)访问Cavas.ZIndex。它不足以使用从DataTemplate访问ItemsPanel属性
<ListBox.ItemContainerStyle>
<Setter Property="Canvas.ZIndex" ..... />
因为有几个数据模板,每个都有几个控件,我想控制每个控件的绝对zindex。 这甚至可能吗?
在具有Canvas ItemsPanel的ListBox的上下文中,我需要为多个DataTemplates中的每个控件(该列表显示几个对象类型)访问Cavas.ZIndex。它不足以使用从DataTemplate访问ItemsPanel属性
<ListBox.ItemContainerStyle>
<Setter Property="Canvas.ZIndex" ..... />
因为有几个数据模板,每个都有几个控件,我想控制每个控件的绝对zindex。 这甚至可能吗?
据我所知,这是不可能的
的原因是,当一个列表框渲染,它呈现像这样(假设你指的是你在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>
任何人都可以确认这是不可能的吗? – Ricibob
这是WPF的缺陷。你可以通过几行XAML来完成一些复杂的东西 - 但是然后像设置一个absolution z-order这样的简单事情就变成了一次巨大的考验... – Ricibob