使用多个 wpf RichTextBox 的 MS Word 分页

发布于 2024-10-04 16:29:37 字数 378 浏览 2 评论 0原文

我的目标是让编辑器的行为类似于 MS-Word。Wpf RichTextBox 是一个很棒的控件。通过将其放置在 ScrollViewer 中,我们可以使其可编辑。(就像记事本)。但是我需要像 MS-Word 那样的页面一种有效的方法可能是将样式应用于scrollViewer,以便我们在richtextbox上创建多个页面的外观和感觉,但我不知道该怎么做。我们在项目中所做的是使用documentViewer。在固定页面内,创建页眉(Canvas)、正文(WpfRichTextBox)、页脚(Canvas)。因此创建多个页面,并通过订阅 RichTextBox sizechanged 事件,我们手动进行分页,即将块从一个页面移动到另一个页面,当高度发生变化时。您认为有更好的方法吗?使用多个 Richtextbox 是否会影响我的性能?

My aim is to make a editor behave similar to MS-Word.Wpf RichTextBox is a wonderful control for it.By placing it inside a ScrollViewer,we can make it editable.(Like a notepad).But I need MS-Word like pages.One effective way probably is to apply style to scrollViewer such that we create a look and feel of multiple pages on richtextbox but I dont know how to do it.What we are doing in the project is to use a documentViewer. Inside a FixedPage,create a Header(Canvas),Body(WpfRichTextBox),Footer(Canvas). And thus create multiple pages,and by subscribing to RichTextBox sizechanged event, we are manually doing the pagination i.e move the blocks from one page to another when height has changed. Do you see any better approach in doing this? Does using multiple richtextboxes hamper my performance?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

琉璃梦幻 2024-10-11 16:29:37

@WpfProgrammer 这是我想说的好方法。假设你有 1000 个页面,那么肯定会存在性能问题。为了避免这个问题,您需要进行请求分页。

虚拟寻呼:
1. 您需要构建一个页表,其中将包含页面。每个页面将包含有关页面的控件、图像、它们的位置、尺寸和样式的信息。 [所有可序列化数据]

2. 虚拟页面 - 你需要
反序列化所有数据
页面并创建一个页面
富文本框。虚拟页面是
只不过是预先缓存的页面
将被渲染。说是为了
例子。如果我在第一页。然后,
接下来我将反序列化 3
连续的页面并将它们放在一个
收藏。然后,重复这个
连续页的程序
动作。使用添加一些逻辑
最常用的集合。它
会足够快。如果是
1000 页。你可以崩溃
那些不脏或从未去过的
页。这可能会产生更多的成果
表现。如果表现相差甚远
更关心低硬件。
那么,你应该考虑
清洁。

3. 清洁-
清洁的过程是
识别LFU页面并删除
他们。这将非常有帮助,如果
性能更加明显。

@WpfProgrammer This is the good approach I would say. Say if you have 1000s of pages then, there will definitely be a performance problem. For avoiding that problem, you need to do demand paging.

Virtual Paging :
1. You need to construct a page table, which will contains pages. Each page will contains information about the controls, images, their positions, dimension and Styles for the page. [All serializable data]

2. Virtual Pages - You need to
de-serialize all the data for the
page and create a page with
RichTextBox. Virtual Pages are
nothing but, pre-cached pages that
are going to be rendered. Say for
example. If I'm in 1st page. Then,
I'll de-seriealize next 3
consecutive pages and have them in a
collection. Then, repeat this
procedure for consecutive page
movements. Adding some logic using
Most Frequently Used collection. It
will be fast enough. In the case of
1000's of pages. You can collapse
those non-dirty or never visited
pages. That could yield little more
performance. If performance is far
more concern for low hardwares.
Then, you should consider
cleaning.

3. Cleaning -
Cleaning is the process of
identifying LFU pages and remove
them. This would be very helpful if
performance is more pronounced.

为你拒绝所有暧昧 2024-10-11 16:29:37

嗨塔米姆
将 richTextBox 的最小高度和宽度设置为 A4 大小(可以说)。订阅 RichTextBox Size Changed 事件。一旦内容超出,该事件就会被触发。然后我将上一页的最后一个块推送到下一页的第一个块。(记住,如果页面不存在,则需要创建新页面然后将其添加为第一个块)。并且焦点也应该更改到新页面。(因为如果您在最后一个 RTB 处按 Enter 键,您希望焦点位于新页面中。)。当用户删除某个页面中的一个块(比如说第2个),那么你需要将底部页面的所有块添加到该页面中,这样我们的分页逻辑就会再次将这些块下推并调整。如果您需要进一步的帮助,我可以分享一些代码。

Hi Tameem
Set the min height,width of the richTextBox to A4 size(lets say). Subscribe to RichTextBox Size Changed event.As soon as the content exceeds,this event gets fired.Then I take the last block of previous page and push it to the first block of next page.(Remember if page doesnot exist, you need to create new page then add it as first block).And also the focus should be changed to the new page.(because if you press enter at the last RTB, you expect the focus to be there in the new page.).When the user deletes a block in some page(say 2nd),then you need to add all the blocks of bottom pages to this page,so that our pagination logic will push the blocks down again and adjust. I can share some piece of code if you need further help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文