【问题标题】:Precedence of multiple styles for the same target type?同一目标类型的多个样式的优先级?
【发布时间】:2014-12-12 08:59:53
【问题描述】:

如果有多个这样的样式:

<Style TargetType="{x:Type local:MyControl}">
...

从针对相同类型控件的资源字典中合并而来,应该具有优先级,是遇到的第一个样式还是最后一个?

我在哪里可以找到管理这些事情的规则?

【问题讨论】:

  • 您不能将它们合并到一个字典中,因为它们具有相同的键。
  • @Hamlet 即使我没有 x:name 样式?
  • @Chanakya:ResourceDictionaries 中的元素有键,而不是名称。在下面阅读我的答案,它解释了为什么这是不可能的。 (有一个隐式密钥)。如果您考虑一下,.NET 将如何知道要使用这两种样式中的哪一种?想象一下,除了一个红色和另一个蓝色之外,它们是相同的。

标签: wpf xaml styles


【解决方案1】:

样式从最接近相关控件的 ResourceDictionary 应用。一个例子:

 <Window>
    <Window.Resource>
        <Style 1/>
    <Window.Resources>
    <Grid>
        <Grid.Resources>
            <Style 2/>
        </Grid.Resources>
        <TextBox/>
    </Grid>
</Window>

在上面的示例中,样式 2 将应用于 TextBox。如果您希望级联样式(将两种样式都应用到 TextBox),您可以使用 BasedOn="{StaticResource {x:Type TextBox}}" 将 Style2 上的 BasedOn 设置为指向 Style1。请检查语法,我这里没有VS。

如您所见,类型变为Key。由于不允许在单个ResourceDictionary 中包含具有相同键的两个元素,因此您不能合并具有重叠样式的两个 ResourceDictionaries。应该可以围绕这样的要求进行设计,记住 ResourceDictionary 可以引用另一个用途。同样,您使用BasedOn

【讨论】:

  • 谢谢,这回答了我关于规则的原始观点,虽然我不能同时接受这两个答案,但哈姆雷特的回答确实有助于理解何时在同一个资源字典中以及关于键的观点。
  • 语法检查。我没有意识到您可以使用 BasedOn 而不通过键引用样式。非常有用。
【解决方案2】:

这是您的评论和问题的答案。 Name, x:Name 在这种情况下不会在现场播放。字典中的每个资源都必须有Key。对于目标样式,WPF 基础结构会生成 Key,因此,具有相同目标类型的样式将具有相同的键,因此您不能为字典中的每种类型使用多个目标样式。

【讨论】:

    【解决方案3】:

    它会抛出一个异常。这是我试图测试的:

    我写了一个简单的ResourceDictionary,有两种样式,TargetType 相同,但没有x:Key(不是x:Name)。

    <Style TargetType="TextBox">
        <Setter Property="Height" Value="100"/>
    </Style>
    
    <Style TargetType="TextBox">
        <Setter Property="Height" Value="200"/>
    </Style>
    

    重建项目并成功编译。现在哪个会被应用?

    好吧,当我运行它时,它在加载样式时抛出了一个很大的异常。所以简而言之,它不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      相关资源
      最近更新 更多