命名为RowDefinition的网格无法作为WPF4中的ItemsPanel填充

问题描述 投票:6回答:1

我在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添加到网格本身,或从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或Web上找不到任何内容,所以谁能解释我所看到的内容?

.net wpf xaml itemscontrol itemspaneltemplate
1个回答
0
投票

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

WPF XAML Namescope中所述,冲突是DataTemplate特有的MSDN article。该文章确实指出,模板中的命名元素会自动获得一个唯一的Namescope来防止名称冲突,但是它没有告诉我们当模板根未命名但包含命名子项时会发生什么,或者IsItemsHost如何影响模板。 ItemsTemplate

  1. [我可以建议的一种方法是使用原始方案,并在调试过程中,密切注意输出日志中是否有与您的动画有关的XAML解析器悄悄地烦扰的运行时异常。

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

© www.soinside.com 2019 - 2024. All rights reserved.