WPF FlowDocument结构详解

FlowDocument

一、介绍

FlowDocument是WPF中的流文档,用来承载大段文章。可以用来显示文章。或者在RichTextBox中编辑文章。
FlowDocument没有多少方法,但有大量的属性,用来设置文章的字体,字体大小,前景色,背景色之类的。
但这些都没什么特别的,最重要的,是FlowDocument的结构。

二、FlowDocument的结构

一个流文档(文章)可以分为3层。
最顶层是FlowDocument,相当于一篇文章,包含了复数个段落。
第二层是Block,相当于一个段落,包含了复数个句子。
最底层是Inline,相当于一个句子,用于承载具体内容。
同时,每一层的结构都是一个链表。
虽然BlockInline都有多个实现类,但本文探讨的是抽象的结构,因此,使用抽象父类来解释更好理解。

1.第一层FlowDocument

FlowDocument的属性Blocks,承载了第二层所有Block
因为是链表结构,所以不能根据下标获取指定的Block
但有两个属性FirstBlockLastBlock用于链表第一个Block和最后一个Block

2.第二层Block

Block是一个抽象父类,指代一种块级元素,意思就是,一定会换行。
因为是链表结构,每一个Block也可以获取它的上一个Block或下一个Block
他有多种实现形式,有时是包含多个Inline的段落,有时也是包含多个Block的大段落。

Block的其中两种实现

2.1 Section

也用来承载复数Block。因此也有一个Blocks属性。结构和FlowDocument相同。

2.2 Paragraph

用来承载复数Inline。他有一个Inlines属性。承载了第三层的Inline。也是链表结构,所有也不能根据下标获取指定的Inline。使用FirstInlineLastInline来表示第一个Inline和最后一个Inline

3.第三层Inline

Inline也是抽象父类,指代一种行级元素,意思是,不一定会换行。
每一个Inline也可以获取他的上一个Inline或下一个Inline
也有多种实现形式,有时是包含文字的句子,有时也可以包含多个Inline的大句子。

Inline的其中两种实现。

3.1 Run

用来承载文字。他的关键属性Text。赋值后就可以显示,可以说是FlowDocument中最底层,直接显示文字的类。结构到这里就算结束了。

3.2 Span

用来承载复数Inline。也有一个Inlines属性,结构和Section相同。

以上,结构介绍完毕。可以看出BlockInline结构也非常相似。
他们都是链表。
他们都可以作为容器承载复数条同一级的元素。

三、更多情报

关于BlockInline的详细介绍,可以看看我另外两篇文章。
里面会详细介绍他们的特性以及实现类。

关于BlockWPF FlowDocument中的Block级元素

关于InlineWPF FlowDocument中的Inline级元素

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WPF(Windows Presentation Foundation)是一个用于创建 Windows 应用程序的框架,而 Prism 是一个基于 WPF 的框架,它提供了一组设计模式和工具,用于帮助开发人员创建可扩展、可重用和易于维护的应用程序。 在 Prism 中,ViewModel 是一个重要的组件,它的作用是将 View(即用户界面)与 Model(即数据和业务逻辑)解耦,使得两者可以独立进行开发和测试。 在 Prism 中,ViewModel 通常是一个简单的类,它实现了 INotifyPropertyChanged 接口,用于实现数据绑定。ViewModel 还包含了一些命令(Command),用于处理用户交互事件,比如按钮点击、菜单选择等。ViewModel 还可以使用服务(Service)来访问 Model,以获取或操作数据。 下面是一个简单的 ViewModel 的示例: ```csharp public class MainViewModel : BindableBase { private readonly IMyService _myService; private string _name; public string Name { get { return _name; } set { SetProperty(ref _name, value); } } private ICommand _helloCommand; public ICommand HelloCommand { get { if (_helloCommand == null) { _helloCommand = new DelegateCommand(ExecuteHelloCommand); } return _helloCommand; } } public MainViewModel(IMyService myService) { _myService = myService; } private void ExecuteHelloCommand() { string message = _myService.GetMessage(Name); MessageBox.Show(message); } } ``` 在上面的代码中,MainViewModel 包含了一个字符串属性 Name 和一个 ICommand 属性 HelloCommand。Name 属性用于将用户界面中的文本框绑定到 ViewModel 中,而 HelloCommand 则表示用户点击“Hello”按钮时要执行的命令。HelloCommand 的实现是通过调用一个服务(IMyService)来获取一条消息,然后通过 MessageBox 显示出来。 需要注意的是,MainViewModel 的构造函数中注入了一个 IMyService 接口,这个接口封装了对数据和业务逻辑的访问,使得 ViewModel 可以与具体的实现解耦。这种依赖注入的方式可以使得应用程序的组件更加松散耦合,更加易于维护和测试。 总之,ViewModel 是 WPF Prism 中非常重要的一个组件,它用于实现视图与模型之间的解耦和交互。开发人员可以使用 ViewModel 实现数据绑定、命令处理、服务访问等功能,从而创建可扩展、可重用和易于维护的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑我归无处

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值