WPF 框架开发 ColumnDefinition 和 RowDefinition 的代码在哪
我的 VisualStudio 在更新到 2022 就构建不通过 WPF 仓库,提示我在 Grid 的代码里面找不到 ColumnDefinitionCollection 和 RowDefinitionCollection 等的定义,在我开始找 WPF 仓库关于这几个类型的定义时,居然找不到对应的源代码。本文来告诉大家在 WPF 仓库里面是如何存放几个类型
在上一篇博客 手把手教你如何构建 WPF 官方开源框架源代码 告诉大家如何进行本地构建,本文将此基础上继续进行解决在 VisualStudio 2022 预览版构建失败的坑,顺便告诉大家在 WPF 仓库里面那些有趣的代码存放方法
本文非新手友好,本文的 WPF 框架开发不是说开发一个基于 WPF 框架的应用,也不是指开发 WPF 应用。而是开发 WPF 这个框架,这是做底层开发的博客
以下是在 VisualStudio 2019 进行构建,十分简单,只需要部署环境完成之后进行构建即可

然而在 VisualStudio 2022 里面,将会在构建的时候提示失败
“f:\lindexi\Code\wpf\Microsoft.Dotnet.Wpf.sln”(默认目标) (1:2) ->
“f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj”(默认目标) (11:28) ->
(CoreCompile 目标) ->
f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\System\Windows\Controls\Grid.cs(309,16): error CS0246: 未能找到类型或命名空间名“ColumnDefinitionCollection”(是否缺少 using 指令或程序集引用?)
[f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj]
f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\System\Windows\Controls\Grid.cs(324,16): error CS0246: 未能找到类型或命名空间名“RowDefinitionCollection”(是否缺少 using 指令或程序集引用?) [f:\lindexi
\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj]
f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\System\Windows\Controls\Grid.cs(3347,22): error CS0246: 未能找到类型或命名空间名“ColumnDefinitionCollection”(是否缺少 using 指令或程序集引用?)
[f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj]
f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\System\Windows\Controls\Grid.cs(3348,22): error CS0246: 未能找到类型或命名空间名“RowDefinitionCollection”(是否缺少 using 指令或程序集引用?) [f
:\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj]
f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\System\Windows\Controls\Grid.cs(4151,21): error CS0246: 未能找到类型或命名空间名“ColumnDefinitionCollection”(是否缺少 using 指令或程序集引用?)
[f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj]
f:\lindexi\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\System\Windows\Controls\Grid.cs(4152,21): error CS0246: 未能找到类型或命名空间名“RowDefinitionCollection”(是否缺少 using 指令或程序集引用?) [f
:\Code\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj]
我进入了 WPF 仓库里面,想要看看 ColumnDefinitionCollection 和 RowDefinitionCollection 等的定义,但是在 VisualStudio 里面实际上是找不到这几个类的代码的
原因是在 WPF 中,上古的开发者觉得 RowDefinitionCollection 和 ColumnDefinitionCollection 的代码差不多,而 ColumnDefinition 和 RowDefinition 的代码也差不多,于是就想用黑科技,通过配置生成这些类型。可以在 WPF 仓库的 src\Microsoft.DotNet.Wpf\src\PresentationFramework\MS\Utility 文件夹看到很多有趣的逻辑,在此文件夹可以看到如下的几个文件
ColumnDefinition.ti
GridContentElementCollection.tb
GridContentElementCollection.th
RowDefinition.ti
打开 GridContentElementCollection.tb 文件,可以看到这里面的代码定义就特别有趣,以下是删减的部分
namespace System.Windows.Controls
{
/// <summary>
/// A <<collectiontype>> is an ordered, strongly typed, non-sparse
/// collection of <<itemtype>>s.
/// </itemtype></collectiontype></summary>
/// <remarks>
/// <<collectiontype>> provides public access for <<itemtype>>s
/// reading and manipulation.
/// </itemtype></collectiontype></remarks>
public sealed class <<collectiontype>> : IList<<<itemtype>>> , IList
{
//------------------------------------------------------
//
// Constructors
//
//------------------------------------------------------
#region Constructors
/// <summary>
/// Default ctor.
/// </summary>
internal <<collectiontype>>(<<ownertype>> owner)
{
_owner = owner;
PrivateOnModified();
}
#endregion Constructors
}
/// <summary>
/// <<itemtype>> is a FrameworkContentElement used by Grid
/// to hold column / row specific properties.
/// </itemtype></summary>
public class <<itemtype>> : DefinitionBase
{
//------------------------------------------------------
//
// Constructors
//
//------------------------------------------------------
#region Constructors
/// <summary>
/// Default ctor.
/// </summary>
public <<itemtype>>()
: base(DefinitionBase.ThisIs<<itemtype>>)
{
}
#endregion Constructors
//------------------------------------------------------
//
// Public Properties
//
//------------------------------------------------------
#region Public Properties
/// <summary>
/// Sets specified <<widthheight>> value for the <<itemtype>>.
/// Returns current <<widthheight>> value for the <<itemtype>>.
/// </itemtype></widthheight></itemtype></widthheight></summary>
public GridLength <<widthheight>>
{
get { return (base.UserSizeValueCache); }
set { SetValue(<<widthheight>>Property, value); }
}
/// <summary>
/// Sets specified Min<<widthheight>> value for the <<itemtype>>.
/// Returns current Min<<widthheight>> value for the <<itemtype>>.
/// </itemtype></widthheight></itemtype></widthheight></summary>
[TypeConverter(typeof(LengthConverter))]
public double Min<<widthheight>>
{
get { return (base.UserMinSizeValueCache); }
set { SetValue(Min<<widthheight>>Property, value); }
}
/// <summary>
/// Sets specified Max<<widthheight>> value for the <<itemtype>>.
/// Returns current Max<<widthheight>> value for the <<itemtype>>.
/// </itemtype></widthheight></itemtype></widthheight></summary>
[TypeConverter(typeof(LengthConverter))]
public double Max<<widthheight>>
{
get { return (base.UserMaxSizeValueCache); }
set { SetValue(Max<<widthheight>>Property, value); }
}
/// <summary>
/// Returns calculated device independent pixel value of <<widthheight>> for the <<itemtype>>.
/// </itemtype></widthheight></summary>
public double Actual<<widthheight>>
{
get
{
double value = 0.0;
if (base.InParentLogicalTree)
{
value = ((Grid)base.Parent).GetFinal<<itemtype>><<widthheight>>(base.Index);
}
return (value);
}
}
}
}
可以看到,如果将上面代码的 <<collectiontype>> 等内容替换掉,那不就是实际上的类型定义了?实际上就是如此,还请打开一下 ColumnDefinition.ti 和 RowDefinition.ti 文件看一下,以下是 ColumnDefinition.ti 文件的内容
::BEGIN_TEMPLATE
COLLECTIONTYPE:ColumnDefinitionCollection
ITEMTYPE:ColumnDefinition
OWNERTYPE:Grid
WIDTHHEIGHT:Width
::END_TEMPLATE
::END
从上面代码可以看到,从某个 <<foo>> 替换的规则也就可以猜到了。如将 <<collectiontype>> 根据 COLLECTIONTYPE:ColumnDefinitionCollection 的规则,替换为 ColumnDefinitionCollection 即可。同理替换其他的逻辑
其实在 WPF 里面,即使在 VisualStudio 2022 也是有自动生成的,不需要咱做什么科技
还请看看如下两个文件
f:\lindexi\Code\wpf\artifacts\obj\PresentationFramework\Debug\net6.0\ColumnDefinition.cs
f:\lindexi\Code\wpf\artifacts\obj\PresentationFramework\Debug\net6.0\RowDefinition.cs
那为什么我在本文开始依然构建失败呢?那就是需要问问神奇的 VisualStudio 2022 啦,因为在 VisualStudio 2022 预览版在生成了如上两个文件之前,就先跑去构建 Grid.cs 文件啦
那另一个问题是,是哪个逻辑负责生成以上的文件的?请打开 src\Microsoft.DotNet.Wpf\src\PresentationFramework\template.pl 文件,这是由古老的 perl 提供的黑科技。相信 Perl 只有上古的开发者才知道这是什么啦。本文不想去聊 Perl 的内容,原因是我也不知道,也不想去学
更多 WPF 框架构建相关,请看
WPF 框架开发 ColumnDefinition 和 RowDefinition 的代码在哪的更多相关文章
- WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)
时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码) 已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主 ...
- [原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略
原文:[原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略 .NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略 前言:之前的讨论一直关注在怎么从D ...
- [原创].NET 业务框架开发实战之八 业务层Mapping的选择策略
原文:[原创].NET 业务框架开发实战之八 业务层Mapping的选择策略 .NET 业务框架开发实战之八 业务层Mapping的选择策略 前言:在上一篇文章中提到了mapping,感觉很像在重新实 ...
- 【我们一起写框架】MVVM的WPF框架(五)—完结篇
前言 这篇文章是WPF框架系列的最后一篇,在这里我想阐述一下我对框架设计的理解. 我对框架设计的理解是这样的: 框架设计不应该局限于任何一种设计模式,我们在设计框架时,应该将设计模式揉碎,再重组:这样 ...
- 【我们一起写框架】MVVM的WPF框架(一)—序篇
前言 我想,有一部分程序员应该是在二三线城市的,虽然不知道占比,但想来应该不在少数. 我是这部分人群中的一份子. 我们这群人,面对的客户,大多是国内中小企业,或者政府的小部门.这类客户的特点是,资金有 ...
- 【我们一起写框架】MVVM的WPF框架(二)—绑定
MVVM的特点之一是实现数据同步,即,前台页面修改了数据,后台的数据会同步更新. 上一篇我们已经一起编写了框架的基础结构,并且实现了ViewModel反向控制Xaml窗体. 那么现在就要开始实现数据同 ...
- 【我们一起写框架】MVVM的WPF框架(三)—数据控件
这世上,没人能一次性写出完美无缺的框架:因为,任何一个框架都需要项目的淬炼,然后才能升华,趋近完美. 所以,框架是个反复修改的东西,最终形成的东西. 如果你学了一点技术,觉得自己可以写出框架了,觉得自 ...
- 【我们一起写框架】MVVM的WPF框架(四)—DataGrid
前言 这个框架写到这里,应该有很多同学发现,框架很多地方的细节,其实是违背了MVVM的设计逻辑的. 没错,它的确是违背了. 但为什么明知道违背设计逻辑,还要这样编写框架呢? 那是因为,我们编写的是框架 ...
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
随机推荐
- Bitmap优化详谈
目录介绍 01.如何计算Bitmap占用内存 1.1 如何计算占用内存 1.2 上面方法计算内存对吗 1.3 一个像素占用多大内存 02.Bitmap常见四种颜色格式 2.1 什么是bitmap 2. ...
- 记录--怎么实现一个3d翻书效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现: 第一种是整页翻转的效果: 这种整页翻转的效果主要是做rotateY的动画,并结合一些CSS的3d属性 ...
- 记录--微信调用jssdk全流程详解
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 微信调用jssdk全流程详解 系统框架使用的是前后端分离,前端使用vant,后端是springboot 一.网页授权的时序图 二.公众号配 ...
- js前端 md5加密
1.在utils目录下新建md5.js 在这里,我把md5()这个方法使用export进行了导出,方便在其他地方使用es6 import 引入使用 /* * JavaScript MD5 1.0.1 ...
- 【已解决】Hadoop_07 Hadoop启动超时失败
- 微服务集成Spring Cloud Alibaba Seata (二) 客户端连接
通过上篇文章后我们的Seata服务就部署成功了,如果还不清楚怎么部署或者还没有部署Seata服务的朋友可以看我写的上篇文章进行服务部署.Seata部署步骤:https://www.cnblogs.co ...
- #线性基#CF1100F Ivan and Burgers
题目传送门 分析 线段树上直接维护线性基是三个log的.(一定要合并) 考虑一种分治做法,在 \([l,mid]\) 和 \((mid,r]\) 的询问分治处理, 跨过 \([mid,mid+1]\) ...
- Docker 解决 `denied: requested access to the resource is denied`
背景 由于不可描述的原因,相对于以前,最近在更加频繁的迁移服务器,简单的 Shell 脚本已经不能满足需求了,于是将所有的项目 Docker 化. 部分不含敏感配置的项目准备放到 DockerHub ...
- 两个专栏帮你搞定【图像拼接(image stitching)】
[图像拼接论文精读]专栏:图像拼接论文精读 [图像拼接源码精读]专栏:图像拼接论文源码精读 前言 图像拼接(image stitching)是计算机视觉中的高级图像处理手段,是一个小众方向,研究的人很 ...
- Redis 17 穿透 击穿 雪崩
使用缓存的问题 Redis 缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面. 但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解. 如 ...