Accessing a resource via codebehind in WPF
C#WpfXamlResourcesCode BehindC# Problem Overview
I have a custom collection defined in my window resources as follows (in a Sketchflow app so the window is actually a UserControl):
<UserControl.Resources>
<ds:MyCollection x:Key="myKey" x:Name="myName" />
</UserControl.Resources>
I want to be able to refer to this collection in the codebehind, which I expected would be by the x:Name, but I can't seem to access it.
I can get a reference to it using
myRef = (MyCollection) this.FindName("myKey");
but this seems hackish. Is this bad practice, and what would be better? Thanks :)
C# Solutions
Solution 1 - C#
You should use System.Windows.Controls.UserControl
's FindResource()
or TryFindResource()
methods.
Also, a good practice is to create a string constant which maps the name of your key in the resource dictionary (so that you can change it at only one place).
Solution 2 - C#
You may also use this.Resources["mykey"]
. I guess that is not much better than your own suggestion.
Solution 3 - C#
Not exactly direct answer, but strongly related:
In case the resources are in a different file - for example ResourceDictionary.xaml
You can simply add x:Class
to it:
<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>
And then use it in code behind:
var res = new Namespace.NewClassName();
var col = res["myKey"];
Solution 4 - C#
If you want to access a resource from some other class (i.g. not a xaml codebehind), you can use
Application.Current.Resources["resourceName"];
from System.Windows
namespace.
Solution 5 - C#
You can use a resource key like this:
<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); ;
}
}
Solution 6 - C#
I got the resources on C# (Desktop WPF W/ .NET Framework 4.8) using the code below
{DefaultNamespace}.Properties.Resources.{ResourceName}
Solution 7 - C#
A nice clean example from Microsoft documents makes it simple:
private void myButton_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
button.Background = (Brush)this.FindResource("RainbowBrush");
}