基本窗口的WPF样式未在App.xaml中应用,但在Themes / Generic.xaml中

我正在为我的大多数窗口创建一个基本窗口类。 显然,对此最好的解决方案是单独的类,以及适用于它的样式。

问题是我在App.Resources没有应用我的 。 也就是说,如果它在外部ResourceDictionary定义,并合并到App.xaml的资源或本地字典中并合并,或者内联到App.Resources 。 但是, 在放入Themes/Generic.xaml

除了覆盖DefaultStyleKeyProperty之外,在基本窗口中根本不做任何特殊操作就可以certificate这个问题。

下面是ThemeWindow

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

这是非常简单的我试图应用(它使Window背景变红,仅此而已):

                 

使用ThemeWindowMainWindow只是以下XAML:

   

现在,如上所述,如果您将该Style放在其自己的ResourceDictionary ,并将其包含如下:

        

.. 这是行不通的。 如果你直接将样式内嵌到App.Resources ,它就不起作用。

我能找到的唯一情况是调用ResourceDictionary xaml Generic.xaml ,并将其放入应用程序的Themes/目录中。

我想知道为什么会发生这种情况。

我唯一的理论是,当WPF看到一个控件类型时,它将转到Themes ,并扫描所有ResourceDictionary的类型,然后回退到Generic.xaml并加载它。 这并不能解释为什么如果在合并的ResourceDictionary可用,它将不会加载。 请注意 ,如果将MergedDictionary放入MergedDictionary ,它会起作用,原因很明显。

我完全可以将ResourceDictionary合并到Generic.xaml如果这是我必须做的事情。 我只想了解技术细节,了解为什么需要这样。

这个不工作/工作的屏幕截图: 破碎的图像工作形象

我有一个简单的解决方法,允许您在app.xaml中设置样式。

在app.xaml中定义你的风格,如下所示:

  

并将你的TheWindow改为:

 public class ThemeWindow : Window { static ThemeWindow() { StyleProperty.OverrideMetadata(typeof(ThemeWindow), new FrameworkPropertyMetadata(GetDefautlStyle())); } private static Style GetDefautlStyle() { if (defaultStyle == null) { defaultStyle = Application.Current.FindResource(typeof(ThemeWindow)) as Style; } return defaultStyle; } private static Style defaultStyle = null; } 

它并没有真正解决问题,但这可以让你实现你所需要的!

编辑:看看DefaultStyleKey引用,它清楚地表明它用于主题样式查找 。 这就解释了为什么它不会在app.xaml或任何其他字典中找到它。 它只会搜索主题词典。 因此,您必须在主题词典中定义样式,或者直接使用Style属性,如上例所示。

我讨论了stackoverflow中已经讨论过的以下解决方案。 它应该在加载应用程序时添加加载组件。

参考解决方案