我想要在FlowDocument
中提供一些数据。这基本上是一个以友好的方式解释数据的视图,包括节标题,文本段落等,我将在FlowDocumentScrollViewer中显示。
为此,我想从<List>
的内容中创建项目符号列表(ObservableCollection
)。我知道如何使用ItemsControl
执行此操作,但如何对ListItem
中的FlowDocument
元素执行此操作,因为它们属于TextElement
类层次结构而非Control
层次结构? ItemsControl
或TextBlock
内的文字内容是否等同FlowDocument
?
编辑: article谢尔盖链接到的是一个完美的起点。唯一的问题是文章的代码只能使用Section
或TableRowGroup
作为项目面板,并且还不支持使用<List>
。但这很容易解决 - 只需在ItemsContent.GenerateContent
末尾添加此代码,就在最终else
之前:
else if (panel is List)
((List) panel).ListItems.Add((ListItem) element);
答案 0 :(得分:9)
您正在寻找的是可能的,但需要大量的编码。幸运的是,Vincent Van Den Berghe在MSDN上发表了一篇很好的文章,描述了如何Create Flexible UIs With Flow Documents And Data Binding,包括代码!
答案 1 :(得分:0)
您可以使用FlowDocument
而不是使用ItemsControl
,并将用于显示项目的面板更改为WrapPanel。这将允许您根据需要使用ItemsControl
,但将其显示语义更改为WrapPanel
(我认为它的功能类似于FlowDocument
。您可以这样做:< / p>
<ItemsControl>
<ItemsControl.ItemsPanelTemplate>
<WrapPanel />
</ItemsControl.ItemsPanelTemplate>
</ItemsControl>
您可以根据需要在内部WrapPanel
设置任何属性。
答案 2 :(得分:0)
我认为您正在寻找List元素: http://msdn.microsoft.com/en-us/library/system.windows.documents.list.aspx
Bubblewrap指出了一些细节。您可能绑定到ListItems属性,需要使用ValueConverter将源列表转换为ListItemsCollection类型的列表。
Bubblewrap指出这是readonly并且ListItemsCollection有一个内部构造函数。所以......
我认为你必须要做的是:
<ContentControl Content="{Binding TheArrayOfText, Converter={StaticResource StringsToListConverter}" />
这非常不幸,但我认为它会奏效。您必须编写转换器来创建新的List对象,并在每个项目上调用.Add(
。