我有三个项目的解决方案。一个是使用CodedUI进行测试,另一个是显示测试数据的WPF Viewer应用程序,第三个是Models的项目。
如果我将WPF项目设置为解决方案中的启动项目并在调试模式下运行,则主题显示正常。
如果我尝试从Test Project启动WPF MainWindow,一切都显示相同,没有主题。当测试项目想要显示数据时,它通过在WPF项目中向此方法触发事件来实现。
public static class Start
{
public static EventHandler<List<SomeData>> NewData = ShowData;
private static void ShowData(object sender, List<SomeData> e)
{
MainWindow.NewData(sender, e);
var mw = new MainWindow();
mw.ShowDialog();
}
}
我已经单步执行此代码,数据到达,主窗口即将发布。但为什么上面的代码不包含主题?
输出窗口中没有加载错误。
App.XAML是主题的引用所在。但它也是StartupURI所在的MainWindow.XAML。我是否需要以某种方式启动App.XAML才能获得主题?
请告知......
答案 0 :(得分:0)
如何启动WPF应用程序并确保主题正常工作!(鉴于上述情况)
var app = new App();
app.InitializeComponent();
app.Run();
其中App是您在此处找到的WPF应用程序==&gt; App.xaml / App.cs和App.gs.i.cs. InitializeComponent调用是关键。在gs文件中,这一行是神奇的。
System.Windows.Application.LoadComponent(this, resourceLocater);
注意“this”关键字。它是对App类本身的引用,它在XAML中具有这些“引用/属性/资源”
<Application x:Class="AuomatedTest.Viewers.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes/ExpressionDark.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
主题本身位于具有以下构建属性的项目中:
bin目录中没有名为“Themes”的文件夹;相反,它是包含主题的obj文件夹;但是,它是.baml扩展名表示的文件的“编译”版本。
这意味着XAML文件的Page属性会对其进行编译。但它没有告诉我们的是这样的参考是如何充分的。
<ResourceDictionary Source="Themes/ExpressionDark.xaml">
今天我们知道,如果没有从我们引用主题(App.Xaml)的地方调用Application.LoadComponent,则不会显示主题。然后,LoadComponent知道如何解释.BAML文件并将它们视为它们实际存在于引用的位置中。