2017-09-01 52 views
1

我有基於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

回答

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任何資源。

+0

由於我爲第三方軟件構建了允許我託管WPF控件的插件,因此我的類庫和組件都沒有引用它的應用程序xaml文件,我可以按照該模式進行操作。 – davestasiuk

+1

程序集被加載到在某個點具有資源屬性的應用程序中。然後合併詞典。或者你的問題到底是什麼? – mm8