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

时间:2014-02-12 14:16:29

标签: wpf

我在不同项目之间分享常见样式时遇到一些问题。这是我的项目: -

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

“Common”和“Core app”位于同一解决方案中,而“Plugin”则属于自己的解决方案。

“核心应用”项目中的样式工作正常 - 它引用了“Common”项目,并在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时,“Common”程序集中的样式不会显示在intellisense中,而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的样式。

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

2 个答案:

答案 0 :(得分:4)

解决。似乎使用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) - 一切都在设计时和运行时都有效。

答案 1 :(得分:0)

您还可以定义一个UserControlBase,您的所有UC都将从该csv_df = pd.read_csv("adsf.csv") custom_df=csv_df[["column_name1","column_name2"]] custom_df.head() # this show chosen columns 派生,然后合并其中的所有样式。