如果给定x:Key,样式会产生不同的呈现结果

本文关键字:结果 Key 样式 如果 | 更新日期: 2023-09-27 18:10:45

如果给定x:Key,样式会产生不同的呈现结果

对于ToggleButtons,我有以下样式和ControlTemplate,它们按我想要的方式工作。

<Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}"/>
<ControlTemplate TargetType="RadioButton" x:Key="RadioTemplate">
    <RadioButton IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}">
        <RadioButton.Content>
            <Viewbox StretchDirection="DownOnly" Stretch="Uniform">
                <ContentControl Content="{TemplateBinding Content}"/>
            </Viewbox>
        </RadioButton.Content>
    </RadioButton>
</ControlTemplate>

然而,当我给Style一个x:Key, ControlTemplate中的RadioButton继承了如下所示的样式时,渲染结果与上面代码给出的结果不同。

<Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}" x:Key="RadioStyle"/>
<ControlTemplate TargetType="RadioButton" x:Key="RadioTemplate">
    <RadioButton Style="{StaticResource RadioStyle}"
                 IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}">
        <RadioButton.Content>
            <Viewbox StretchDirection="DownOnly" Stretch="Uniform">
                <ContentControl Content="{TemplateBinding Content}"/>
            </Viewbox>
        </RadioButton.Content>
    </RadioButton>
</ControlTemplate>

谁能告诉我为什么会这样?

如果给定x:Key,样式会产生不同的呈现结果

MSDN文档:

TargetType属性设置为RadioButton类型而不设置x:Key将隐式地将x:Key设置为{x:Type RadioButton }。这也意味着如果你给上面的Style一个x:Key值而不是{x:Type RadioButton},那么Style将不会自动应用到所有的RadioButton元素。相反,您需要将样式显式地应用于RadioButton元素,如"{StaticResource RadioStyle}"

指定一个键时需要使用该键。带有键的样式不会自动反映到切换按钮上。