2017-06-03 8 views
0

私は、実行時にリソースアセンブリに含まれるカスタムスタイルとイメージでオーバーライドできるようにする、いくつかのデフォルトのスタイルとイメージを定義するWPFユーザーコントロールを用意しています。ランタイムでのWPF ResourceDictionaryのマージ

スタイルとイメージがアセンブリの名前Olbert.JumpForJoy.DefaultResourcesにDefaultResources.xamlと呼ばれるのResourceDictionaryに含まれています。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        x:Name="J4JResources"> 

    <BitmapImage x:Key="J4JMessageBoxImage" UriSource="assets/j4jmsgbox.png" /> 
    <BitmapImage x:Key="J4JWizardImage" UriSource="assets/j4jtransparent.png" /> 
    <Color x:Key="J4JButton0Color">#bb911e</Color> 
    <Color x:Key="J4JButton1Color">#252315</Color> 
    <Color x:Key="J4JButton2Color">#bc513e</Color> 
    <Color x:Key="J4JButtonHighlightColor">Orange</Color> 

</ResourceDictionary> 

アプリにこれを提供するために、私は、リソースの作成nugetパッケージを追加しますプロジェクトは、カスタムリソースが使用されるアプリケーションにコンパイルされます。ターゲットのbinディレクトリにdllが追加されることを確認しました。

私はOnStartup()メソッド内で、App.xaml.csファイルにカスタムリソースアセンブリをロードしよう:

public partial class App : Application 
{ 
    public const string ResourceDll = "Olbert.JumpForJoy.DefaultResources"; 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     try 
     { 
      var resDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{ResourceDll}.dll"); 

      if (File.Exists(resDllPath)) 
      { 
       var resAssembly = Assembly.LoadFile(resDllPath); 
       var uriText = $"pack://application:,,,/{resAssembly.GetName().Name};component/DefaultResources.xaml"; 

       ResourceDictionary j4jRD = new ResourceDictionary { 
         Source = new Uri(uriText) 
        }; 

       Resources.MergedDictionaries.Add(j4jRD); 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 
} 

しかしのResourceDictionaryを作成するときに例外がスローされます。メッセージは「リソース 'defaultresources.xaml'を見つけることができません」です。

私が働いているどれもこれを解決するために、URIの定義にかなりの数の調整を試みました。リソースアセンブリはバージョン管理されていますが、特定のバージョンをURI定義に含めるかどうかにかかわらず、同じエラーが発生します。

私はそれについて聞いてみたいWPFプロジェクトにオプションのリソースアセンブリをマージする別の方法がある場合。私の特定の問題への答えは、あまりにも、いただければ幸いです:)

更新

私がapp.xamlを介してこれを実行しようとした場合:

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/Olbert.JumpForJoy.DefaultResources;component/DefaultResources.xaml" /> 
    <ResourceDictionary Source="NotifyIconResources.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

私は、「デザイン時のエラーを取得しますリソースディクショナリを見つけ中にエラーが発生しました...」私の独創的なアプローチでresAssembly.GetManifestResourceNames()を呼び出す

は、リソースがカスタムアセンブリに存在しないことを示しました。

Olbert.JumpForJoy.WPF.DefaultResources.xaml

私はウリを定義する際に、何らかの形で、その名前空間を指定する必要がある場合、私は思ってしまう:しかし、彼らは、アセンブリの既定の名前空間「の下に」表示されます。

+0

で私のブログに、より完全にこれを文書化してきました

あなたが '' App.xaml'で 'に直接外部リソースをマージすると、エラーが表示されていますか? – Maxim

答えて

0

この問題に苦しんでいる他の人のために、ここに私が解説した解決策があります:外部リソースアセンブリの既定の名前空間はのアセンブリのDLLの名前と同じでなければならないという問題がありました。名前が異なる場合、パックUri構文は失敗します。私はhttp://jumpforjoysoftware.com/2017/06/the-pain-of-shared-wpf-resources/

関連する問題