You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行时修改共享DLL资源字典中定义的WPF资源

问题根因

  1. WPF 资源查找优先级为 控件资源 > 窗口资源 > 应用程序资源 > 系统资源,你在 MainWindow.xaml 中再次合并了共享项目的资源字典,窗口级的资源优先级高于应用级,所以 App 中修改的资源会被窗口的资源覆盖。
  2. 你在两个位置分别合并同一个 Uri 的资源字典时,默认会生成两个独立的资源字典实例,你修改 App 中合并的实例,不会同步到 MainWindow 中加载的实例,这也是之前两种修改方式不生效的核心原因。
  3. 你注释掉了 base.OnStartup(e) 调用,会影响应用资源初始化逻辑的正常触发。

解决方案

方案1(推荐):移除窗口层面重复合并的资源字典

你已经在 App.xaml 全局合并了共享资源,所有窗口都可以直接访问,不需要在 MainWindow 里重复合并,修改 MainWindow.xaml 删掉冗余的资源合并逻辑:

<Window x:Class="MyProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
    <TextBlock Foreground="{DynamicResource FooColorBrush}" Text="Hello world" />
</Window>

然后修改 App.xaml.cs 代码,直接在应用根资源添加同名颜色覆盖即可,WPF 会优先使用根资源里的配置,优先级高于合并字典的资源:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e); // 恢复初始化调用
        this.Resources["FooColor"] = Color.FromArgb(255, 255, 255, 0);
    }
}

方案2:保留窗口资源合并的处理方式

如果业务需要必须在窗口层面合并共享资源,直接修改窗口级的资源即可:

// MainWindow.xaml.cs 中添加Loaded事件处理
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    this.Resources["FooColor"] = Color.FromArgb(255, 255, 255, 0);
}

内容的提问来源于stack exchange,提问作者Vg0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:18:03