【问题标题】:Specifying styles in a WPF user control library在 WPF 用户控件库中指定样式
【发布时间】:2014-03-10 22:14:17
【问题描述】:

我在不同项目之间共享通用样式时遇到了一些问题。这是我的项目:-

  • “Common” - 一个包含常见 WPF 样式的类库。
  • “插件”- 包含用户控件(不是自定义控件)的类库。
  • “核心应用程序”- 核心 WPF 应用程序,显示“插件”中定义的用户控件。

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

“核心应用”项目中的样式工作正常 - 它引用“通用”项目并在 App.xaml 中有以下内容:-

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Common;component/MyStyles.xaml" />
</ResourceDictionary.MergedDictionaries>

在“核心应用”项目中编辑 XAML 文件时,我在样式名称上得到了智能感知,没有波浪下划线,并且在运行时一切正常。

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

[assembly: ThemeInfo(ResourceDictionaryLocation.None, 
                     ResourceDictionaryLocation.SourceAssembly)]

当我在此“插件”项目中编辑用户控件的 XAML 时,“通用”程序集中的样式不会显示在智能感知中,并且 VS/Resharper 在其名称下放置了一条波浪线。我什至直接在 Generic.xaml 中添加了一个样式,但 UC 也看不到。用户控件看起来像这样:-

<UserControl ..blah..>
    <StackPanel>
        <TextBlock Style="{StaticResource AStyleInCommonAssembly}" Text="Hello"/>
        <TextBlock Style="{StaticResource AStyleInGenericXaml}" Text="World"/>
    </StackPanel>
</UserControl>

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

我错过了什么?这种方法是否仅适用于自定义控件,而不适用于我正在处理的 用户控件?我的首要任务是让事情在运行时工作,但获得设计时/智能感知体验将是一个奖励。

【问题讨论】:

    标签: wpf


    【解决方案1】:

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

    意识到这一点后,我只是回到将外部程序集资源字典合并到用户控件本身中,即:

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/Common;component/MyStyles.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    

    在每个 UC 中都这样做并不理想,但我可以在我的场景中接受它,因为我在这些“插件”项目中只有一两个。

    不过,在这样做的过程中,我确实发现了另一个问题,以下内容可能会在将来对某人有所帮助。我的“Common”程序集中的MyStyles.xaml 文件不包含它自己的样式——它只是合并了该程序集中的许多其他资源字典。这样做是为了方便,这意味着使用者只需要合并 MyStyles.xaml,而不是该程序集中的十几个单独的 XAML。

    事实证明,WPF 中存在一个错误,即“嵌套”合并字典无法正确解析。我发现如果我直接在 MyStyles.xaml 中放置一个样式,用户控件找到它。但是,它拒绝识别 MyStyles.xaml 合并的字典中的任何样式!我现在已经删除了 MyStyles.xaml,并返回到合并各个字典(从用户控件 XAML 中)——在设计时和运行时一切正常。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2023-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        • 2016-09-18
        相关资源
        最近更新 更多