web-dev-qa-db-ja.com

C#コードからwpfのResourceDictionaryにアクセスするにはどうすればよいですか?

XamlファイルにDataTemplateが定義されており、C#コード経由でアクセスしたい。誰でもアクセス方法を教えてください。新しいResourceDictionaryファイルを追加しました。その名前は Dictionary1.xaml。次のようなデータテンプレートがあります。

<ResourceDictionary xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
    <DataTemplate x:Key="mytemplate">
        <TextBlock Text="Name:" Background="Blue"/>
    </DataTemplate>
</ResourceDictionary>

listBox1と呼ばれるListBoxがなく、それをItemtemplateプロパティに割り当てたいのですが、どうすればそれができますか?

58
Embedd_Khurja

どこで正確に定義していますか?

オブジェクトのResourceDictionaryで定義すると、

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 

動作するはずです。 ItemsControlなどの他の何かのメンバーとして定義している場合、ItemsControlインスタンスへのハンドルを取得して、ItemTemplateプロパティを呼び出す必要があります。

編集:OK、私たちはどこかに来ていると思います。したがって、独自のファイルでResourceDictionaryを定義しています。 UIで使用してコードビハインドからアクセスする前に、そのResourceDictionaryをアプリケーションにマージする必要があります。これやってる?

もしそうなら、次のステップはこのリソースを取得することです。各FrameworkElementには、 FindResource というメソッドがあります。このメソッドは、ResourceDictionaryツリーをさかのぼって、キーを使用してリソースを見つけようとするため、優れています。したがって、UserControlからこのリソースにアクセスする場合は、コードビハインドで次の操作を実行できます。

FindResource(typeof(yourDataTemplateTargetType));

これで問題が解決しない場合は、このリソースディクショナリを宣言する方法と、アプリケーションのリソースにマージする方法を正確に示してください。

53
Szymon Rozga

私の場合、Application.Currentはnullであったため、これを使用することになりました。

    var myResourceDictionary = new ResourceDictionary();
    myResourceDictionary.Source =
        new Uri("/DllName;component/Resources/MyResourceDictionary.xaml",
                UriKind.RelativeOrAbsolute);  

myResourceDictionary["KeyName"] as TypeOfItemを使用して必要な指定のキーを取得します

ソース

55
itsho

たとえば、App.xamlファイルのリソースディクショナリにButtonのテンプレートがある場合は、次のコードを使用してアクセスできます。

Application.Current.Resources[typeof(Button)]
7

次のようにして、プロジェクトに追加したリソースディクショナリにアクセスできます。

var rd = new ResourceDictionary();
rd.Source = new Uri("ms-appx:///Dictionary1.xaml");

その後、次のようにリソースディクショナリに保存されているリソースにアクセスできます。

someObject.Property = rd["mytemplate"];

注:
プロジェクトのベースディレクトリを基準にして作成した場所に応じて、リソースディクショナリのURIを変更する必要があります。

1
Alex Essilfie

上記のいずれの方法でも、場所に基づいてリソースを取得できます。MVVMmを使用している場合は、この方法をお勧めします。

  1. provideDataTemplateServiceのようなサービスを作成します(通常のサービスを作成するには、Behaviorを継承します)
  2. 任意のコンテナを使用して、DataTempleにエースを持ちたい場所にこのサービスを注入します。
0
dman