92 votes

Accéder à une ressource via codebehind dans WPF

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

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

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

Je peux obtenir une référence à elle en utilisant

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

Mais ça semble hacker. Est-ce que cette mauvaise pratique, et ce qui serait mieux ? Merci :)

104voto

Jalfp Points 3018

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

Aussi, une bonne pratique est de créer une constante de chaîne qui mappe le nom de votre clé dans le dictionnaire de ressources (de sorte que vous pouvez le changer à un seul endroit).

31voto

Jakob Christensen Points 9381

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

23voto

itsho Points 676

Réponse pas exactement directe, mais fortement liée :

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

Vous pouvez simplement y ajouter x:Class :

<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 en code derrière :

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

11voto

R. Matveev Points 409

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

Application.Current.Resources["resourceName"];

depuis l'espace de noms System.Windows.

9voto

Johan Larsson Points 4405

Vous pouvez utiliser une clé de ressource comme ceci :

<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); ;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X