通过WPF中的代码隐藏访问资源


73

我在窗口资源中定义了一个自定义集合,如下所示(在Sketchflow应用中,因此窗口实际上是UserControl):

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

我希望能够在后面的代码中引用此集合,我希望它可以通过x:Name引用,但是我似乎无法访问它。

我可以使用它获得参考

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

但这似乎有点骇人听闻。这是不好的做法吗?有什么更好的办法?谢谢 :)

Answers:


85

您应该使用System.Windows.Controls.UserControlFindResource()TryFindResource()方法。

另外,一种好的做法是创建一个字符串常量,该常量将键名映射到资源字典中(以便您只能在一个地方更改它)。


7
您可以使用:Application.Current.FindResource(errorColorResourceName)作为MyCollection或this.FindResource(“ RainbowBrush”)作为MyCollection。这取决于上下文。
塔尔·西格尔

7
您能否详细说明“此外,一个好的做法是创建一个字符串常量,该常量将映射您的键名在资源字典中(以便您只能在一个地方更改它)。” ?这样的字符串常量在哪里会改变XAML密钥以及后面的C#代码?
迈克·克里斯蒂安森

28

您也可以使用this.Resources["mykey"]。我想这并不比您自己的建议好多少。


1
这适用于Windows 8 Store Apps。
塞德洛夫2014年

3
@cederlof,您也可以将其与WPF一起使用。

1
如果资源位于另一个文件(例如主题颜色)中,则此方法将不起作用。FindResource是必经之路。
约翰C,

18

不是完全直接的答案,而是密切相关的:

如果资源位于其他文件中,例如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"];

11
+1,但是为了能够使用它的键查找资源,我必须res.InitializeComponent()在尝试访问键之前先调用它,否则该对象将不显示键,并且对的调用res["myKey"]将返回null。
斯蒂芬·罗斯

哇,真棒……我不知道您能做到,它只是为我快速又轻松地解决了一个问题!我确实需要像@StephenRoss所说的那样调用InitializeComponent(),但除此之外,它就像是一种魅力。
sfaust

Converters
Ghosthack '19

8

如果要访问其他类的资源(例如,不是背后的XAML代码),则可以使用

Application.Current.Resources["resourceName"];

来自System.Windows名称空间。


如果您需要从静态构造函数或方法访问资源,因此没有调用FindResource或的能力,则这很有用TryFindResource
史蒂文·兰兹

7

您可以使用以下资源密钥:

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

请注意,这取决于密钥的类型。例如a中的键DataTemplate是type DataTemplateKey
Mike de Klerk

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.