基本窗口的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
背景变红,仅此而已):
使用ThemeWindow
的MainWindow
只是以下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中已经讨论过的以下解决方案。 它应该在加载应用程序时添加加载组件。
参考解决方案