【发布时间】:2013-03-21 00:32:26
【问题描述】:
我正在尝试从我的 TreeViewGroupItemTemplateSelector 类访问 UserControl 中的资源。我无权访问TreeViewGroupItemTemplateSelector 类中的UserControl 类。我在格式化Uri 时遇到问题。
PackageExplorer.xaml 是 UserControl,位于本地程序集的根命名空间中,该程序集还包含 TreeViewGroupItemTemplateSelector 类。
我收到以下错误:
找不到资源'resources/packageexplorer.xaml'
在 Uri 的实例化期间。
public class TreeViewGroupItemTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var configGroup = item as IConfigurationGroup;
if (configGroup == null)
return null;
var resourceDictionary = new ResourceDictionary();
resourceDictionary.Source = new Uri
("/myAssembly;component/Resources/myUserControl.xaml",
UriKind.RelativeOrAbsolute);
if (configGroup.ItemType == typeof (ReferencePackageConfigurationItem))
return resourceDictionary["RefreshableHierarchicalDataTemplate"] as DataTemplate;
else
return resourceDictionary["DefaultHierarchicalDataTemplate"] as DataTemplate;
}
}
}
XAML (sn-p) 如下所示:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<HierarchicalDataTemplate x:Key="DefaultHierarchicalDataTemplate"
DataType="{x:Type localconfig:ConfigurationGroup}"
ItemsSource="{Binding Path=Items}"
ItemTemplateSelector="{StaticResource TreeViewGroupItemTemplateSelector}"/>
<HierarchicalDataTemplate x:Key="RefreshableHierarchicalDataTemplate"
DataType="{x:Type localconfig:ConfigurationGroup}"
ItemsSource="{Binding Path=Items}"
ItemTemplateSelector="{StaticResource TreeViewGroupItemTemplateSelector}"/>
我也尝试访问资源,如下所示,结果相同:
resourceDictionary.Source = new
Uri("/Resources/myUserControl.xaml", UriKind.RelativeOrAbsolute);
和:
resourceDictionary.Source = new
Uri("myUserControl.xaml", UriKind.RelativeOrAbsolute);
【问题讨论】:
-
Pete,尝试将资源放在用户控件之外(将其合并到用户控件中,或使其全局可见) - 然后尝试加载该资源字典而不是用户控件。
-
@NSGaga,上面的评论有点混乱。 1)我不需要这个资源,除了在这个控件和 TemplateClass(在控件内使用)。我为什么要搬它? 2)您建议将其移出用户控件并将其合并到用户控件中?
-
是的,Pete - 目前尚不清楚您要实现的目标 - 据我了解,您正在尝试加载整个用户控制 XAML 文件 - 作为资源,对吧?用户控制 XAML 不是“资源字典”——我不确定会产生什么错误。但可以肯定的是,只是分开的事情。您可以使用
MergeDictionary将任何外部“资源字典”XAML 合并到UserControl.Resources- 但将该“资源”作为文件单独保存 - 加载它,而不是整个用户控件,希望现在有意义 -
啊……好的,谢谢@NSGaga。我假设 UserControl 中的资源可以从控件外部访问。我移到了一个单独的资源文件,并且有效。 :)
-
伟大的@Pete - 你应该把它标记为答案 - 我刚刚在这里发布了我所说的
标签: c# wpf xaml user-controls resourcedictionary