5

感谢您帮助相对初学者理解 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 个以 Type RowDefinitionAND ALSO 为目标的样式元素ResourceDictionary嵌套在 a 中MergedDictionary(即使只有一个子ResourceDictionary要合并),则应用程序将失败,并显示 System.Windows.ResourceDictionary.DeferrableContent:已添加项目。

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

对于我如何克服这个问题的任何帮助将不胜感激。

4

1 回答 1

6

Xaml从左到右解析,所以我认为它在意识到它有一个标识符之前检查ResourceDictionaryMergedDictionaries如果没有使用 x:Key 的默认标识符)是否存在TargetTypex:Key

尝试x:KeyTargetType.

这可能是 Xaml 解析器中的错误,也可能是设计使然,可能值得在 Microsoft Connect 上查看

于 2013-10-17T03:57:02.307 回答