Wpf TryFindResource无法找到该资源

Wpf TryFindResource无法找到该资源,wpf,resources,Wpf,Resources,我有一个自定义的WPF控件,它是从UserControl派生的。在XAML文件的参考资料部分中,我为将显示在自定义控件上的项定义了几个模板和样式 下面是我的一个样式的定义,用于绘制向下箭头 <Style x:Key="ArrowStyle" TargetType="Path"> <Setter Property="Margin" Value="4"/> <Setter Property="Stretch" Value="Uni

我有一个自定义的WPF控件,它是从UserControl派生的。在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>
但是,调用TryFindResource失败表明它无法定位资源。如果我将定义的样式移动到App.xaml中,它会找到它,但在它是自定义控件资源时不会找到它

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

更新


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

我假设,当您在XAML的“资源”部分中定义了样式时,该样式就位于按钮所在的窗口或用户控件中


要从按钮中找到资源,必须沿着逻辑树获取父级并从中调用TryFindResource。否则,您唯一的选择就是使用按钮或在App.xaml中放置样式。

TryFindResource向上遍历逻辑树,直到到达根元素为止

然后检查应用程序资源。这是你在第二次尝试中使用的,因为它是在那里发现的

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

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

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



加载资源的更好位置通常是在OnApplyTemplate重写或加载的事件处理程序中,而不是在构造函数中。这更像是在XAML中添加资源引用时发生的情况:控件被构造并添加到可视化树中,然后尝试从任何可能的位置解析资源在任何父对象的资源中都可以看到。正如您正确指出的,当构造函数运行时,您的按钮尚未添加到父控件中,因此无法看到样式。

使用OnApplyTemplate事件可以很好地工作。但是,在特定情况下,以这种方式应用的样式不能再被重写。我猜OnApplyTemplate是Trigger渲染内联样式后,单击d。
        Path Arrow = new Path();
        Arrow.Style = TryFindResource("ArrowStyle") as Style;
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="....Your resources.xaml"/>
            <ResourceDictionary Source="....Your resources.xaml"/>
            <!-- Place further resources here -->
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>