【问题标题】:Why doesn't a WPF Theme show when MainWindow is called from another project?为什么从另一个项目调用 MainWindow 时 WPF 主题不显示?
【发布时间】:2015-03-07 11:51:03
【问题描述】:

我有一个包含三个项目的解决方案。一个是使用 CodedUI 进行测试,另一个是显示测试数据的 WPF 查看器应用程序,第三个是模型项目。

如果我将 WPF 项目设置为解决方案中的启动项目并在调试模式下运行它,则主题显示得很好。

如果我尝试从测试项目启动 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 来获取主题吗?

请指教...

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    如何启动 WPF 应用程序并确保主题正常工作!(鉴于上述情况)

            var app = new App();        
            app.InitializeComponent();
            app.Run();  
    

    App 是您在此处找到的 WPF 应用程序 ==> 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 文件并将它们视为它们实际存在于引用的位置。


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多