【问题标题】:WPF XAML - Adding multiple styles to resource dictionary which target rowdefinitionWPF XAML - 向以行定义为目标的资源字典添加多种样式
【发布时间】: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! - 请添加答案,以便我将您标记为已回答

标签: wpf resourcedictionary


【解决方案1】:

Xaml 是从左到右解析的,所以我认为它检查 ResourceDictionary 或另一个 MergedDictionaries 如果 TargetType (如果没有使用 x:Key 的默认标识符)在它意识到它有一个 @ 之前存在987654325@标识符

尝试在TargetType 之前设置x:Key

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

【讨论】:

  • 难以置信!我花了两个小时试图找出我的 XAML 出了什么问题,最终找到了你的答案。谢谢!
  • 我使用的是x:Name 而不是x:Key,这是我的问题=/
  • Holy $%@!,我不敢相信这实际上是问题所在。今晚我失去了几个小时,当我真的买不起的时候,太!令人费解的部分是设计师工作得很好,它在 runtime 它为我而死。此外,当样式直接在&lt;UserControl.Resources&gt; 中时,顺序并不重要,但是当放在控件中的嵌套字典中时,它开始失败。就我而言,它只是TargetType="Label"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
相关资源
最近更新 更多