【问题标题】:Grid with named RowDefinition fails to populate as ItemsPanel in WPF4命名为 RowDefinition 的网格无法填充为 WPF4 中的 ItemsPanel
【发布时间】:2011-11-23 22:30:30
【问题描述】:

我在 ItemsControl ItemsPanelTemplate 中定义了一个 Grid,其中一个 RowDefinitions 定义了一个 x:Name(因此我可以为行大小设置动画)。

<ItemsControl ItemsSource="{Binding Data, Source={StaticResource model}}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition x:Name="t" />
                    <RowDefinition />
                </Grid.RowDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

这在 3.5 中运行良好,但是当我们最近升级到 4.0 时,一切都崩溃了。我会看到一个定义了行和列但没有子项的 Grid。

如果我在网格上设置 IsItemsHost=true,一切都会开始工作。如果我将 x:Name 添加到 Grid 本身,或者从 RowDefinition 中删除 x:Name,则一切正常。

<ItemsPanelTemplate>
    <Grid IsItemsHost="True">
        <Grid.RowDefinitions>
            <RowDefinition x:Name="t" />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</ItemsPanelTemplate>

<ItemsPanelTemplate>
    <Grid x:Name="g">
        <Grid.RowDefinitions>
            <RowDefinition x:Name="t" />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</ItemsPanelTemplate>

这似乎是一个错误,但我想与社区核实一下,看看人们是否同意,或者我是否忽略了一些东西。我在 Connect 或网络上找不到任何东西,所以谁能解释一下我看到了什么?

【问题讨论】:

  • 哇,这是你发现的一个非常奇怪的错误(是的,我 100% 确定这是一个错误 :-) 至少它有一个非常简单的解决方法,就像你自己发布的一样,只需命名Grid 以及你很高兴去
  • 你在 MS-connect 上看过/发帖了吗?
  • 我还没有在 Connect 上发帖,不过我已经尽我所能搜索了。
  • IsItmemsHost="True" 会影响 ItemsControl 中的项目生成行为,并且应该被视为 any ItemsPanelTemplate 中的必须。至于为什么x:Name 会影响行为 - 我仍然对此感到困惑......

标签: .net wpf xaml itemscontrol itemspaneltemplate


【解决方案1】:

我不认为这是一个错误。您在这里所做的是无意中在您的代码中引入了一个错误,该错误不会在设计或编译时但在运行时抛出异常,因此您的动画未完成并且网格的内容未呈现。

冲突在WPF XAML Namescope 中,具体到DataTemplate,如MSDN article 中所述。这篇文章确实指出模板中的命名元素会自动赋予唯一的Namescope 以防止名称冲突,但它没有告诉我们当模板根未命名但包含命名子元素时会发生什么或IsItemsHost 如何影响ItemsTemplate.

  1. 我可以建议的一种方法是使用您的原始场景,并在调试期间密切关注您的输出日志中是否存在任何已被与您的动画相关的 XAML 解析器悄悄削弱的运行时异常。

  2. 另一种(我个人认为更好)的方法是创建一个继承自ItemsControl 的新“模板化控件”。在这里,您可以在ApplyTemplate 过载期间访问ItemsPanel 以找到您的Grid/GridColumn 并在那里执行动画。这是一个很好的tutorial

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多