在 WPF 应用程序中加载具有相同样式的另一个控件时样式丢失

Style lost when another control with the same style loaded in WPF Application

在我的 WPF 应用程序中,我遇到了一个奇怪的行为,即按钮在 运行 时失去了样式。

当加载包含具有相同样式的按钮的另一个用户控件时,按钮放弃样式。

这里是App.xaml中的样式定义:

   <Style x:Key="SaveButton" TargetType="telerik:RadButton">
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Content">
            <Setter.Value>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="5" Text="Save"/>
                    <Image Source="Resources\icons\save.png" Margin="5" 
                    Height="16" Width="16"></Image>
                </StackPanel>
            </Setter.Value>
        </Setter>
    </Style>

带有 SaveButton 样式按钮的 window 已正确加载。但是从这个 window 当加载另一个用户控件携带一个具有相同样式的 SaveButton 的按钮时,用户控件按钮显示正确但 window 上的按钮变成完全空白(没有边距,没有图像,无文字)。

感谢您在这方面的任何帮助。

当您明确设置 ButtonContent 属性 时,其值只能应用一次。默认情况下,XAML 属性 x:Shared 设置为 true。这意味着任何给定的资源请求总是 returns 同一个实例。在您的情况下,这意味着每次应用 Style 时,都会应用相同的 ContentControl.Content 值。要忽略这一点,您有三个选择。

第一个选项是将 Style 标签上的 XAML 属性设置为 False:

<Style x:Shared=False ...></Style>

第二个选项是覆盖 ControlControlTemplate:

<Style ...>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="5" Text="Save"/>
                    <Image Source="Resources\icons\save.png" Margin="5" 
                    Height="16" Width="16"></Image>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

第三个选项是直接覆盖ContentControl.ContentTemplate

<Style ...">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="5" Text="Save"/>
                    <Image Source="Resources\icons\save.png" Margin="5" 
                    Height="16" Width="16"></Image>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>