我有一个 FlowDocument,我想填充窗口的整个宽度和高度。我尝试过使用FlowDocumentPageViewer(没有运气),现在正在使用DocumentPageView. 我仍然无法让它停靠/填满整个空间;它只是坐在中间,以它可以创建的最小尺寸(这有意义吗?)
这是我的代码:
public DocumentPageView GetPage()
{
FlowDocumentPageViewer viewer = new FlowDocumentPageViewer();
StreamReader reader = new StreamReader(location);
string data = reader.ReadToEnd();
reader.Close();
string xamlData = HtmlToXamlConverter.ConvertHtmlToXaml(data, true);
FlowDocument result = (FlowDocument)System.Windows.Markup.XamlReader.Load(new MemoryStream(System.Text.UnicodeEncoding.Default.GetBytes(xamlData)));
viewer.Document = result;
viewer.VerticalAlignment = VerticalAlignment.Center;
viewer.HorizontalAlignment = HorizontalAlignment.Center;
DocumentPageView pageView = new DocumentPageView();
pageView.VerticalAlignment = VerticalAlignment.Center;
pageView.HorizontalAlignment = HorizontalAlignment.Center;
pageView.Stretch = System.Windows.Media.Stretch.Uniform;
pageView.PageNumber = 0;
pageView.StretchDirection = StretchDirection.Both;
pageView.DocumentPaginator = ((IDocumentPaginatorSource)result).DocumentPaginator;
return pageView;
}
Run Code Online (Sandbox Code Playgroud)
请注意,此代码包含我的两种方法的组合,但DocumentPageView当前仅使用。这是从我的 HTML 源创建的 Xaml:
<FlowDocument xml:space="preserve" …Run Code Online (Sandbox Code Playgroud) 我试过这个......
_doc = new FlowDocument();
Table t = new Table();
for (int i = 0; i < 7; i++)
{
t.Columns.Add(new TableColumn());
}
TableRow row = new TableRow();
row.Background = Brushes.Silver;
row.FontSize = 40;
row.FontWeight = FontWeights.Bold;
row.Cells.Add(new TableCell(new Paragraph(new Run("I span 7 columns"))));
row.Cells[0].ColumnSpan = 6;
_doc2.Blocks.Add(t);
Run Code Online (Sandbox Code Playgroud)
当我去查看此文档时,表格永远不会显示.....虽然我在添加此表格之前添加到此文档的边框图像和文档标题输出正常.
我有多个 FlowDocument,我想将它们连接在一起。下面的方法没有 return 语句。我想做的是将 TextRange 转回 FlowDocument。
private FlowDocument Concatenate(FlowDocument source, FlowDocument target)
{ using(MemoryStream ms = new MemoryStream())
{
TextRange tr = new TextRange(source.ContentStart, source.ContentEnd);
tr.Save(ms, DataFormats.XamlPackage);
ms.Seek(0, SeekOrigin.Begin);
tr = new TextRange(target.ContentEnd, target.ContentEnd);
tr.Load(ms, DataFormats.XamlPackage);
}
}
Run Code Online (Sandbox Code Playgroud) 我想如果我将表放在段落中,我可以使用KeepTogether属性将表保持在一起.该表用于报告的总计,客户端不希望它们分为两页.设想!表中有5行,我疯了,不知道下一步该尝试什么.
最后一行代码:
myFlowDocument.Blocks.Add(footerParagraph);
Run Code Online (Sandbox Code Playgroud)
footerParagraph的输出以:
<Paragraph KeepTogether="True">
<Floater HorizontalAlignment="Center">
<Table CellSpacing="0" FontFamily="Arial" FontSize="14" Foreground="#FF000000">
Run Code Online (Sandbox Code Playgroud)
KeepTogether通常可以工作,但为什么不包含Floater和Table?有解决方法吗?
谢谢!
我发现Run还是Paragraph在FlowDocument现在我需要知道HEIGHT它.
即
while (navigator.CompareTo(flowDocViewer.Document.ContentEnd) < 0)
{
TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward);
Run run = navigator.Parent as Run;
// I need to get HEIGHT of Run in pixels somehow
Run Code Online (Sandbox Code Playgroud)
事实上可以吗?

谢谢!
我正在尝试访问 a FlowDocument(of a RichTextBox)的内容。我想这样做是因为我想将内容转换为 UBB 格式string(是的,旧的论坛格式文本)。有没有办法获取 的内容FlowDocument的内容:
我知道通过FlowDocuments的Blocks属性,你可以得到Blocks里面的FlowDocument,这是它本身BlockUIContainer,List,Paragraph,Section或Table对象,可以看出这里。但是,如果我想要LogicalChildrenof Paragraph,例如,它是受保护的,因此无法访问。所以..这不是要走的路。什么是?(我还没有找到其他方法。)
另外,我知道将 a 的内容转换FlowDocument为 XAML 等。但是我发现的转换器不包括图像对象和我认为有用的其他一些对象,它们由RichTextBox.
提前致谢!
我正在以编程方式创建FlowDocument.在这个FlowDocument中,我想添加一行来分解文本.不是新的文本行,而是从左到右的行.问题是FlowDocument宽度是动态的,所以只添加一个"_"字符串实际上不是一个选项.图可以添加这样的一行;
Line l = new Line();
l.Margin = new Thickness(3);
l.Height = 2;
l.Width = double.NaN;
FlowDocument doc = new FlowDocument();
doc.Blocks.Add(l);
Run Code Online (Sandbox Code Playgroud)
问题是doc.Blocks.Add(l);返回此错误;
cannot convert from 'System.Windows.Shapes.Line' to 'System.Windows.Documents.Block'
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
我通过使用FlowDocument,FlowDocumentPaginator和PrintDialog在WPF中打印纯文本。我的方法基于本文,并且实现如下:
var printDialog = new PrintDialog();
if (printDialog.ShowDialog() == true)
{
var flowDocument = new FlowDocument();
var paragraph = new Paragraph();
paragraph.FontFamily = new FontFamily("Courier New");
paragraph.FontSize = 10;
paragraph.Margin = new Thickness(0);
paragraph.Inlines.Add(new Run(this.textToPrint));
flowDocument.FontSize = 10;
flowDocument.Blocks.Add(paragraph);
var paginator = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator;
printDialog.PrintDocument(paginator, "Chit");
}
Run Code Online (Sandbox Code Playgroud)
这对于打印宽度较窄的东西很有用。但是,当我尝试打印一个长字符串时,它们全部塞在一个小区域中:
我在打印对话框PrintTicket和分页器中检查了尺寸,它们似乎还可以:
那么,是什么导致此问题,我该如何解决?
我想加载大 .rtf 文件并滚动到其中的特定段落。
所以我做了这样的事情:
private FlowDocument GenerateDocument(string path)
{
var doc = new FlowDocument();
using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read))
{
var content = new TextRange(doc.ContentStart, doc.ContentEnd);
content.Load(fs, DataFormats.Rtf);
}
return doc;
}
Run Code Online (Sandbox Code Playgroud)
然后,我查找已添加书签的段落并想要滚动到那里。像这样的东西:
private void ScrollToBookmark(string bookmark)
{
Paragraph p = LookUp(bookmark);
if (p != null) p.BringIntoView();
}
Run Code Online (Sandbox Code Playgroud)
LookUp 是一个查找所需段落的功能,它运行良好,并返回先前加载的文档中的段落。
而且……什么也没发生。有小费吗?
我使用 FlowDocumentReader 来显示我的 Flowdocument。BringIntoView 在 ScrollMode 和 PageMode 下均不起作用。
通过逻辑树直接访问 FlowDocumentReader 的滚动查看器并对其进行操作不是一种选择。我只是不知道在哪里滚动,并且如果可能的话,宁愿不使用任何“黑客”。
我想以编程方式将WPF超链接元素插入到FlowDocument中.
目标是创建一个工具栏按钮,该按钮将在RichTextBox中运行一系列文本并将其替换为超链接.它与您在Web上看到的用于在wiki或博客(或StackOverflow)上创建超链接的界面相同.
我可以找到所选文本的TextRange,如下所示:
TextRange tr = new TextRange(
MyRichTextBox.Selection.Start,
MyRichTextBox.Selection.End);
Run Code Online (Sandbox Code Playgroud)
我试图将Hyperlink Xaml填充到TextRange中,如下所示:
string rawXaml = "<Hyperlink xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" NavigateUri=\"http://www.google.com/\">Google Home Page</Hyperlink>";
using(MemoryStream stream = new MemoryStream())
{
StreamWriter writer = new StreamWriter(stream);
writer.Write(rawXaml);
writer.Flush();
stream.Position = 0;
if (tr.CanLoad(DataFormats.Xaml))
{
tr.Load(stream, DataFormats.Xaml);
}
}
Run Code Online (Sandbox Code Playgroud)
但我似乎仍然将纯文本粘贴到RichTextBox中.
我在这做错了什么?有没有更好的方法来完成我想要做的事情?