【问题标题】:Access ItemsPanel property from DataTemplate从 DataTemplate 访问 ItemsPanel 属性
【发布时间】:2011-10-31 15:48:27
【问题描述】:

在带有 Canvas ItemsPanel 的 ListBox 的上下文中,我需要为多个 DataTemplates 中的每个控件访问 Cavas.ZIndex(列表显示几种对象类型)。使用

是不够的
<ListBox.ItemContainerStyle>
    <Setter Property="Canvas.ZIndex" ..... />  

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

【问题讨论】:

  • 谁能确认这是不可能的?
  • 这是 WPF 的缺点。你可以在几行 XAML 中做很多复杂的事情——但是像设置一个绝对 z 顺序这样简单的事情就会变成一个巨大的考验......

标签: wpf datatemplate z-index z-order


【解决方案1】:

据我所知,这是不可能的

原因是当 ListBox 呈现时,它呈现如下(假设您指的是与 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 绘制在所有 Lines 之上,因为它们并不都共享同一个父级,并且 ZIndex 用于对同一父级容器中的项目进行排序。

一种解决方法是使用两个相互叠加的独立 ItemsControl。因此,您的所有线条都将绘制在底部 ItemsControl 上,而所有 TextBlock 将绘制在顶部 ItemsControl 上。

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

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

【讨论】:

  • 恐怕你是对的 :-( - 我只是想仔细检查一下,以防有人想出了一个神奇的解决方案......双重列表/项目控制解决方案会搞砸一些其他代码 - 不确定它是否可行。
  • 也许有代码背后的方法?还是会遇到同样的问题?
  • @Ricibob 如果您在代码隐藏中设置 ZIndex 无关紧要,控件仍将属于不同的父级,因此不会应用 ZIndex。使用双 ItemsControl 有什么问题?
  • 双项控制的问题是目前我有两个对象视图模型NodeVM(框)和LinkLineVM(线加小链接强度框)。然后,我必须拆分链接线并将其一部分(框)与节点放在一个控件中,将另一部分(线)本身放在另一个控件中。它会起作用 - 它只是不那么优雅。
猜你喜欢
  • 2011-07-12
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多