如何在通用 Windows 平台应用程序中级联样式?

How do I cascade Styles in a Universal Windows Platform app?

我又一次与 UWP 作斗争。看来我无法在样式中级联样式。这是 UWP 中不允许的其他内容吗?

这就是我想要做的...

        <Style x:Key="MainMenuRadioButtonStyle" TargetType="RadioButton">
            <Setter Property="Backgroud" Value="Grey"/>
            <Style.Resources TargetType="TextBlock">
                <Setter Property="Margin" Value="12,0,0,0"/>
            </Style.Resources>
        </Style>

但是,VS2015 抱怨 无效。我不想在我的 RadioButton 内容中单独设置 TextBlock 的样式。

UWP 不支持样式内的层叠(或 XAML 通常)。你通常做的是拆分可重复使用的 styles/properties 并引用它们。

<Thickness x:Key="MyMargin">"12,0,0,0"</Thickness>

<Style x:Key="MainMenuRadioButtonStyle" TargetType="RadioButton">
    <Setter Property="Background" Value="Grey"/>
    <Setter Property="Margin" Value="{StaticResource MyMargin}" />
</Style>

您尝试实现的是 'alter' RadioButton 的模板。您可以在此处找到完整的模板:https://msdn.microsoft.com/en-us/library/windows/apps/mt299147.aspx。如果深入研究模板,您会看到这段代码:

<ContentPresenter x:Name="ContentPresenter"
        Content="{TemplateBinding Content}"
        ContentTransitions="{TemplateBinding ContentTransitions}"
        ContentTemplate="{TemplateBinding ContentTemplate}"
        Margin="{TemplateBinding Padding}"
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
        Grid.Column="1"
        AutomationProperties.AccessibilityView="Raw"
        TextWrapping="Wrap" />

这是显示 RadioButton 实际内容的部分,如您所见,它不是 TextBlock,而是 ContentPresenter(它将显示文本,就好像是 TextBlock)。好消息是这个控件有一个 Margin 属性,它从模板中获取 Padding 属性 的值。所以要实现你想要的,你可以简单地填写这个 属性:

<Style x:Key="MainMenuRadioButtonStyle" TargetType="RadioButton">
    <Setter Property="Background" Value="Grey"/>
    <Setter Property="Padding" Value="{StaticResource MyMargin}" />
</Style>

如果您想更改默认模板中不可用的属性,则必须创建自己的模板。