示例:WPF中DataTemplateKey如何使用

一、目的:简单介绍WPF中DataTemplateKey如何使用

在 WPF 中,DataTemplateKey 通常用于在资源字典中定义和引用数据模板。通过使用 DataTemplateKey,你可以在不同的控件中重用相同的数据模板。以下是如何在你的 MainWindow.xaml 文件中使用 DataTemplateKey 的示例。

二、实现

1,在资源中定义

XML 复制代码
    <Application.Resources>
        <DataTemplate DataType="{x:Type h:Student}">
            <TextBlock Text="我是全局定义的模板"/>
        </DataTemplate>
    </Application.Resources>

如上,在Apllication中定义了一个包含x:Key的DataTemplate,默认在程序中定义的h:Student元素将都按全局设置的模板去显示,但存在如下情况这种逻辑是没有起作用

cs 复制代码
            VisualBrush visualBrush = new VisualBrush();
            ContentPresenter contentPresenter = new ContentPresenter();
            contentPresenter.Content = new Student();
            visualBrush.Visual = contentPresenter;
            contentPresenter.InvalidateMeasure();
            contentPresenter.InvalidateArrange();
            this.Background = visualBrush;

我在后台定义了一个ContentPresenter,使用Student作为数据,将ContentPrensenter作为VisualBrush作为Background添加到控件中,这时在Application中定义的DataTemplate没有应用到VisualBrush,这是因为VisualBrush跟Application没有逻辑树关系,此时ContentPrensenter不会遵循Resources规则去找资源,此时就需要用到DataTemplateKey来解决这种问题。

如下定义DataTemplateKey并应用到ContentPresenter中即可解决

cs 复制代码
            VisualBrush visualBrush = new VisualBrush();
            ContentPresenter contentPresenter = new ContentPresenter();
            DataTemplateKey dataTemplateKey = new DataTemplateKey(typeof(Student));
            contentPresenter.ContentTemplate=Application.Current.FindResource(dataTemplateKey) as DataTemplate;
            contentPresenter.Content = new Student();
            visualBrush.Visual = contentPresenter;
            contentPresenter.InvalidateMeasure();
            contentPresenter.InvalidateArrange();
            this.Background = visualBrush;

1、定义Key

DataTemplateKey dataTemplateKey = new DataTemplateKey(typeof(Student));

2、查找并应用DataTemplate
contentPresenter.ContentTemplate=Application.Current.FindResource(dataTemplateKey) as DataTemplate;

需要了解的知识点

DataTemplateKey 类 (System.Windows) | Microsoft Learn

DataTemplate Class (System.Windows) | Microsoft Learn

LogicalTreeHelper 类 (System.Windows) | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关推荐
爱炸薯条的小朋友4 小时前
C#由窗体原子表溢出造成的软件闪退,根本原因补充
开发语言·c#·wpf
晚风一隅16 小时前
阿里云盘古存储系统:EB级分布式存储的架构革命与技术突破
wpf
步步为营DotNet1 天前
深挖.NET 11:.NET Aspire 在云原生应用状态管理的创新与实践
云原生·.net·wpf
He BianGu1 天前
【项目】WPF VisionMaster 4.0 项目介绍和开发文档
c#·wpf·流程图·开发文档·机器视觉·visionmaster
He BianGu1 天前
【笔记】在WPF中PriorityBinding的详细介绍
笔记·wpf
bugcome_com2 天前
WPF + Prism 技术指南与实战项目(一、自行搭建)
wpf·prism
她说彩礼65万3 天前
WPF Border
wpf
He BianGu3 天前
【笔记】在WPF中在IValueConverter 时“无法返回有效值该怎么做”
笔记·wpf
海兰3 天前
使用 OpenTelemetry 与 Elastic APM 追踪 MCP 服务器工具调用
运维·服务器·elasticsearch·wpf
咩图4 天前
WPF-VisualStudio-C#-Fluent.Ribbon8.0.0学习
c#·wpf·visual studio