Доступ к ресурсу через codebehind в WPF - программирование
Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Если ресурсы находятся в другом файле - например 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"];

Ответ 4

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

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