TryFindResource无法找到资源

时间:2011-11-23 15:53:54

标签: wpf resources

我有一个从UserControl派生的自定义WPF控件。在我的XAML文件的参考资料部分,我为自定义控件上显示的项目定义了几个模板和样式。

这是我的一种风格的定义,用于绘制向下箭头。

    <Style x:Key="ArrowStyle" TargetType="Path">
        <Setter Property="Margin" Value="4"/>
        <Setter Property="Stretch" Value="Uniform"/>
        <Setter Property="HorizontalAlignment" Value="Center"/>
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="Data" Value="M 0 0 L 5 5 L 10 0 Z"/>
        <Setter Property="Fill" Value="{DynamicResource FormText}"/>
    </Style>

所以,我有一个从按钮派生的自定义按钮对象。基本上它是一个显示箭头的小方形按钮。在我的自定义按钮的构造函数中,我有以下代码。

        Path Arrow = new Path();
        Arrow.Style = TryFindResource("ArrowStyle") as Style;

然而,对TryFindResource的调用失败表明它无法定位资源。如果我将定义的样式移动到App.xaml中,它会找到它,但不是在它是自定义控件资源时。

我做错了什么或错过了什么?

更新

我调用TryFindResource的自定义按钮位于自定义用户控件上。但是,由于我在自定义按钮的构造函数中调用TryFindResource,因此在调用TryFindResource时它实际上不会驻留在自定义用户控件上。创建自定义按钮后,它将添加到自定义用户控件。也许有一种不同的方式或地方放置TryFindResource,以便在按钮属于控件后调用它。

3 个答案:

答案 0 :(得分:7)

TryFindResource向上遍历逻辑树到父元素,直到到达根元素。

然后检查应用程序资源。这是你在第二次尝试中放置的那个,并且因为它在那里被发现而起作用。

所以当你说“TryFindResource(”ArrowStyle“)时,它会搜索其父元素上的箭头样式,直到它的窗口资源和应用程序资源(全局资源)。当你从自定义按钮对象调用它时,它可以找不到它,因为你的ArrowStyle资源不满足上述条件。

您需要在“从UserControl派生的自定义WPF控件”或其后代上调用它。

我认为如果你无法使其工作只需将其移动到应用程序资源或使用所有全局资源(样式)将资源字典添加到您的应用程序资源:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="....Your resources.xaml"/>
            <ResourceDictionary Source="....Your resources.xaml"/>
            <!-- Place further resources here -->
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

答案 1 :(得分:0)

我假设当你说你在XAML的资源部分中定义了样式时,那就是在按钮所在的窗口或用户控件中。

要从按钮中找到资源,您必须向上走逻辑树以获取父资源并从中调用TryFindResource。否则,你只能选择使用按钮或在App.xaml中放置样式。

答案 2 :(得分:0)

通常,加载资源的更好位置是OnApplyTemplate覆盖或Loaded事件处理程序而不是构造函数。这将更像您在XAML中添加资源引用时发生的情况:构建控件并将其添加到可视树中,然后尝试从任何父对象资源中声明的任何位置解析资源。正如您所说,当构造函数运行时,您的按钮尚未添加到父控件,因此无法看到样式。