WPF XAML - 将多个样式添加到目标rowdefinition的资源字典中

时间:2013-10-17 00:59:47

标签: wpf resourcedictionary

感谢您帮助相对初学者理解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}" />
        ...

但是,如果有多个样式元素目标,则类型为RowDefinition,并且另外,ResourceDictionary嵌套在MergedDictionary中(即使只有一个子ResourceDictionary要合并),应用程序也会失败

System.Windows.ResourceDictionary.DeferrableContent: 项目已添加

也就是说,尽管2个样式具有不同的键,但资源字典试图添加一个字典项,其名称完全基于目标类型(并忽略键)。

对我如何克服这一点的任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:5)

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

之前存在

尝试在x:Key之前设置TargetType

这可能是Xaml解析器中的一个错误,也可能是设计错误,可能值得一看Microsoft Connect