【问题标题】:How to remove App.xaml ResourceDictionary at startup?如何在启动时删除 App.xaml ResourceDictionary?
【发布时间】:2018-07-19 11:00:18
【问题描述】:

我在App.xaml 文件中声明了一个ResourceDictionary,如下所示:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Skins/DefaultSkin.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

问题是,当我尝试在启动时加载不同的皮肤时(使用App.xaml.cs 构造函数加载最后使用的ResourceDictionary 皮肤)我发现Application.Resources 中设置的ResourceDictionary 覆盖了这个并恢复到 DefaultSkin.xaml 文件 - 即使我在选择所需的皮肤之前使用 Application.Current.Resources.MergedDictionaries.Clear();

当我从 Application.Resources 中删除 ResourceDictionary 时,我的应用程序运行良好 - 但是所有 xaml 引用在设计时都丢失了。如何在设计时保留此参考,但在运行时将其删除,然后它才能覆盖我的皮肤选择?

【问题讨论】:

  • 可能在启动时加载不同的皮肤,而不是在 ctor 中,而是在 Startup 事件处理程序中?
  • 谢谢,但是如何创建Startup 事件处理程序?

标签: c# wpf resourcedictionary skinning


【解决方案1】:

覆盖App.xaml.cs中的OnStartup方法:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        Resources.MergedDictionaries.Clear();
        //...
    }
}

如果你想在构造函数中清除MergedDictionaries,你应该在调用InitializeComponent()之后再做:

public App()
{
    InitializeComponent();
    Resources.MergedDictionaries.Clear();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多