web-dev-qa-db-fra.com

Accéder à une ressource via codebehind dans WPF

J'ai une collection personnalisée définie dans mes ressources de fenêtre comme suit (dans une application Sketchflow donc la fenêtre est en fait un UserControl):

<UserControl.Resources>
    <ds:MyCollection x:Key="myKey" x:Name="myName" />
</UserControl.Resources>

Je veux pouvoir faire référence à cette collection dans le codebehind, que je pensais être par le x: Name, mais je n'arrive pas à y accéder.

Je peux obtenir une référence en utilisant

myRef = (MyCollection) this.FindName("myKey");

mais cela semble hackish. Est-ce une mauvaise pratique et quoi de mieux? Merci :)

61
randomsequence

Vous devez utiliser les méthodes FindResource() ou TryFindResource() de System.Windows.Controls.UserControl.

En outre, une bonne pratique consiste à créer une constante de chaîne qui mappe le nom de votre clé dans le dictionnaire de ressources (afin que vous ne puissiez la modifier qu'à un seul endroit).

69
japf

Vous pouvez également utiliser this.Resources["mykey"]. Je suppose que ce n'est pas beaucoup mieux que votre propre suggestion.

23
Jakob Christensen

Pas exactement une réponse directe, mais fortement liée:

Dans le cas où les ressources se trouvent dans un fichier différent - par exemple ResourceDictionary.xaml

Vous pouvez simplement ajouter x:Class à lui:

<ResourceDictionary x:Class="Namespace.NewClassName"
                    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml" >
    <ds:MyCollection x:Key="myKey" x:Name="myName" />
</ResourceDictionary>

Et puis utilisez-le dans le code derrière:

var res = new Namespace.NewClassName();
var col = res["myKey"];
17
itsho

Si vous souhaitez accéder à une ressource d'une autre classe (par exemple, pas un code xaml derrière), vous pouvez utiliser

Application.Current.Resources["resourceName"];

de l'espace de noms System.Windows.

3
R. Matveev

Vous pouvez utiliser une clé de ressource comme celle-ci:

<UserControl.Resources>
    <SolidColorBrush x:Key="{x:Static local:Foo.MyKey}">Blue</SolidColorBrush>
</UserControl.Resources>
<Grid Background="{StaticResource {x:Static local:Foo.MyKey}}" />
public partial class Foo : UserControl
{
    public Foo()
    {
        InitializeComponent();
        var brush = (SolidColorBrush)FindResource(MyKey);
    }

    public static ResourceKey MyKey { get; } = CreateResourceKey();

    private static ComponentResourceKey CreateResourceKey([CallerMemberName] string caller = null)
    {
        return new ComponentResourceKey(typeof(Foo), caller); ;
    }
}
3
Johan Larsson