C# 编程等效于在generic.xaml中设置默认样式

C# 编程等效于在generic.xaml中设置默认样式,c#,wpf,styles,C#,Wpf,Styles,我有一个自定义控件(即从System.Windows.control派生的类),我想为它设置默认样式。我知道通过创建themes/generic.xaml并在其中定义样式可以做到这一点。我以前也这样做过,效果不错 但是,因为样式非常简单(它只是一个虚拟矩形,允许快速模拟),所以我只想在代码中定义默认样式,这样我就可以使它接近类定义,并避免使用generic.xaml文件混乱。这就是我到目前为止所做的: static Trailer() { // just ther

我有一个自定义控件(即从System.Windows.control派生的类),我想为它设置默认样式。我知道通过创建themes/generic.xaml并在其中定义样式可以做到这一点。我以前也这样做过,效果不错

但是,因为样式非常简单(它只是一个虚拟矩形,允许快速模拟),所以我只想在代码中定义默认样式,这样我就可以使它接近类定义,并避免使用generic.xaml文件混乱。这就是我到目前为止所做的:

    static Trailer()
    {
        // just there to be able to test it alternatively with generic.xaml
        FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(Trailer), new FrameworkPropertyMetadata(typeof(Trailer)));

        // define the template with dummy geometry
        ControlTemplate DefaultTemplate = new ControlTemplate(typeof(Trailer));
        FrameworkElementFactory rectFact = new FrameworkElementFactory(typeof(Rectangle));
        rectFact.SetValue(Shape.FillProperty, new DynamicResourceExtension(SystemColors.ControlLightBrushKey));
        DefaultTemplate.VisualTree = rectFact;

        // define the style
        Style DefaultStyle = new Style {TargetType = typeof (Trailer)};
        Setter setter = new Setter();
        setter.Property = Control.TemplateProperty;
        setter.Value = DefaultTemplate;
        DefaultStyle.Setters.Add(setter);

        // register the style in application resources
        Application.Current.Resources.Add(typeof(Trailer), DefaultStyle);
    }
这在一个非常简单的测试应用程序中起作用,但在其他样式/模板的更复杂设置中,如果控件保持为空(默认控件样式),则会失败。我还没有弄清楚是什么导致了干扰,但我认为这是我没有用上面的代码设置控件的默认样式的证据


如果不是在应用程序资源中,为了获得与generic.xaml相同的行为,我必须在哪里设置我的风格?

在深入思考这个问题并总结了我(初学者)的依赖属性知识之后,我找到了一个简单的解决方案,我已经证明它是有效的。我只需要换一个

Application.Current.Resources.Add(typeof(Trailer), defaultStyle);

这只是更改DependencyProperty默认值的官方方法

我已经考虑过这个方向,但我的错误是我希望找到一个“DefaultStyleProperty”(对应于DefaultStylePropertyKey…),但我没有考虑为我的类更改StyleProperty默认值的更简单、更自然的可能性

我很高兴微软的设计再次被证明是非常合乎逻辑和精心设计的(阿门…)

附录:我已与WPF检查员检查了视觉树。无论我是提供generic.xaml还是使用上面的纯代码方法,它们都是相同的

作为一致性的另一个特性,我添加了

FrameworkElement.OverridesDefaultStyleProperty.OverrideMetadata(typeof(Trailer), 
    new FrameworkPropertyMetadata(true));

这可以防止从generic.xaml加载默认样式(如果它应该存在的话)。反正我是在为自己设定风格,这其实没什么区别。不过要小心,我不确定这是否会导致不必要的副作用。

在Themes/Generic.xaml中没有默认样式的代码隐藏替换。请参见,例如,了解一些背景信息。
FrameworkElement.OverridesDefaultStyleProperty.OverrideMetadata(typeof(Trailer), 
    new FrameworkPropertyMetadata(true));