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

M. *_*ley 33 wpf xaml skinning pack-uri visual-studio-2008

在单独的项目中定义WPF资源时,如何避免Visual Studio设计器错误?

我在复合WPF应用程序中有三个项目:主应用程序,"基础结构"库和"模块"库.主应用程序通过其输出DLL引用其他项目(项目不在一起的单个解决方案中).

ResourceDictionary在"基础设施"库中定义了一个皮肤(一些画笔和样式).我希望主应用程序选择一个皮肤并使其可用于整个应用程序(通过MergedDictionariesApp.xaml).

在我的模块中,我想使用主应用程序加载的外观中定义的资源.如果我将资源引用为本地可用,就像这样:

Background={StaticResource MainBackgroundBrush}
Run Code Online (Sandbox Code Playgroud)

几乎一切都按预期工作.唯一的例外是Visual Studio的设计者感到困惑,并告诉我"未找到"StaticResource引用'MainBackgroundBrush'".这有效地阻止了我使用设计器.

如何ResourceDictionary在项目中定义"外观" ,在主应用程序中引用该外观,然后在模块项目中使用其资源?

Sim*_* D. 5

您可以创建自己的 ResourceDictionary 类,继承自 ResourceDictionary。然后,您可以安排在设计时此自定义 ResourceDictionary 加载一些显式定义的样式(即在运行时从应用程序加载的样式),而在运行时它什么都不做。可以为此评估 IsInDesignMode-Property。

假设您有这样一个类,名为“DesignTimeResourceDictionary”,那么您只需使用 s.th. 喜欢

 <UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <Util:DesignTimeResourceDictionary Source="SomeUriToYourResources"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
 </UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

在设计时加载您的资源并使设计器工作。在运行时,您可以使 DesignTimeResourceDictionary 跳过资源加载并实现所需的行为。

如果需要,您实际上可以为此创建真实资源的副本,或者您可以创建一个虚拟字典,其中包含保持设计器工作所需的所有键。


M. *_*ley 3

一种可能的解决方案是使用DynamicResource而不是StaticResource. Visual Studio 2008 设计器仅显示控件,没有任何样式,就像 VS2010 beta 1 在无法解析StaticResource.

\n\n

DynamicResource在特定样式可能在运行时发生变化的情况下使用是合适的,例如换肤时。

\n\n

我发现一些相关问题支持这一点:

\n\n\n\n

我还发现有人指出DynamicResource只要资源不是本地的就应该使用:

\n\n\n