WPF XAML - 将多个样式添加到资源字典中,以针对 RowDefinition

5
感谢您在帮助一个初学者了解WPF方面的想法。
我正在尝试在XAML文件中使用以下样式模板,用于WPF应用程序:
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <Style TargetType="{x:Type RowDefinition}"
                        x:Key="hideIfNotDischarged">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding DischargedBy28Days,
                                Mode=OneWay}" Value="false">
                                <Setter Property="Height" Value="0" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                    <Style TargetType="{x:Type RowDefinition}"
                        x:Key="hideIfOutcomeKnownAndAlive">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsKnownDead,
                                Mode=OneWay}" Value="false">
                                <Setter Property="Height" Value="0" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

这将在一个类似于网格的结构中后续使用:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="30" />
        <RowDefinition Style="{StaticResource hideIfNotDischarged}" />
        ...

然而,如果有超过1个样式元素针对Type RowDefinition,并且ResourceDictionary嵌套在MergedDictionary中(即使只有一个子ResourceDictionary进行合并),应用程序将失败,并显示System.Windows.ResourceDictionary.DeferrableContent:Item has already been added。换句话说,尽管这2个样式具有不同的键,但资源字典仍然试图添加一个基于目标类型的纯名称字典项(忽略键)。如何克服此问题,非常感谢您的帮助。

2
只要它们有唯一的键,您可以在应用程序中拥有多个 RowDefinition 样式。我刚刚将您上面的两个样式复制到 ResourceDictionary 中,编译通过,并且两个样式都可以应用。我认为您还有另一组这些样式,或者 VS 存在缓存问题,请尝试清理并重新构建解决方案。 - sa_ddam213
感谢您的测试 - 我曾试图简化代码,但在进一步测试后发现与使用合并字典有关。代码已被编辑。 - Brent
1
尝试在TargetType之前声明x:key,以避免ResourceDictionary在意识到它具有x:Key之前检查TargetType是否存在。 - sa_ddam213
1
你真是个天才 - 谢谢 - 将 x:key 移到目标类型之前就解决了问题!! - 请添加答案,这样我就可以将你标记为已回答 - Brent
1个回答

6

Xaml 是从左到右解析的,所以我认为它会在意识到有 x:Key 标识之前先检查 ResourceDictionary 或其他 MergedDictionaries 中是否存在 TargetType(如果没有使用 x:Key,则默认标识符)。

尝试在 TargetType 之前设置 x:Key

这可能是 Xaml 解析器中的一个 bug,或者是故意设计的。也许值得在 Microsoft Connect 上进行调查。


真不敢相信!我花了两个小时来找出我的XAML文件有什么问题,最终发现了你的答案。非常感谢! - Mariusz Schimke
我之前使用了 x:Name 而不是 x:Key,这就是我的问题 =/ - JobaDiniz
天啊!我简直不敢相信这是问题所在。今晚我本来就没有太多时间,结果又浪费了几个小时!最糟糕的是,设计师完全没有问题,只有在运行时才会出现错误。此外,当样式直接放在<UserControl.Resources>中时,顺序并不重要,但当放在控件的嵌套字典中时,它开始失败了。在我的情况下,只是TargetType="Label"而已。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接