【问题标题】:How do I access a UserControl resource from a .net class如何从 .net 类访问 UserControl 资源
【发布时间】:2013-03-21 00:32:26
【问题描述】:

我正在尝试从我的 TreeViewGroupItemTemplateSelector 类访问 UserControl 中的资源。我无权访问TreeViewGroupItemTemplateSelector 类中的UserControl 类。我在格式化Uri 时遇到问题。

PackageExplorer.xamlUserControl,位于本地程序集的根命名空间中,该程序集还包含 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


【解决方案1】:

目前尚不清楚您要达到的目标 - 但据我了解...

如果您尝试加载整个用户控制 XAML 文件 - 作为资源

用户控件 XAML 不是“资源字典” - 我不确定可能会产生什么错误。

只是将事物分开。您可以使用 MergeDictionary 将任何外部“资源字典”XAML 合并到 UserControl.Resources - 但将该“资源”作为文件单独保存 - 加载它,而不是整个用户控件,希望对您有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2018-01-06
    • 1970-01-01
    相关资源
    最近更新 更多