指定或修改引用加载项的类库样式资源值

指定或修改引用加载项的类库样式资源值

问题描述:

我有基于ac#wpf的类库,包含模型,视图模型和视图,我正在使用多个加载项的dektop应用程序具有API支持托管的可停靠WPF用户控件。从这里我可以使用不同的控件和启动对话框来与第三方应用程序中的各种数据结构进行交互。我的类库没有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来完成它?这似乎也不错。

+0

我不认为我理解你的问题。您是否想要覆盖在特定应用程序中引用的类库中定义的某些资源,或者您的问题是什么? – mm8

+0

你理解我的问题。我想引用我的类库其他应用程序,并在这些应用程序中能够覆盖一些资源。 – davestasiuk

待办事项使用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任何资源。

+0

由于我为第三方软件构建了允许我托管WPF控件的插件,因此我的类库和组件都没有引用它的应用程序xaml文件,我可以按照该模式进行操作。 – davestasiuk

+1

程序集被加载到在某个点具有资源属性的应用程序中。然后合并词典。或者你的问题到底是什么? – mm8