gpt4 book ai didi

.net - WPF 中的文档布局有哪些选项?

转载 作者:行者123 更新时间:2023-12-02 13:56:58 25 4
gpt4 key购买 nike

使用 WPF 的 FlowDocument,我遇到了许多需要对文档布局进行更多控制的情况,从简单的内容(页眉和页脚)到更复杂的内容(脚注、杂志风格的故事流程)甚至更复杂(带有关键装置的文学文本 - 我的实际要求之一)。

但是,据我所知,我唯一的选择是:

A.使用 FlowDocument 并失去对布局的所有控制。

B.使用 TextFormatter 从头开始​​编写所有内容。

A 对我来说不是一个选择,而 B 需要实现数十种方法,更重要的是,失去 FlowDocument 及其关联查看器的功能。

我的问题是:

是否有任何替代方案可以让我利用 FlowDocument 的强大功能(它满足我 90% 的布局需求),并且只编写实现其他 10% 所需的代码?

编辑:FlowDocument 的可回流方面对我来说至关重要。我知道我既要求可重排的内容又要求对布局的精确控制,这有些矛盾。但是,我知道这是可以完成的 - 我使用 TextFormatter 编写了一个简单的实现来实现我想要的功能,但我更愿意使用带有某种扩展的 FlowDocument 以避免重新实现每个功能。

编辑2:看来我真正想要的是与 FlowDocument 的内部分页器 Hook ,以便我可以为其提供布局自定义类的说明。有什么办法可以做到吗?

最佳答案

WPF 中的文本系统主要设计用于处理 UI 中使用的文本,而不是用于生成带有脚注和标题等的复杂文档。但是,该框架的编写方式是,如果您想添加自定义功能,您可以可以。

第一个问题:脚注和与文本一致的内容。 WPF 提供了 2 个类将 UIElement 放入文本中:InlineUIContainerBlockUIContainer。我会考虑编写自己的自定义控件,该控件专门设计为具有脚注或类似内容的行为,并将其放入这两个类之一。如果您需要有关什么接受什么的更多信息,我在 MSDN 上找到了这个方便的花花公子关系图表(链接位于页面底部)

alt text
(来源:microsoft.com)

我不太确定你所说的“杂志风格的故事流程”是什么意思。 “FlowDocument”会自动将 Block 派生类(上图中蓝色的任何内容)排列到可用空间中,并且您可以使用 Floater 让文本在对象周围“流动” > 和 Figure 内联元素。您还可以使用 FigureFloater 作为页眉和页脚功能。

这里是一些示例代码:

    <FlowDocumentScrollViewer>
<FlowDocument>
<Paragraph>
5 green bottles standing on the wall,
5 green bottles standing on the wall,
and if one green bottle was to accidentally fall,
there would be 4 green bottles standing on the wall;
</Paragraph>
<Paragraph>
4 green bottles standing on the wall,
4 green bottles standing on the wall,
<Floater HorizontalAlignment="Left" Width="250">
<BlockUIContainer>
<Button>This button is in a Floater</Button>
</BlockUIContainer>
</Floater>
and if one green bottle was to accidentally fall,
there would be 3 green bottles standing on the wall;
</Paragraph>
<Paragraph>
3 green bottles standing on the wall,
3 green bottles standing on the wall,
and if one green bottle was to accidentally fall,
there would be 2 green bottles standing on the wall;
</Paragraph>

<Paragraph>
2 green bottles standing on the wall,
2 green bottles standing on the wall,
and if one green bottle was to accidentally fall,
<InlineUIContainer>
<Button>This Button is inline</Button>
</InlineUIContainer>
there would be 1 green bottle standing on the wall...
</Paragraph>
</FlowDocument>
</FlowDocumentScrollViewer>

您可以用自己的自定义控件替换按钮(例如带有脚注的内联按钮)

这段代码使得: DesignerView

希望有帮助!我不知道你到底想做什么,但我认为你仍然可以使用 FlowDocument 并只使用 WPF 提供的大量文本操作设备,如果你确实需要额外的功能/布局选项创建一个继承 BlockInline 或其他类的新类,并在其中编写额外的内容以利用 .net 可以为您完成的所有工作。如果您需要更多信息,可以在 MSDN 上阅读有关 WPF 中文本内容的更多信息:

Extra long article about how to use FlowDocument

The text content model used in WPF (where I got the image from)

玩得开心:)

关于.net - WPF 中的文档布局有哪些选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com