web-dev-qa-db-fra.com

Comment puis-je accéder à ResourceDictionary dans wpf à partir de code C #?

J'ai un DataTemplate défini dans un fichier xaml auquel je veux accéder via le code C # . Quelqu'un peut-il me dire comment puis-je y accéder? J'ai ajouté un nouveau fichier ResourceDictionary et son nom est Dictionary1.xaml. J'ai un modèle de données tel que:

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

non, j'ai une ListBox appelée listBox1 et je veux l'assigner à sa propriété Itemtemplate , mais je ne comprends pas comment puis-je le faire?

59
Embedd_Khurja

Où exactement le définissez-vous? 

Si vous le définissez dans le ResourceDictionary de votre objet, alors 

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 

devrait marcher. Si vous le définissez comme membre de quelque chose d'autre, comme par exemple un ItemsControl, vous devez obtenir un descripteur pour l'instance ItemsControl et appeler la propriété ItemTemplate.

Edit: Ok, je pense que nous allons quelque part. Vous définissez donc un ResourceDictionary dans son propre fichier. Avant de pouvoir l'utiliser dans votre interface utilisateur et y accéder à partir de votre code, vous devez fusionner ce ResourceDictionary dans votre application. Est-ce que tu fais ça?

Si vous l'êtes, l'étape suivante consiste à obtenir cette ressource. Chaque FrameworkElement a une méthode appelée FindResource . Cette méthode est intéressante car elle parcourt l'arborescence ResourceDictionary et tente de localiser la ressource avec la clé. Ainsi, si vous souhaitez accéder à cette ressource à partir d'un UserControl, vous pouvez effectuer les opérations suivantes dans le code situé derrière:

FindResource(typeof(yourDataTemplateTargetType));

Si cela ne fonctionne pas pour vous, expliquez-nous exactement comment vous déclarez ce dictionnaire de ressources et comment il est fusionné dans les ressources de votre application.

53
Szymon Rozga

Puisque Application.Current était nul dans mon cas, j'ai fini par utiliser ceci:

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

puis obtenir la clé spécifiée dont j'avais besoin en utilisant myResourceDictionary["KeyName"] as TypeOfItem

( la source )

52
itsho

Si vous avez par exemple un modèle pour Button dans votre dictionnaire de ressources dans le fichier App.xaml, vous pouvez y accéder à l'aide du code suivant:

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

Vous pouvez accéder à un dictionnaire de ressources que vous avez ajouté à votre projet comme suit:

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

Ensuite, vous pouvez accéder à une ressource stockée dans le dictionnaire de ressources comme suit:

someObject.Property = rd["mytemplate"];

REMARQUE:
Vous devrez modifier l'URI du dictionnaire de ressources en fonction de l'emplacement où vous l'avez créé par rapport au répertoire de base du projet.

1
Alex Essilfie

Chacune des approches ci-dessus fonctionne pour obtenir la ressource en fonction de l'emplacement. Si vous suivez MVVMm, je vous recommande de le faire de cette manière: 

  1. créer un service comme ProvideDataTemplateService, (pour créer un service hérité de Behavior)
  2. Utilisez le conteneur de votre choix pour injecter ce service où vous voudriez avoir des atouts pour DataTemple. 
0
dman