2011-11-23 157 views
0

我有一个派生自UserControl的自定义WPF控件。在我的XAML文件的参考资料部分,我有几个模板和样式,这些模板和样式将被定义为将显示在我的自定义控件上的项目。TryFindResource无法找到资源

下面是我的一种风格的定义,绘制一个向下的箭头。

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

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

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

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

我在做什么错或失踪?

更新

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

回答

7

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

然后检查应用程序资源。那是你第二次尝试的那个,因为它在那里被发现而工作。所以当你说“TryFindResource(”ArrowStyle“)时,它会在其父元素上的箭头样式上搜索它的窗口资源,然后搜索应用程序资源(全局资源),当你从你的自定义按钮对象中调用它时,不能找到它,因为你的ArrowStyle资源不满足上述条件。

你需要调用它在你的“即从用户控件派生自定义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> 
0

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

要从按钮中找到资源,必须沿着逻辑树走到父节点并从中调用TryFindResource。否则,你只能将样式与按钮或App.xaml放在一起。

0

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