我有一个名为“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
。
我如何才能获得此资源字典中的各个项目?
答案 0 :(得分: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"];
我已在this blog post中发布了此解决方案的完整详细信息。