AutoCAD .NET程序中WPF窗口静态资源加载失败的C#解决方案问询
解决AutoCAD .NET中WPF窗口静态资源加载失败的问题
我之前在开发AutoCAD .NET插件时也碰到过一模一样的问题——当把WPF窗口作为类库嵌入AutoCAD插件时,纯WPF里正常的静态资源加载会失效,原因很简单:AutoCAD作为宿主,不会像纯WPF应用那样自动处理资源字典的加载上下文,得我们手动指定资源的加载方式。
下面是两种靠谱的解决办法,你可以按需选择:
方法一:在AutoCAD命令中手动加载资源字典
修改你的Launch命令代码,在创建窗口实例前先把资源字典加载进去:
public class Class1 { public static WPFWindow.MainWindow mainWindow; [CommandMethod("Launch", CommandFlags.Session)] public void Launch() { // 1. 创建资源字典并指定正确的Pack URI var styleResources = new ResourceDictionary(); // 这里要注意替换成你实际的程序集名称和资源路径 styleResources.Source = new Uri( "pack://application:,,,/WPFWindow;component/Themes/Styles.xaml", UriKind.Absolute ); // 2. 初始化窗口并将资源字典添加到窗口的资源集合中 mainWindow = new WPFWindow.MainWindow(); mainWindow.Resources.MergedDictionaries.Add(styleResources); // 3. 显示窗口 Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow(mainWindow); } }
方法二:把资源加载逻辑内置到WPF窗口中
如果你不想每次调用窗口都写加载代码,可以把资源加载放到WPF窗口的构造函数里,这样创建实例时自动加载资源:
// 这是WPFWindow项目中MainWindow.xaml.cs的代码 public partial class MainWindow : Window { public MainWindow() { // 先加载资源字典 var styleResources = new ResourceDictionary(); styleResources.Source = new Uri( "pack://application:,,,/WPFWindow;component/Themes/Styles.xaml", UriKind.Absolute ); this.Resources.MergedDictionaries.Add(styleResources); // 再初始化组件 InitializeComponent(); } }
这样你的AutoCAD命令代码就可以回到最初的简洁版本,不用再处理资源加载了。
关键注意事项
- 确认你的资源文件(Styles.xaml)的生成操作设置为
Resource(右键文件→属性→生成操作,选Resource),不然Pack URI找不到文件。 - 检查Pack URI中的程序集名称(
WPFWindow)是否和你的WPF类库项目的程序集名称一致(右键WPF项目→属性→应用程序→程序集名称)。
为什么纯WPF应用里没问题?
在纯WPF应用中,App.xaml会自动负责资源字典的加载,应用域会默认识别Pack URI的上下文。但AutoCAD作为宿主,加载的是你的类库而非完整WPF应用,没有这个自动加载的流程,所以必须手动初始化资源上下文。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

