如何在控件内引用用户控件主机的StaticResource?

时间:2014-08-23 19:43:34

标签: wpf xaml

我的StaticResource

中有以下Window.Resources
<my:someobj x:Key="someResource" />

我在窗口内有一个用户控件。我需要在我的用户控件中引用上面的资源,我该怎么做?我无法将资源移动到单独的字典文件中。

<TextBlock Text="{Binding Source={StaticResource someResource}, Path=SomeText}" />

上面给出了编译错误,找不到someResource。我如何参考someResource

3 个答案:

答案 0 :(得分:2)

试试这个

 <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=Window}, Converter={StaticResource konv} }" />

并在转换器中

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value is Window ? ((Window)value).Resources["someResource"] : "Error";
    }

答案 1 :(得分:2)

一旦您清楚了解资源查找行为,您就会得到答案。来自MSDN,它的工作原理如下:

  
      
  1. 查找过程检查资源中请求的密钥   由设置属性的元素定义的字典。
  2.   
  3. 然后,查找过程将逻辑树向上遍历到父元素   和它的资源字典。这一直持续到根元素为止   达到。
  4.   
  5. 接下来,检查应用程序资源。应用   资源是资源字典中的那些资源   由WPF应用程序的Application对象定义。
  6.   

在你的情况下, 窗口不是UserControl的逻辑父。 因此,在那里找不到资源。因此,您可以 在应用程序资源下移动资源 ,以便它可用于您的UserControl。

<Application.Resources>
   <my:someobj x:Key="someResource" />
</Application.Resources>

答案 2 :(得分:1)

您可以将此问题解决为:

  

解决方案1:将资源someobj添加到ResourceDictionary并将其合并到App.xaml中   REsourceDictionary.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:my="clr-namespace:StackOverFlowValidations"
                >
<my:ABC x:Key="myObj"/>

  

的App.xaml

    <Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
  

解决方案2:将此资源添加到UserControl而不是Window。

     

解决方案3:将此资源添加到Window,因为DynamicRes就像

        public Window1()
    {
        InitializeComponent();
        this.Resources.Add("myObj", new ABC());
    }

 <TextBlock Text="{Binding Source={DynamicResource someResource}, Path=SomeText}" />