【发布时间】:2013-10-17 00:59:47
【问题描述】:
感谢您帮助相对初学者理解 WPF 的想法。
我正在尝试在 WPF 应用程序的 XAML 文件中使用以下样式模板:
<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 个样式元素针对类型 RowDefinition 并且 ResourceDictionary 嵌套在 MergedDictionary 中(即使只有一个子 ResourceDictionary 要合并)应用程序将失败
System.Windows.ResourceDictionary.DeferrableContent: 项目已添加。
也就是说,尽管这两种样式具有不同的键,但资源字典会尝试添加一个名称完全基于目标类型的字典项(并忽略键)。
任何关于我如何克服这个问题的帮助将不胜感激。
【问题讨论】:
-
您的应用程序中可以有多个
RowDefinition样式,只要它们有一个唯一的键,我只是将您上面的两种样式复制到 ResourceDictionary 中,它编译得很好,两种样式都可以应用,我认为您在某处有另一组这些样式,或者 VS 存在缓存问题,请尝试清理并重建解决方案 -
感谢您的测试 - 我曾尝试简化代码,但在进一步测试后发现它与使用合并字典有关。代码已编辑
-
尝试在
TargetType之前声明x:key以避免ResourceDictionary在意识到TargetType存在之前检查它是否存在x:Key -
你是个天才 - 谢谢 - 在目标类型起作用之前移动 x:key! - 请添加答案,以便我将您标记为已回答