6

我在 ItemsControl ItemsPanelTemplate 中定义了一个网格,并且其中一个 RowDefinitions 定义了 ax: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 时,一切都崩溃了。我会看到一个定义了行和列定义但没有子级的网格。

如果我在网格上设置 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 或网络上找不到任何东西,所以任何人都可以解释我所看到的吗?

4

1 回答 1

0

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

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

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

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

于 2011-11-28T23:28:20.100 回答