标签: flowdocument

WPF RichTextBox - ScrollToEnd()方法不会导致任何滚动

RichTextBox我的WPF应用程序中的组件使用a FlowDocumentRichTextBoxs Document属性填充.

rtb.ScrollToEnd();似乎没有做任何事情,我甚至试图调用BringIntoView()添加到构造我的表的最后一行"行" FlowDocument.

有什么建议?谢谢!

c# wpf scroll richtextbox flowdocument

9
推荐指数
1
解决办法
9421
查看次数

WPF FlowDocument - 绝对字符位置

我有一个WPF RichTextBox,我正在键入一些文本,然后解析整个文本进行处理.在这个解析过程中,我有每个单词开头和结尾的绝对字符位置.

我想使用这些字符位置将格式应用于某些单词.但是,我发现FlowDocument使用TextPointer实例来标记文档中的位置.

我发现我可以通过使用开始和结束指针构造TextRange来创建它.一旦我有TextRange,我可以轻松地将格式应用于其中的文本.我一直在使用GetPositionAtOffset为我的角色偏移量获取TextPointer,但怀疑它的偏移量与我的不同,因为所选文本的位置与我的预期略有不同.

我的问题是,如何准确地将绝对字符位置转换为TextPointer?

.net c# wpf richtextbox flowdocument

9
推荐指数
2
解决办法
7940
查看次数

从代码中滚动WPF FlowDocumentScrollViewer?

我有一个FlowDocumentScrollViewer我想在添加文本时自动滚动到底部.

<FlowDocumentScrollViewer Name="Scroller">
 <FlowDocument Foreground="White" Name="docDebug" FontFamily="Terminal">
  <Paragraph Name="paragraphDebug"/>
 </FlowDocument>
</FlowDocumentScrollViewer>
Run Code Online (Sandbox Code Playgroud)

在代码中我向段落添加了内联,但是当有很多文本时,我希望能够简单地使用代码向下滚动而不是让用户这样做.

有什么建议?

.net c# wpf flowdocument

8
推荐指数
4
解决办法
8887
查看次数

C#中的FlowDocument内存问题

我目前正在尝试处理释放FlowDocument资源的问题.我正在加载一个rtf文件并将其放入带有TextRange.Load的FlowDocument中.我注意到,在它执行此操作后,它会保留这些资源,GC不会收集它.我已经运行了一个内存分析器,并且已经看到这是真的.我还把它缩小到我加载实际将rtf放入FlowDocument.如果我不这样做,那么一切都很好.所以我知道这是问题所在.

我希望对如何解决这个问题提供一些指导.这是加载rtf和所有内容的代码.我已经评论了所有其他代码,甚至将它放在自己的范围内,并尝试了GC.Collect().任何帮助是极大的赞赏.

编辑:这是我的代码.除了最基本的要素之外,我已经取出了其他所有东西来让它运行起来.问题仍然存在.如您所见,FlowDocument和TextRange不会在其他任何地方引用.

    public LoadRTFWindow(string file)
    {
        InitializeComponent();

        using (FileStream reader = new FileStream(file, FileMode.Open))
        {
            FlowDocument doc = new FlowDocument();
            TextRange range = new TextRange(doc.ContentStart, doc.ContentEnd);
            range.Load(reader, System.Windows.DataFormats.Rtf);
        }
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
    }
Run Code Online (Sandbox Code Playgroud)

我找到了这篇文章,我希望能帮助我解决问题,但我没有运气.非常感谢任何类型的帮助.谢谢.

编辑:我想我应该提到我检查这个的主要方式.我打开了Windows任务管理器,正在观察应用程序进程正在使用的内存使用情况.当我运行上面的代码时,应用程序从40,000K到70,000K,同时执行TextRange.Load()(这是一个400页的大型RTF),一旦完成它就会下降到61,000K并保持在那里.我的期望是它会回落到40,000K或者至少非常接近它.

正如我之前提到的,我使用了一个内存分析器,看到有很多段落,Run ..ect.事后仍然活着.

c# memory flowdocument .net-3.5

8
推荐指数
2
解决办法
4023
查看次数

我们如何在WPF中将.rtf或.doc显示为flowdocument?

它是应用程序的帮助部分.我想把flowdocumentReader放到显示帮助文档.但是有可能在Flowdocument中显示.rtf或任何.doc.或者在Xaml中创建流文档是必要的.请帮忙.

谢谢,

wpf flowdocument

8
推荐指数
1
解决办法
6260
查看次数

将FlowDocument中的列表绑定到List <MyClass>?

我有一个包含绑定到我的ViewModel的东西的FlowDocument,如下所示:

<FlowDocumentReader>
  <FlowDocument>
    <Paragraph>
      <Run Text="{Binding MyTextProperty}"/>
    </Paragraph>
  </FlowDocument>
</FlowDocumentReader>
Run Code Online (Sandbox Code Playgroud)

现在我想使用某种DataTemplate显示类的List,但不知道如何启动.说我得到了一个类:

public MyClass
{
  String Title {get;set;}
  String FlowText {get;set;}
}

public List<MyClass> MyList {get;set;}
Run Code Online (Sandbox Code Playgroud)

我想将它绑定到FlowDocument列表,如下所示:

<FlowDocumentReader>
  <FlowDocument>
    <List Items="{Binding MyList}">
      <Bold><Run Text="{Binding Title}"/></Bold>
      <LineBreak/>
      <Run Text="{Binding FlowText}"/>
    </Paragraph>
  </FlowDocument>
</FlowDocumentReader>
Run Code Online (Sandbox Code Playgroud)

当然这不起作用 - 但我找不到任何解释如何使用模板绑定FlowDocument中的列表 - 这可能吗?

wpf binding mvvm flowdocument

8
推荐指数
1
解决办法
6714
查看次数

flowdocument - 在末尾插入富文本,在插入点上方创建额外的段落分隔符

我正在创建一个包含多个记录的flowdocument.每条记录在顶部包含两个表,然后是一些我从数据库中提取的富文本.附加富文本的代码位于下方(cp.Comments包含rtf标记文本).

Dim tr As TextRange
Dim arr() As Byte

Using ms As New System.IO.MemoryStream
  arr = (New System.Text.UTF8Encoding).GetBytes(cp.Comments)
  ms.Write(arr, 0, arr.Length)
  ms.Seek(0, IO.SeekOrigin.Begin)

  tr = New TextRange(fd.ContentEnd, fd.ContentEnd)   'add to end
  tr.Load(ms, DataFormats.Rtf)
End Using
Run Code Online (Sandbox Code Playgroud)

flowdocument正确呈现第一个记录,但所有后续记录都在第一个和第二个表之间中断.最奇怪的是我导入RTF 之前渲染了2个表,但RTF无论如何都会以某种方式影响表之间的间距.

fd = new FlowDocument

for each cp in SomeCollection

   fdtemp = New FlowDocument

   CreateFirstTable(cp, fdtemp)
   CreateSecondTable(cp, fdtemp)
   AddRTF(cp, fdtemp)

   FlowDocumentUtils.AddDocument(fdtemp, fd)

next
Run Code Online (Sandbox Code Playgroud)

问题不是集合的第一个元素中的数据 - 如果我告诉渲染跳过第一个记录的渲染,那么第二个记录渲染正常,但其余的包含额外的间距.

注意:问题肯定与富文本插入有关 - 如果我注释掉AddRTF调用,那么所有表都被正确地呈现在一起.(表边距都设置为(0,0,0,0))

有没有人见过这个?

vb.net wpf flowdocument richtext

8
推荐指数
1
解决办法
1453
查看次数

FlowDocument中缺少的图像保存为XPS文档

我在获取FlowDocument中包含的图像时遇到一些困难,以显示FlowDocument何时保存为XPS文档.

这是我做的:

  1. 使用WPF 的Image控件创建图像.我通过调用BeginInit/EndInit设置了括号的图像源.
  2. 将图像添加到FlowDocument中,将其包装在BlockUIContainer中.
  3. 使用此代码的修改版本将FlowDocument对象保存到XPS文件.

如果我然后在XPS查看器中查看保存的文件,则不显示图像.问题是,在WPF实际显示在屏幕上之前不会加载图像,因此它们不会保存到XPS文件中.因此,有一种解决方法:如果我首先使用FlowDocumentPageViewer在屏幕上显示文档,然后保存XPS文件,则会加载图像并显示在XPS文件中.即使隐藏了FlowDocumentPageViewer,这也可以工作.但这给了我另一个挑战.这是我想做的(在伪代码中):

void SaveDocument()
{
    AddFlowDocumentToFlowDocumentPageViewer();
    SaveFlowDocumentToXpsFile();
}
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,因为在文档保存到XPS文件之前,FlowDocumentPageViewer永远不会有机会显示其内容.我尝试在调用Dispatcher.BeginInvoke时包装SaveFlowDocumentToXpsFile但它没有帮助.

我的问题是:

  1. 在保存XPS文件之前,我是否可以以某种方式强制图像加载而不实际在屏幕上显示文档?(我试着摆弄BitmapImage.CreateOptions而没有运气).
  2. 如果没有问题#1的解决方案,有没有办法告诉FlowDocumentPageViewer何时完成加载其内容,以便我知道何时保存以创建XPS文件?

wpf xpsdocument image flowdocument

7
推荐指数
1
解决办法
3363
查看次数

C#FlowDocument到HTML转换

基本上,我有一个RichTextBox,我想将它的格式化内容转换为HTML,以便它可以作为电子邮件发送.

我目前使用的方法根本不提供任何格式:

string message = new TextRange(messageTextBox.Document.ContentStart,
                               messageTextBox.Document.ContentEnd).Text;
Run Code Online (Sandbox Code Playgroud)

所以我四处搜索并发现了这一点,然而,它已经超过5年了,在评论中,MSFT用户评论说它不再受支持 - "This sample has been removed from our sample set and is no longer supported"并且它生成的HTML格式比现代HTML或XHTML更旧.有更好的.

任何人都可以告诉我如何将RichTextBox 的格式化内容转换为HTML?

(因此,当发送电子邮件时,收件人会看到带有格式的电子邮件)

c# wpf richtextbox flowdocument

7
推荐指数
1
解决办法
8164
查看次数

在打印FlowDocument时避免使用多个列

我正在编写代码以从FlowDocument打印.

        PrintDialog printDialog = new PrintDialog();
        bool? result = printDialog.ShowDialog();
        if (result == true)
        {
            FlowDocument fd = new FlowDocument();
            fd.Blocks.Add(new Paragraph(new Run(String.Format("Message:\r\n{0}\r\n", txtMessage.Text))));
            fd.PageHeight = printDialog.PrintableAreaHeight;
            fd.PageWidth = printDialog.PrintableAreaWidth;
            printDialog.PrintDocument((fd as IDocumentPaginatorSource).DocumentPaginator, "print test");
        }
Run Code Online (Sandbox Code Playgroud)

此代码将在一个页面中打印多个列.怎么避免这个?

printing wpf flowdocument

7
推荐指数
1
解决办法
2413
查看次数