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在项目中定义"外观" ,在主应用程序中引用该外观,然后在模块项目中使用其资源?
您可以创建自己的 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 跳过资源加载并实现所需的行为。
如果需要,您实际上可以为此创建真实资源的副本,或者您可以创建一个虚拟字典,其中包含保持设计器工作所需的所有键。
一种可能的解决方案是使用DynamicResource而不是StaticResource. Visual Studio 2008 设计器仅显示控件,没有任何样式,就像 VS2010 beta 1 在无法解析StaticResource.
DynamicResource在特定样式可能在运行时发生变化的情况下使用是合适的,例如换肤时。
我发现一些相关问题支持这一点:
\n\n\n\n我还发现有人指出DynamicResource只要资源不是本地的就应该使用: