2009-03-06 4 views
51

DataTemplateはxamlファイルで定義されており、C#コードでアクセスしたいと思っています。 誰でもアクセスできますか教えてください。 新しいResourceDictionaryファイルを追加しました。その名前はDictionary1.xamlです。私のようなデータテンプレートを持っている :C#コードからwpfのResourceDictionaryにアクセスするにはどうすればよいですか?

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

私はListBoxと呼ばれるlistbox1をしていないと私はそれにそれを割り当てるには、Itemtemplateプロパティ だが、私は私はそれを行うことができますどのようになっていませんよ?正確にあなたがそれを定義している

Application.Current.Resources[typeof(Button)] 

答えて

50

:あなたはたとえばファイルApp.xamlであなたのリソースディクショナリにボタン用のテンプレートを持っている場合は

+1

わかりません。この答えはキーを使用しません。 –

+0

FindResourceは、キーである1つの引数をとります。この例では、typeof(yourDataTemplateTargetType)がキーです。 –

+0

こんにちは。キーがタイプではなく、OPの例のような文字列の場合はどうなりますか? –

7

次のコードを使用してアクセスすることができますか?

あなたがオブジェクトののResourceDictionaryでそれを定義した場合

は、その後、

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 

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

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

もしそうなら、次のステップはこのリソースを取得することです。各FrameworkElementにはFindResourceというメソッドがあります。このメソッドは、ResourceDictionaryツリーを上に移動し、そのキーでリソースを特定しようとするため、優れています。あなたはUserControlからこのリソースにアクセスしたいのであれば、あなたが背後にあるコードに次の操作を行うことができます。

FindResource(typeof(yourDataTemplateTargetType)); 

をこれはあなたのために動作しない場合は、このリソースディクショナリを宣言している正確にどのように私たちをご提示くださいアプリケーションのリソースにどのようにマージされているかを示します。

46

Application.Currentは、私の場合はnullだったので、私はこの使用して終了しました:

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

をしてから、私は myResourceDictionary["KeyName"] as TypeOfItem

source

+2

これはライブラリや他の場所でこれを定義するかのように、これが最良のアプローチだと個人的に考えると、受け入れられた答えとして、すべての辞書をアプリケーションにマージする必要があります。実行可能でない。 –

+0

ResourceDictionaryの代わりにvarを使用する理由を説明してください。 – Venkat

+0

@Venkat私は見てみることをお勧めします[ここ](http://stackoverflow.com/questions/1873873/why-does-resharper-want-to-use -var-for-everything)を覚えておいてください。これは必須ではありません:-) – itsho

1

を使用して必要な指定されたキーを取得プロジェクトに追加したリソース辞書には、次のようにアクセスできます。

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

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

someObject.Property = rd["mytemplate"]; 

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

0

上記のアプローチは、あなたがMVVMmを以下している場合、私はそれをこのようにやって推薦する、ロケーションに基づいてリソースを取得する作業のいずれか:

  1. サービス通常の継承を作成するProvideDataTemplateService、(のようなサービスを作成します行動から)
  2. DataTempleにエースを持たせたい場合は、このコンテナを使用してこのサービスを注入します。
関連する問題