从没有密钥的代码创建 XAML 资源

Posted

技术标签:

【中文标题】从没有密钥的代码创建 XAML 资源【英文标题】:Creating a XAML Resource from Code Without a Key 【发布时间】:2010-09-13 13:12:24 【问题描述】:

有没有办法从代码中将资源添加到 ResourceDictionary 而不给它一个资源键?

例如,我在 XAML 中有这个资源:

<TreeView.Resources>
    <HierarchicalDataTemplate DataType="x:Type xbap:FieldPropertyInfo"
        ItemsSource="Binding Path=Value.Values">
            <TextBlock Text="Binding Path=Name" />
    <HierarchicalDataTemplate>
</TreeView.Resources>

我需要从代码中动态创建此资源并将其添加到 TreeView ResourceDictionary。但是,在 XAML 中没有 Key 意味着它默认用于所有 FieldPropertyInfo 类型。有没有办法在没有密钥的情况下将它添加到代码中的资源中,或者有没有办法我可以使用一个密钥并仍然在所有 FieldPropertyInfo 类型上使用它?

到目前为止,这是我在 C# 中所做的:

HierarchicalDataTemplate fieldPropertyTemplate = new HierarchicalDataTemplate("FieldProperyInfo");

fieldPropertyTemplate.ItemsSource = new Binding("Value.Values");

this.Resources.Add(null, fieldPropertyTemplate);

显然,将资源添加到 ResourceDictionary 键为 null 不起作用。

【问题讨论】:

【参考方案1】:

使用您希望模板应用的类型作为键:

HierarchicalDataTemplate fieldPropertyTemplate = new 
    HierarchicalDataTemplate("FieldProperyInfo");

fieldPropertyTemplate.SetBinding(
   HierarchialDataTemplate.ItemSourceProperty, 
   new Binding("Value.Values");
this.Resources.Add(FieldPropertyInfo.GetType(), fieldPropertyTemplate);

您的代码不起作用的原因是您的实际上没有设置绑定。您需要调用 SetBinding,并使用您希望绑定绑定到的属性。

【讨论】:

【参考方案2】:

使用您希望模板应用的类型作为键:

this.Resources.Add(FieldPropertyInfo.GetType(), fieldPropertyTemplate);

与上面的模板一样,您提供了一个类型。您必须提供名称或类型。

【讨论】:

虽然运行,但 TreeView 并未使用模板。似乎有关 Resource 密钥的某些内容正在阻止它被使用。 @Orion:所以你看到了我的答案,并完全编辑了你的答案来复制我的?真的很优雅...

以上是关于从没有密钥的代码创建 XAML 资源的主要内容,如果未能解决你的问题,请参考以下文章

在 windows phone 8 项目中找不到具有名称/密钥的资源

如何在 UWP 类库中使用 XAML 静态资源和设计时数据

从没有“时区校正”的组件创建 NSDate

如何在 XAML 中“创建”的代码中访问控制

在 PHP 中从没有 ffmpeg 的视频创建缩略图

在运行时创建的控件没有窗口。无法从没有窗口的视图中显示弹出框