首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WPF用户控件库中指定样式

在WPF用户控件库中指定样式
EN

Stack Overflow用户
提问于 2014-02-12 14:16:29
回答 2查看 3K关注 0票数 2

我遇到了一些问题,在不同的项目之间共享共同的风格。以下是我的项目:-

  • “公共”-包含常见WPF样式的类库。
  • "Plugin“-包含用户控件(而不是自定义控件)的类库。
  • "Core app“-核心WPF应用程序,它显示在”插件“中定义的用户控件。

“通用”和“核心应用”位于同一解决方案中,而“插件”则属于自己的解决方案。

“核心应用程序”项目中的样式工作良好-它引用了“公共”项目,并在App.xaml中有以下内容:

代码语言:javascript
复制
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Common;component/MyStyles.xaml" />
</ResourceDictionary.MergedDictionaries>

在编辑“核心应用程序”项目中的XAML文件时,我获得了样式名称的intellisense,没有随意的下划线,而且在运行时一切都很好。

问题是与“插件”项目。我引用了“公共”程序集,并创建了一个\Themes\Generic.xaml文件,其中包含与上面相同的合并XAML。Generic.xaml的构建操作为"Page",我在AssemblyInfo.cs中添加了以下内容:

代码语言:javascript
复制
[assembly: ThemeInfo(ResourceDictionaryLocation.None, 
                     ResourceDictionaryLocation.SourceAssembly)]

当我在这个"Plugin“项目中编辑用户控件的XAML时,”公共“程序集中的样式不会出现在intellisense中,VS/Resharper在它们的名称下放置了一条粗糙的行。我甚至直接给Generic.xaml添加了一种样式,但UC也看不见。用户控件如下所示:-

代码语言:javascript
复制
<UserControl ..blah..>
    <StackPanel>
        <TextBlock Style="{StaticResource AStyleInCommonAssembly}" Text="Hello"/>
        <TextBlock Style="{StaticResource AStyleInGenericXaml}" Text="World"/>
    </StackPanel>
</UserControl>

在运行时,WPF确实正确地应用了驻留在“公共”程序集中的样式(我猜由于App.xaml中的字典合并,它正在找到它们)。但是,它仍然无法找到我直接添加到Generic.xaml中的样式。

我遗漏了什么?这种方法只适用于自定义控件,而不是我所处理的用户控件吗?我的首要任务是让事情在运行时工作,但获得设计时/智能感知的体验将是一个额外的好处。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-12 15:56:19

解决了。使用generic.xaml的技术似乎只适用于自定义控件,而不适用于用户控件。用户控件无法访问generic.xaml中定义的样式(直接或与另一个程序集合并)。

在意识到这一点之后,我回到了在用户控件本身内合并外部程序集资源字典的问题,即:

代码语言:javascript
复制
<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中)--一切都在设计时和运行时工作。

票数 8
EN

Stack Overflow用户

发布于 2020-07-18 12:40:35

您还可以定义一个UserControlBase,从中派生所有UC,然后将其中的所有样式合并。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21730441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档