Доступ к ресурсу через codebehind в WPF - PullRequest
59 голосов
/ 22 января 2010

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

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

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

Я могу получить ссылку на него, используя

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

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

Ответы [ 5 ]

66 голосов
/ 22 января 2010

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

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

23 голосов
/ 22 января 2010

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

15 голосов
/ 18 июня 2014

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

В случае, если ресурсы находятся в другом файле - например, 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"];
3 голосов
/ 27 июля 2018

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

Application.Current.Resources["resourceName"];

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

3 голосов
/ 22 октября 2015

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

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