【发布时间】:2016-10-07 04:16:07
【问题描述】:
我将应用程序的资源保存在单独的 DLL 中,并在我的主 EXE 中使用 App.xaml 中的类似内容引用它们:-
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MyThemesAssembly;component/Themes/Generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
当我编辑主 EXE 项目中的窗口时,VS2010 设计器无法识别来自其他程序集的任何资源,因此我看不到应用了任何样式(这不是真正的问题,因为我总是在 XAML 中工作看法)。但是,Resharper 也无法识别这些外部资源名称,导致在我编辑 XAML 时资源名称下出现大量曲线。
我发现我可以通过在每个窗口和用户控件中包含上述 XAML 来修复 VS 设计器和 Resharper,但这会对内存和/或性能产生不利影响吗?每个窗口都会获得一份单独的资源副本吗?
【问题讨论】:
-
嗯,IDE 和工具中的错误不应该影响您的代码。此外,在每个控件中包含资源字典是一种容易出错的方式(如果您决定重命名字典怎么办?添加另一个?)。
-
我会尝试在设计模式下添加一个解决问题的怪癖。 (也许这会有所帮助:
public class MyUserControlBase : UserControl { public MyUserControlBase() { if (DesignerProperties.GetIsInDesignMode(this)) LoadExternalDictionariesExplicitlyHere(); ...) -
@Vlad 我已经学会了忍受这些曲线——这种修复 Resharper 的方法真的只是“很高兴拥有”。我不认为重命名/添加资源会成为问题 - 在我上面的 XAML 示例中,“Generic.xaml”本身只是合并了该程序集中的其他资源负载,因此添加新资源很容易。我更担心在每个窗口中包含
是否会破坏应用程序(或 VS2010)的内存/性能。 -
性能不应该是你关心的问题,除非它真的打动你。 (省略了有关过早优化的必要引用。)但是,一个简单的解决方法(例如每个控件的构造函数中的
Helpers.LoadDictionariesIfInDesignMode(this))似乎是针对 XAML 中的多行代码的单行代码:) -
@ControlFlow,我在其他地方看到过这个提示,但它对我不起作用。 MyThemesAssembly 是什么类型的项目(它是一个类库)或 xaml 资源的构建操作(“页面”)会有所不同吗?