Доступ к ресурсу через codebehind в WPF

У меня есть пользовательская коллекция, определенная в моих ресурсах окна следующим образом (в приложении Sketchflow, так что окно фактически является UserControl):

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

Я хочу иметь возможность ссылаться на эту коллекцию в коде, который, как я ожидал, будет иметь название x:Name, но я не могу получить к нему доступ.

Я могу получить ссылку на это с помощью

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

но это кажется хакерским. Это плохая практика, и что будет лучше? Спасибо:)

7 ответов

Решение

Вы должны использовать System.Windows.Controls.UserControl"s FindResource() или же TryFindResource() методы.

Также хорошей практикой является создание строковой константы, которая отображает имя вашего ключа в словаре ресурсов (чтобы вы могли изменить его только в одном месте).

Вы также можете использовать this.Resources["mykey"], Я думаю, что это не намного лучше, чем ваше собственное предложение.

Не совсем прямой ответ, но сильно связанный:

Если ресурсы находятся в другом файле - например, ResourceDictionary.xaml

Вы можете просто добавить 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>

А затем используйте его в коде:

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

Если вы хотите получить доступ к ресурсу из какого-либо другого класса (например, не код XAML), вы можете использовать

Application.Current.Resources["resourceName"];

от System.Windows Пространство имен.

Вы можете использовать ключ ресурса следующим образом:

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

Я получил ресурсы на C# (Desktop WPF W/ .NET Framework 4.8), используя приведенный ниже код.

{DefaultNamespace}.Properties.Resources.{ResourceName}

Хороший чистый пример из документов Microsoft упрощает задачу:

      private void myButton_Click(object sender, RoutedEventArgs e)
{
  Button button = (Button)sender;
  button.Background = (Brush)this.FindResource("RainbowBrush");
}
Другие вопросы по тегам