通过引用加载项

时间:2017-09-01 04:58:12

标签: c# wpf resourcedictionary

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

1 个答案:

答案 0 :(得分: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定义另一个资源来覆盖您想要的任何资源。此资源会覆​​盖x:Key&#34;刷&#34;的任何资源。在Brushes.xamlControls.xaml中定义。