以编程方式访问ResourceDictionary项目

16

我有一个名为"MySilverlightControls"的Silverlight控件程序集。在该程序集中,有一个从第三方供应商继承了网格列的类,我们称之为"MyImageColumn.cs"。

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

<ControlTemplate x:Name="MyImageColumnTemplate" >
    <Grid Margin="8,8,4,4" MaxHeight="32" MaxWidth="32">
        <Grid.Resources>
            <localGrid:StatusColumnImageConverter x:Key="ImageContentConverter"/>
        </Grid.Resources>
        <Border Margin="5,5,0,0" Background="Black" Opacity="0.15" CornerRadius="5" />
        <Border Background="#FF6E6E6E" CornerRadius="4,4,4,4" Padding="4" Margin="0,0,5,5">
            <Border Background="White" CornerRadius="2,2,2,2" Padding="3">
                <Image Source="{Binding EditValue, Converter={StaticResource ImageContentConverter}}" Stretch="Uniform"/>
            </Border>
        </Border>
    </Grid>
</ControlTemplate>
我的问题是:从MyImageColumn列中,我应该如何以编程方式引用/加载此控件模板,以便将其分配给列上的属性?我希望使用类似于以下语法的语法:
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];

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

我应该如何访问此资源字典中的各个项?

1个回答

30

问题已解决。

我需要:

  • 加载我的资源字典
  • 将其与应用程序的资源合并
  • 从应用程序资源中加载我的控件模板

在加载资源字典的过程中,我还需要注册pack URI方案。之后,由于我的xaml存在一些轻微的错误,导致了一些疯狂的基于COM的异常。我还需要将我的xaml移动到单独的资源字典文件中,尝试通过generic.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"];
我已经在这篇博客文章中发布了此解决方案的完整细节。 链接

2
节省了我很多时间。非常感谢您的博客文章。做得很好。 - captonssj
2
关于@slugster为什么要写前两行代码的说明。默认情况下,pack Uri样式未加载和注册,导致Uri uri = new Uri(any pack Uri style string);抛出异常。这种获取方式比等到创建第一个FrameworkElement后才允许使用pack Uri对您的代码更少干扰。 - Jesse Chisholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接