我的StaticResource
Window.Resources
<my:someobj x:Key="someResource" />
我在窗口内有一个用户控件。我需要在我的用户控件中引用上面的资源,我该怎么做?我无法将资源移动到单独的字典文件中。
<TextBlock Text="{Binding Source={StaticResource someResource}, Path=SomeText}" />
上面给出了编译错误,找不到someResource
。我如何参考someResource
?
答案 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,它的工作原理如下:
- 查找过程检查资源中请求的密钥 由设置属性的元素定义的字典。
- 然后,查找过程将逻辑树向上遍历到父元素 和它的资源字典。这一直持续到根元素为止 达到。
- 接下来,检查应用程序资源。应用 资源是资源字典中的那些资源 由WPF应用程序的Application对象定义。
醇>
在你的情况下, 窗口不是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}" />