Silverlight 以编程方式访问ResourceDictionary项

Silverlight 以编程方式访问ResourceDictionary项,silverlight,silverlight-3.0,resources,controltemplate,resourcedictionary,Silverlight,Silverlight 3.0,Resources,Controltemplate,Resourcedictionary,我有一个Silverlight控件程序集,名为“MySilverlightControls”。我有一个类,它扩展了第三方供应商提供的网格列,我们称之为“MyImageColumn.cs” 我还创建了一个名为Generic.xaml的资源字典,它位于程序集的Themes文件夹中。在该资源字典中,我定义了一个名为MyImageColumnTemplate的控制模板: 但它总是返回null。当我在Reflector中加载程序集时,我看到Generic.xaml文件在那里,资源的名称是MySilverl

我有一个Silverlight控件程序集,名为“MySilverlightControls”。我有一个类,它扩展了第三方供应商提供的网格列,我们称之为“MyImageColumn.cs”

我还创建了一个名为
Generic.xaml
的资源字典,它位于程序集的
Themes
文件夹中。在该资源字典中,我定义了一个名为MyImageColumnTemplate的控制模板:

但它总是返回null。当我在Reflector中加载程序集时,我看到
Generic.xaml
文件在那里,资源的名称是
MySilverlightControls.g.resources
,其中的路径是
themes/Generic.xaml

如何准确地找到此资源字典中的各个项目?

已解决此问题

我需要:

  • 加载我的资源字典
  • 将其与应用程序的资源合并
  • 从应用程序资源加载我的控件模板
作为加载资源字典的一部分,我还必须注册
pack
URI方案。然后,我不得不处理一些疯狂的基于COM的异常,因为我的xaml有一些小错误。我还必须将我的xaml移动到一个单独的资源字典文件中,尝试通过generic.xaml执行此操作。xaml不断抛出错误(即使xaml是无故障的,并且可以使用新创建的资源字典文件很好地加载)。所以,简化一下,这就是代码:

if (!UriParser.IsKnownScheme("pack"))
    UriParser.Register(new GenericUriParser(GenericUriParserOptions.GenericAuthority), "pack", -1);

ResourceDictionary dict = new ResourceDictionary();
Uri uri = new Uri("/MySilverlightControls;component/themes/Dictionary1.xaml", UriKind.Relative);
dict.Source = uri;
Application.Current.Resources.MergedDictionaries.Add(dict);
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];

我已在中发布了此解决方案的完整详细信息。

为我节省了大量时间。非常感谢你的博客帖子。干得好。请注意@slugster为什么要写前两行。默认情况下,
pack
Uri样式未加载和注册,导致
Uri=newuri(任何packuri样式字符串)
以引发异常。与创建第一个
FrameworkElement
之后才允许自己使用
pack
Uri相比,这种注册方式对代码的干扰更小。
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];
if (!UriParser.IsKnownScheme("pack"))
    UriParser.Register(new GenericUriParser(GenericUriParserOptions.GenericAuthority), "pack", -1);

ResourceDictionary dict = new ResourceDictionary();
Uri uri = new Uri("/MySilverlightControls;component/themes/Dictionary1.xaml", UriKind.Relative);
dict.Source = uri;
Application.Current.Resources.MergedDictionaries.Add(dict);
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];