16

我有一个名为“MySilverlightControls”的Silverlight控件组合件。几个文件夹放入该程序集我有一个类从第三方供应商扩展网格列,我们称之为“MyImageColumn.cs”。以编程方式访问ResourceDictionary项目

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

<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

我该如何到达此资源字典中的各个项目?

回答

30

把它解决了。

我需要:

  • 载入我的资源字典
  • 与应用程序的资源进行合并
  • 从应用程序资源

载入我的控制模板加载资源的一部分字典,我还必须注册pack URI方案。然后我必须处理一些基于COM的疯狂例外,因为我的xaml存在轻微错误。我还必须将我的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"]; 

我已经张贴在this blog post该解决方案的全部细节。

+2

为我节省了很多时间。非常感谢博客文章。做得好。 – captonssj 2013-05-07 23:04:56

+2

只需记下@slugster为什么做了前两行。 'pack' Uri样式默认没有加载和注册,导致'Uri uri = new Uri(任何包Uri样式的字符串);'抛出一个异常。在允许自己使用'pack' Uri之前,这种获得注册的方式对你的代码的干扰要比等到你创建第一个'FrameworkElement'之后要少。 – 2015-10-08 22:39:56