以编程方式访问ResourceDictionary项

slu*_*ter 16 silverlight resources resourcedictionary controltemplate silverlight-3.0

我有一个名为"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>
Run Code Online (Sandbox Code Playgroud)

我的问题是:从MyImageColumn,我如何以编程方式引用/加载此控件模板,以便将其分配给列上的属性?我希望使用类似这样的语法:

ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能获得此资源字典中的各个项目?

slu*_*ter 30

得到了解决.

我需要:

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

作为加载资源字典的一部分,我还必须注册packURI方案.然后由于我的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"];
Run Code Online (Sandbox Code Playgroud)

我已在此博客文章中公布了此解决方案的完整详细信息.

  • 节省了我很多时间.非常感谢博客文章.很好. (2认同)
  • 只是注意为什么@slugster做了前两行.默认情况下不会加载和注册`pack` Uri样式,导致`Uri uri = new Uri(任何包Uri样式字符串);`抛出异常.这种获取注册的方式对代码的干扰不如等到你创建第一个`FrameworkElement`之后才允许自己使用`pack` Uri. (2认同)