2017-05-19 9 views
0

デフォルトのビットマップリソースを使用するか、WPFウィンドウで個別のアセンブリによって提供されるリソースを使用できるようにしたいと考えています。これは、Window.Resourcesセクションでデフォルトのビットマップを定義することで可能です[ウィンドウのコンストラクタのためのコードの背後]WPFウィンドウにオプションのリソースを含める

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary> 
       <BitmapImage x:Key="J4JWizardImage" UriSource="../assets/install.png"/> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

[ウィンドウのXAMLファイル]

try 
{ 
    var resDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Olbert.JumpForJoy.DefaultResources.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.Add(J4JWizardImageKey, j4jRD[ "J4JWizardImage" ]); 
    } 
} 
catch (Exception ex) 
{ 
} 

InitializeComponent(); 
:別オプションアセンブリからリソースを発見した場合、その後の検索と負荷

ただし、個別のリソースアセンブリが存在する場合でも、デフォルトイメージは常に表示されました。どうやら、ウィンドウ定義の中で定義されたリソースは、ウィンドウの構築時に追加されたリソースよりも優先されます。

だから、Window.Resourcesセクションを削除し、スタンドアロンのリソースXAMLファイル追加:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:Olbert.Wix.views"> 
    <BitmapImage x:Key="DefaultWizardImage" UriSource="../assets/install.png"/> 
</ResourceDictionary> 

を別々のアセンブリが見つからなかった場合のように、ウィンドウコンストラクタコードを変更し、スタンドアロンXAMLからリソース代わりにファイルが追加されます。

if(File.Exists(resDllPath)) 
{ 
    // same as above 
} 
else 
    Resources.Add(J4JWizardImageKey, TryFindResource("DefaultWizardImage")); 

これは別のアセンブリが存在する場合に機能します。ただし、デフォルトのイメージリソースが見つからないため、別のアセンブリを削除したときに失敗しました。これは、このウィンドウがWPFアプリケーションの一部ではないためかもしれません。これはWixブートストラッププロジェクトのUIです。

私は何をしようとしているのか簡単な解決策が必要だと感じています。私はWPFライブラリが設計されているときはいつもよくあると思います。(ビットマップのカスタマイズを可能にする方法が必要です。デフォルト/フォールバックを提供したい)。

+1

「StaticResource」または「DynamicResource」で取得していますか? 'StaticResource'は、XAMLが解析されたときにそこにあるものを取り出します。 'DynamicResource'は、リソースが変更されたときにターゲットを更新します。 –

+0

それは問題でした! Thanx、@EdPlunkett!あなたが答えとして投稿するなら、私はそのようにマークします。 –

答えて

1

XAMLが解析された時点で、リソースの初期値が取得されているようです。その時そこになければ何もない。それが事件であれば、それは今までにないことです。

StaticResourceを使用してDynamicResourceではなくリソースを取得するときに表示される動作です。 DynamicResourceは、リソースが置き換えられたときにターゲットを更新します。

<Label Content="{DynamicResource MyImageSomewhere}" />