我遇到了一些问题,在不同的项目之间共享共同的风格。以下是我的项目:-
“通用”和“核心应用”位于同一解决方案中,而“插件”则属于自己的解决方案。
“核心应用程序”项目中的样式工作良好-它引用了“公共”项目,并在App.xaml中有以下内容:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Common;component/MyStyles.xaml" />
</ResourceDictionary.MergedDictionaries>在编辑“核心应用程序”项目中的XAML文件时,我获得了样式名称的intellisense,没有随意的下划线,而且在运行时一切都很好。
问题是与“插件”项目。我引用了“公共”程序集,并创建了一个\Themes\Generic.xaml文件,其中包含与上面相同的合并XAML。Generic.xaml的构建操作为"Page",我在AssemblyInfo.cs中添加了以下内容:
[assembly: ThemeInfo(ResourceDictionaryLocation.None,
ResourceDictionaryLocation.SourceAssembly)]当我在这个"Plugin“项目中编辑用户控件的XAML时,”公共“程序集中的样式不会出现在intellisense中,VS/Resharper在它们的名称下放置了一条粗糙的行。我甚至直接给Generic.xaml添加了一种样式,但UC也看不见。用户控件如下所示:-
<UserControl ..blah..>
<StackPanel>
<TextBlock Style="{StaticResource AStyleInCommonAssembly}" Text="Hello"/>
<TextBlock Style="{StaticResource AStyleInGenericXaml}" Text="World"/>
</StackPanel>
</UserControl>在运行时,WPF确实正确地应用了驻留在“公共”程序集中的样式(我猜由于App.xaml中的字典合并,它正在找到它们)。但是,它仍然无法找到我直接添加到Generic.xaml中的样式。
我遗漏了什么?这种方法只适用于自定义控件,而不是我所处理的用户控件吗?我的首要任务是让事情在运行时工作,但获得设计时/智能感知的体验将是一个额外的好处。
发布于 2014-02-12 15:56:19
解决了。使用generic.xaml的技术似乎只适用于自定义控件,而不适用于用户控件。用户控件无法访问generic.xaml中定义的样式(直接或与另一个程序集合并)。
在意识到这一点之后,我回到了在用户控件本身内合并外部程序集资源字典的问题,即:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Common;component/MyStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>在每个UC中做这个并不理想,但我可以在我的场景中接受它,因为在这些“插件”项目中,我只会有一两个插件。
然而,在这样做的过程中,我发现了另一个问题,下面的内容可能会对未来的人有所帮助。我的“公共”程序集中的MyStyles.xaml文件不包含自己的样式-它只是合并了该程序集中的许多其他资源字典。这样做是为了方便,这意味着消费者只需要在MyStyles.xaml中进行合并,而不是该程序集中的十几个单独的XAML。
结果发现,WPF中存在一个错误,其中“嵌套”合并字典的解析不正确。我发现,如果我将样式直接放在MyStyles.xaml中,用户控件就会找到它。然而,它拒绝承认MyStyles.xaml合并的词典中的任何一种样式!我现在已经放弃了MyStyles.xaml,回到了合并单个字典中(在用户控制XAML中)--一切都在设计时和运行时工作。
发布于 2020-07-18 12:40:35
您还可以定义一个UserControlBase,从中派生所有UC,然后将其中的所有样式合并。
https://stackoverflow.com/questions/21730441
复制相似问题