Доступ к ресурсу через 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");
}