1238 字
6 分钟
[.NET] WPF XAML 原理, 节点与实例, 以及一些重要的零碎知识点.

当你查资料时, 看到那些眼花缭乱的 xaml 代码, 让人瞬间没有了学习的欲望… 先试着寻找下其中的规律吧.

节点与实例:#

首先看看上面的文章, 从我们最常接触的 Button 入手吧. Button 是可以用 CS 代码来进行实例化, 然后放置在窗口中的, 而其它的元素, 例如根节点 Window, 都是可以通过 CS 代码进行实例化.

可以推测出, 在 xaml 中, 一个个的节点, 例如 Button, Label, 其实就是等同于声明一个对应类型的实例.

那么如何在 CS 代码中访问这个实例呢? 很简单, 为这个实例指定一个名称(Name), 就如上面的图片中为 Label 指定 Name 那样. 然后就可以在 CS 代码中访问了

实例的属性:#

如果要设置一个 Label 的 Content, 在 xaml 代码中, 该如何设置? 最常用的肯定是下面这个: xaml 还支持一种, 就是这样: 其实 TextBox 的 Text 属性也是可以这么设置的: 大概猜出了吧? xaml中, 一堆标签之间的值可以设置为对应实例的特定属性设置值. 例如 Label 就是设置Content, TextBox 就是 设置 TextBox.

其实, 还有另外一种, 你肯定见过啦, Grid.RowDefinitions 就是这么用的. 你可能会想到, Label 和 TextBox 这类普通的控件, 是否也支持呢?

哈哈, 很有趣吧, 所以说, 以后看到什么 xaml 代码, 对应的 CS 代码也能猜出来一些, 毕竟如果是控件, 也无非是设置属性以及添加成员了, 噢, 下面就是添加成员咯.

声明控件成员:#

如果一个控件可以有子成员, 就可以像上面那样声明, 当然, 这个也肯定经常用, 只是可能没注意过罢了.

自定义类型实例:#

少年, 学过数据绑定吗? 数据绑定的上下文如何声明的, 应该还记得吧. 我之前就像一个憨憨一样, 去用 CS 代码来指定 DataContext. (文章末有关于数据绑定的文章推荐) 但是,,, 刚刚我们说过, 想 Button, Label 这样的 UI 组件, 其实在声明后, 其实就是一个个的实例, 我们刚刚进行的指定上下文操作, 也是创建一个 TestModel 实例, 然后指定给这个窗口的 DataContext 属性.

如何指定属性, 我们知道, 那如何在 xaml 中创建我们自己定义的类型实例呢? 下面是一个示例: 你悟了吗? 通过这个, 我们就可以在 xaml 中声明实例了… 当然, 肯定有小聪明在想, “我试试在 xaml 里面声明一个浮点数试试?” 没错, 那个憨憨就是我, 亲自尝试了一下, 不过也不算是没有收获, 至少我们可以知道, 这些实例的声明, 肯定是在特定的情况下才是可以的. 例如这个 Grid 子元素, 你必须指定一个 UIElement, 这跟 CS 代码里的一模一样hhh

所以 xaml 跟 CS 还是相关联的哈哈哈, 我一开始还觉得 xaml 跟 CS 的关联不是很大呢.

查看窗体完整代码:#

如果你用过 WinForm, 肯定会经常接触这个, 当指定了控件的某些事件, 而这个函数又不存在的时候肯定需要自己调整代码的: WinForm 的窗体完整代码就在这里了, 一到WPF, 就令人窒息了, 因为没有直接显示这个文件.

不过, 你还是可以通过这样的方式去查看的: 然后, 欢呼吧, 虽然一般很少动这个文件(你也没办法动, 自动生成会覆盖你的改动), 但是看这个东西, 肯定对学习 WPF 有帮助的.

窗体类型:#

其实这里只是指 xaml 中, Window 节点的 x属性, 我们知道, WPF 会有一些自动生成的代码, 这些代码中声明了这个窗体, 而这个生成的代码中窗体的命名空间和类名, 就是通过 xaml 文档中的 x属性指定的.

例如我指定 x=“MvvmTest.View.MainWindow”, 那么完整代码中就是这样的: 所以说, 如果要改变这个窗体的命名空间, 你需要指定 x属性, 以及指定 xaml.cs 文件的命名空间.

例如, 你将一个窗体从项目的根目录移动到了项目的View文件夹, 此时, 规范的做法应该是同时将这个窗体的命名空间添加上一个View.






看的这么开心, 赶快关注诺尔吧qwq, 别忘了点个赞噢~


推荐文章: [C#] MCI 详解与封装类, MCI 播放音乐, 获取播放状态, 获取音频长度, 进度调整 [.NET] WPF 数据绑定与 MVVM 模型

[.NET] WPF XAML 原理, 节点与实例, 以及一些重要的零碎知识点.
https://slimenull.com/posts/20210215112610/
作者
SlimeNull
发布于
2021-02-15
许可协议
CC BY-NC-SA 4.0