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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (26)

在我的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。但是在这个窗口中,当另一个用户控件加载了另一个具有相同样式的SaveButton的按钮时,用户控制按钮显示正常,但窗口上的按钮完全变为空白(没有边距,没有图像,没有文本)。

在这方面的任何帮助表示赞赏。

提问于
用户回答回答于

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

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

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

第二个选项是重写ControlTemplateControl

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

扫码关注云+社区

领取腾讯云代金券