样式继承 - 如何完善自定义默认样式?

5
在 WinRT/UWP 应用中(该问题在两个平台上都出现),我可以定义一个样式,适用于某个控件的所有实例,通过省略 x:Key 属性来实现,例如:
<Style TargetType="Button">
    <Setter Property="Width" Value="400"/>
</Style>

现在,除了默认样式之外,我想对一些按钮应用特定属性:
<Style TargetType="Button" x:Key="TallButtonStyle" BasedOn="...">
    <Setter Property="Height" Value="100"/>
</Style>

问题在于:作为“BasedOn”属性填写什么,以便该样式继承上面定义的默认样式?
在WPF中,我可以执行以下操作:
<Style TargetType="Button" x:Key="..." BasedOn="{StaticResource  {x:Type Button}}">

然而,在WinRT / UWP上不支持x:Type。正如此答案所建议的那样,我需要为默认样式指定一个x:Key,以便能够从中继承:

<Style TargetType="Button" x:Key="WideButtonStyle">
    <Setter Property="Width" Value="400"/>
</Style>
<Style TargetType="Button" x:Key="TallButtonStyle" BasedOn="{StaticResource Button}">
    <Setter Property="Height" Value="100"/>
</Style>

然而,在这种情况下,WideButtonStyle 不再作为默认样式使用,我需要手动将 Style="{StaticResource WideButtonStyle}" 应用于所有按钮,这看起来是不必要的开销。
有没有办法实现以下两种方式之一:
  1. 将样式的 BasedOn 属性设置为指向相应控件的默认样式,或
  2. 设置包含 x:Key 属性的样式,以便作为给定类型的所有控件的标准样式使用?
顺便说一句,此相关主题 无法回答我的问题,因为它展示了如何覆盖 WinRT / UWP 平台中定义的默认样式,而不是自定义的默认样式。
1个回答

2

您可以为默认样式设置一个x:Key,然后基于此样式创建一个不带x:Key的空样式。这个样式将应用于控件的所有实例,但基本上是对第一个样式的“引用”。然后,您可以基于第一个具有x:Key的样式创建其他附加样式。这并不是一种优雅的解决方案,但我认为您无法做得更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接