Accessing a resource via codebehind in WPF
Asked Answered
S

7

92

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 :)

Stringpiece answered 22/1, 2010 at 14:30 Comment(0)
T
103

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

Tl answered 22/1, 2010 at 14:33 Comment(4)
You can use: Application.Current.FindResource(errorColorResourceName) as MyCollection or this.FindResource("RainbowBrush") as MyCollection. It depends on the context.Roughen
Can you elaborate on "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)." ? Where would such a string constant go that would change the XAML key as well as the C# code behind?Vagus
+1 for > Can you elaborate on "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)." ? Where would such a string constant go that would change the XAML key as well as the C# code behind?Vidicon
@MikeChristiansen AdonisUI is a good exemple of that, if you look in src/AdonisUI/Brushes.cs you have a bunch of keys that are used in the templates, for example in Buttons.cs where you have a {DynamicResource {x:Static adonisUi:Brushes.ForegroundBrush}}.Gallman
C
31

You may also use this.Resources["mykey"]. I guess that is not much better than your own suggestion.

Chamois answered 22/1, 2010 at 14:34 Comment(3)
This is for Windows 8 Store Apps.Vauntcourier
@cederlof, you can use this with WPF too.Enenstein
This will not work if the resource is in another file, for instance a theme color. FindResource is the way to go.Fridlund
U
23

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"];
Uncork answered 18/6, 2014 at 12:49 Comment(3)
+1, but to be able to find resources using it's key I had to call res.InitializeComponent() before attempting to access the key otherwise the object would show no keys and the call to res["myKey"] would return null.Sneaker
Wow that's awesome... I never knew you could do that and it just solved a problem for me quick and easy! I did need to call InitializeComponent() like @StephenRoss said but other than that works like a charm.Phylloid
A perfect solution to use from ConvertersTussock
G
11

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.

Ginger answered 27/7, 2018 at 20:26 Comment(1)
This is useful if you need to access the resource from a static constructor or method, and therefore don't have the ability to call FindResource or TryFindResource.Incisure
I
9

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); ;
    }
}
Incus answered 21/10, 2015 at 23:0 Comment(1)
Note that this depends on the type of key. E.g. a key in a DataTemplate is of type DataTemplateKey.Alibi
C
1

I got the resources on C# (Desktop WPF W/ .NET Framework 4.8) using the code below

{DefaultNamespace}.Properties.Resources.{ResourceName}
Cultivar answered 24/11, 2019 at 2:24 Comment(0)
M
1

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");
}
Macule answered 24/1, 2022 at 21:39 Comment(1)
This has already been answered.Acrylonitrile

© 2022 - 2025 — McMap. All rights reserved.