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

时间:2015-11-04 11:06:12

标签: windows-10 uwp

我再次与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抱怨&lt; Style.Resources&gt;是无效的。我不想在RadioButton的内容中单独设置TextBlock的样式。

1 个答案:

答案 0 :(得分:2)

在UWP(或一般XAML)中不支持的样式内级联。你通常做的是拆分可重复使用的样式/属性并引用它们。

<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>

您尝试实现的目标是改变&#39; 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>

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