在单独的项目中定义 WPF 资源时,如何避免 Visual Studio 设计器错误?
我在复合 WPF 应用程序中有三个项目:主应用程序、“基础设施”库和“模块”库。主应用程序通过它们的输出 DLL 引用其他项目(这些项目不一起位于单个解决方案中)。
我在“基础设施”库中定义了一个皮肤(ResourceDictionary
中的一些画笔和样式)。我希望主应用程序选择一个皮肤并使其可用于整个应用程序(通过 App.xaml 中的 MergedDictionaries
)。
在我的模块中,我想使用主应用程序加载的皮肤中定义的资源。如果我引用该资源,就好像它在本地可用一样:
Background={StaticResource MainBackgroundBrush}
几乎一切都按预期工作。异常(exception)情况是 Visual Studio 的设计者感到困惑并告诉我“找不到静态资源引用‘MainBackgroundBrush’”。这有效地阻止了我使用设计器。
如何定义“皮肤”
ResourceDictionary
在项目中,在主应用程序中引用该皮肤,然后在模块项目中使用其资源?
最佳答案
您可以创建自己的 ResourceDictionary 类,继承自 ResourceDictionary。
然后,您可以安排在设计时这个自定义 ResourceDictionary 加载一些明确定义的样式(即在运行时从应用程序加载的样式),而在运行时它什么都不做。
可以为此评估 IsInDesignMode-Property。
假设您有这样一个类,称为“DesignTimeResourceDictionary”,那么您只需使用 s.th。像
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<Util:DesignTimeResourceDictionary Source="SomeUriToYourResources"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
在设计时加载您的资源并使设计器工作。
在运行时,您可以让您的 DesignTimeResourceDictionary 跳过资源加载并实现所需的行为。
如果需要,您可以真正为此创建真实资源的副本,或者您可以创建一个虚拟字典,其中包含保持设计器工作所需的所有键。
关于wpf - 在单独的项目中定义 WPF 资源时避免 Visual Studio 设计器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1088762/