wpf - 在单独的项目中定义 WPF 资源时避免 Visual Studio 设计器错误

标签 wpf visual-studio-2008 xaml skinning pack-uri

在单独的项目中定义 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/

相关文章:

c# - Visual Studio 无可用源

visual-studio-2008 - 每次我进行更改时如何告诉visual studio重建?

c# - WPF- TextBlock 中的 "LineSpacing"

c++ - 1>链接 : fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_36.lib'

c++ - 我仍然不相信在对象不是 `destructor` 的情况下调用 `constructed`

WPF数据网格交替行着色

c# - 如何更新 StackPanel 的布局?

wpf - 像 VLC 一样的音量 slider

c# - 打开和关闭绑定(bind)

c# - 依赖注入(inject)和接口(interface)的许多实现