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 :)
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).
Vous pouvez également utiliser this.Resources["mykey"]
. Je suppose que ce n'est pas beaucoup mieux que votre propre suggestion.
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"];
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
.
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); ;
}
}