Доступ к ресурсу через codebehind в WPF
У меня есть пользовательская коллекция, определенная в моих ресурсах окна следующим образом (в приложении Sketchflow, поэтому на самом деле это окно UserControl):
<UserControl.Resources>
<ds:MyCollection x:Key="myKey" x:Name="myName" />
</UserControl.Resources>
Я хочу иметь возможность ссылаться на эту коллекцию в codebehind, которую я ожидал бы от x: Name, но я не могу получить доступ к ней.
Я могу получить ссылку на него, используя
myRef = (MyCollection) this.FindName("myKey");
но это кажется хакерским. Это плохая практика, и что было бы лучше? Спасибо:)
Ответы
Ответ 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); ;
}
}