私は、実行時にリソースアセンブリに含まれるカスタムスタイルとイメージでオーバーライドできるようにする、いくつかのデフォルトのスタイルとイメージを定義する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
私はウリを定義する際に、何らかの形で、その名前空間を指定する必要がある場合、私は思ってしまう:しかし、彼らは、アセンブリの既定の名前空間「の下に」表示されます。
で私のブログに、より完全にこれを文書化してきました
あなたが '' App.xaml'で 'に直接外部リソースをマージすると、エラーが表示されていますか? –
Maxim