【问题标题】:Specify or modify class library style resource values from referencing add-ins通过引用加载项指定或修改类库样式资源值
【发布时间】:2017-09-01 04:58:11
【问题描述】:

我有一个基于 c# wpf 的类库,其中包含模型、视图模型和视图,我在具有支持托管可停靠 WPF 用户控件的 API 的 dektop 应用程序的多个加载项中使用它。从这里我可以使用不同的控件和启动对话框来与第 3 方应用程序中的各种数据结构进行交互。我的类库没有 App.xaml 文件。

我创建了一个 ResourceDictionary xaml 文件,在我的视图中用作主样式表。在我的用户控件和窗口中,我引用了它:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="../Resources/styleMain.xaml"/>
</ResourceDictionary.MergedDictionaries

在此样式表中,我管理各种控件以简化和统一我的视图。在最低级别,我有字体大小、字体系列和颜色等设置。例如,我有几个在我的控件中使用的画笔。一个看起来像这样:

<Color x:Key="ColorBase_Primary" R="255" G="0" B="115" A="255"/>
<SolidColorBrush x:Key="Color_Primary" Color="{StaticResource ColorBase_Primary}"/>

这一切都非常适合设计和测试。但是,我在多个其他项目中引用了这个类库。在这些其他项目中,我从我的类库中托管主用户控件:

<UserControl x:Class="MyAppHost.ucDockingHost"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyAppHost"
             xmlns:viewModels="clr-namespace:MyClassLibrary.ViewModels;assembly=MyClassLibrary"
             xmlns:views="clr-namespace:MyClassLibrary.Views;assembly=MyClassLibrary"
             mc:Ignorable="d">

    <UserControl.DataContext>
        <viewModels:vmMain/>
    </UserControl.DataContext>

    <Grid>
        <views:ucMainGrid ViewModelMain="{Binding}" Property1="SomeValue" Property2="SomeOtherValue"/>
    </Grid>  
</UserControl>

在这里,我正在从引用我的类库的加载项应用程序中设置 DependencyProperties,没有任何问题,并且我的所有绑定和控制行为都运行良好。

我现在希望做的是能够从我的加载项(而不是主类库)中指定在整个样式表中使用的基本资源值,尤其是颜色(因为能够更改与x:Key="ColorBase_Primary" 关联的值)。通过这种方式,我可以根据不同客户的品牌等调整不同的实现。我一直在寻找任何示例或见解,并且不断提出不足。

使用每个应用程序独立部署整个类库并直接调整样式表很容易,但这似乎根本不对。我有什么方法可以在我的加载项应用程序中创建一个 ResourceDictionary,它可以提供、修改或/覆盖我的类库中指定的资源值?或者我应该通过我的视图模型中的 DependencyProperty 来做到这一点?这似乎也不对。

【问题讨论】:

  • 我不认为我理解你的问题。您是否要覆盖在特定应用程序中引用的类库中定义的某些资源,或者您的问题是什么?
  • 你确实明白我的问题。我想引用我的类库其他应用程序,并且在这些应用程序中能够覆盖一些资源。

标签: c# wpf resourcedictionary


【解决方案1】:

不要在你的库中使用MergedDictionaries,即删除它:

然后,在您的应用程序中,您可以按正确的顺序合并库中的所有资源字典:

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Brushes.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Controls.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <SolidColorBrush x:Key="brush">Red</SolidColorBrush>
        </ResourceDictionary>
    </Application.Resources>
</Application>

然后,您可以通过使用相同的x:Key 定义另一个资源来简单地覆盖您想要的任何资源,就像我对上面的SolidColorBrush 所做的那样。此资源会覆​​盖在Brushes.xamlControls.xaml 中定义的任何具有“画笔”x:Key 的资源。

【讨论】:

  • 因为我正在为允许我托管 WPF 控件的第 3 方软件构建加载项,所以我的类库和引用它的程序集都没有我可以遵循该模式的应用程序 xaml 文件。
  • 程序集被加载到在某个点具有资源属性的应用程序中。然后合并字典。或者你的问题到底是什么?
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2015-09-04
  • 2011-12-07
  • 2014-09-06
相关资源
最近更新 更多