2017-09-01 3 views
1

モデル、ビューモデル、およびビューを持つac#wpfベースのクラスライブラリがあります。これは、APIを持つデスクトップアプリケーションの複数のアドインで使用しています。ホストされたドッキング可能なWPFユーザーコントロールをサポートします。ここからは、さまざまなコントロールとダイアログを起動して、サードパーティアプリケーションのさまざまなデータ構造とやりとりすることができます。私のクラスライブラリにはApp.xamlファイルがありません。参照アドインからクラスライブラリスタイルのリソース値を指定または変更する

私は自分の見解を通してメインスタイルシートとして使用しているResourceDictionary xamlファイルを作成しました。私のユーザーコントロールとウィンドウでは、私はそれを参照:このスタイルシートの内部

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

を、私は自分の意見を簡素化し、統一するために私の様々な制御を管理します。一番下のレベルでは、フォントサイズ、フォントファミリ、色などの設定があります。たとえば、私は自分のコントロール全体でいくつかのブラシを使用しています。 1つはこのように見えます:

<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> 

他のリソースを同じで定義することで、任意のリソースを上書きすることができます私は上記のSolidColorBrushでやったように210。このリソースはBrushes.xamlまたはControls.xamlのいずれかで定義されたx:Keyの "brush"を持つリソースを無効にします。

+0

私はWPFコントロールをホストできるサードパーティ製ソフトウェアのアドインをビルドしているので、それを参照するクラスライブラリもアセンブリも、そのパターンに従うことができるアプリケーションxamlファイルはありません。 – davestasiuk

+1

アセンブリは、いくつかのPointにResourcesプロパティを持つアプリケーションにロードされます。辞書を次にマージします。あなたの質問は何ですか? – mm8

関連する問題