当从另一个项目调用MainWindow时,为什么不显示WPF主题?

时间:2015-03-07 00:53:27

标签: c# wpf xaml

我有三个项目的解决方案。一个是使用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才能获得主题?

请告知......

1 个答案:

答案 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>

主题本身位于具有以下构建属性的项目中:

enter image description here

bin目录中没有名为“Themes”的文件夹;相反,它是包含主题的obj文件夹;但是,它是.baml扩展名表示的文件的“编译”版本。

enter image description here

这意味着XAML文件的Page属性会对其进行编译。但它没有告诉我们的是这样的参考是如何充分的。

<ResourceDictionary Source="Themes/ExpressionDark.xaml">

今天我们知道,如果没有从我们引用主题(App.Xaml)的地方调用Application.LoadComponent,则不会显示主题。然后,LoadComponent知道如何解释.BAML文件并将它们视为它们实际存在于引用的位置中。