【问题标题】:Style lost when another control with the same style loaded in WPF Application在 WPF 应用程序中加载具有相同样式的另一个控件时样式丢失
【发布时间】:2019-06-09 08:54:34
【问题描述】:

在我的 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 按钮时,用户控件按钮显示正确,但窗口上的按钮变成完全空白(没有边距,没有图像,没有文本)。

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

【问题讨论】:

  • 尝试将PNG的构建动作设置为Resource
  • @BionicCode 构建操作已设置为资源。这不是问题,因为没有样式属性生效。而且,它完美地出现在初始控件中。
  • 抱歉,您是否尝试在Style 上设置x:Shared="False"?内容 (Image) 无法共享,因为它被明确指定为 Control 的内容。要在没有x:Shared="False" 的情况下执行此操作,请覆盖Button 的模板。
  • @BionicCode 我找不到这样的属性(只有 x:Key、x:Name、x:UID、x:FieldModifier 存在)。此外,根据您的建议,我完全从样式中删除了图像,但它仍然给我带来了同样的问题。
  • @BionicCode 感谢您的帮助。如果您发布答案而不是将其放在评论中,那就太好了。我会将其标记为答案。

标签: c# wpf telerik


【解决方案1】:

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

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

&lt;Style x:Shared=False ...&gt;&lt;/Style&gt;

第二个选项是覆盖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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多