【问题标题】:Setting implicit style of custom control in WPF在 WPF 中设置自定义控件的隐式样式
【发布时间】:2017-09-28 18:12:33
【问题描述】:

我的自定义控件的默认样式在 Generic.xaml 中定义并且工作正常。

但是,当我尝试以与使用内置控件相同的方式更改自定义控件的样式时,没有任何反应。在 App.xaml 中,我尝试通过执行以下操作来更改控件的默认样式:

<Style TargetType="{x:Type my:CustomControl}">
  <Setter Property="Background" Value="Red"/>
</Style>

如果我设置上述样式的 x:key 属性并使用此键引用此样式,则一切正常。

上述样式方法仅适用于内置控件而不适用于自定义控件是否正确,或者我只是做错了什么?是否有可行的解决方案来实现自定义控件的这种样式?

更新 在这种情况下,我的自定义控件派生自 System.Windows.Window。

【问题讨论】:

  • 您是在静态构造函数中设置 DefaultStyleKeyProperty.OverrideMetadata 还是在做一些解决方法?
  • “上面的样式方法只对内置控件有效,对自定义控件无效……对吗?”不,那不是真的。你可能在声明你的控制权时做错了什么。你也应该证明这一点。
  • 继 Clemens cmets 之后,我尝试在一个新项目中复制我的案例。创建从 TextBox 继承的自定义控件时,隐式样式可以正常工作。但是,当使用完全相同的设置并且只是将控件更改为从 Window 继承(这是我最初的问题)时,隐式样式不起作用。当使用 Window 作为基类而不是其他控件时,隐式样式是否存在一些问题?

标签: wpf xaml styles custom-controls


【解决方案1】:

我终于设法让我的自定义控件工作的隐式样式。显然,隐式样式可能不适用于派生控件,因为样式不会自动应用于控件。为了实现这一点,必须手动设置资源引用。我的自定义控件现在看起来像这样:

public class CustomControl : Window
{
    static CustomControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));
    }

    public CustomControl()
    {
        SetResourceReference(StyleProperty, typeof(CustomControl));
    }
}

【讨论】:

    【解决方案2】:

    是的,你是对的。 Generic.xaml 用于自定义控件,App.xaml 用于应用程序范围的资源(包括内置控件的样式)。在App.xaml 中为自定义控件指定TargetType 将不起作用。所以使用显式样式(使用x:Key)似乎是最简单的解决方案。

    【讨论】:

    • 这是完全错误的。您当然可以在 Generic.xaml 中拥有一个默认控件样式(通常在控件库程序集中),并在 App.xaml 中拥有另一个默认样式。后者将自动基于前者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多