none
关于richeditbox,请问如何改变向追加内容的方向 RRS feed

  • 问题

  • 最近用richeditbox做一个聊天窗口,平时聊天需要一个段落一个段落的向下追加聊天内容

    当查询历史,需要把之前的聊天记录,追加到第一个段落的上面,请问怎么实现呢

    2016年3月29日 5:16

全部回复

  • RichTextBox里面的内容是FlowDocument形式,所以我们需要参照FlowDocument的节段形式找到你要插入的TextPointer  然后插入你的<Run/>过这段落

    你参考下文档:https://msdn.microsoft.com/en-us/library/aa970909%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396

    How to: Insert an Element Into Text Programmatically https://msdn.microsoft.com/en-us/library/aa970562(v=vs.100).aspx


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2016年3月29日 8:10
    版主
  • 谢谢bob,能麻烦你贴一下例子代码吗,我尝试打开那两个链接老是失去响应,不知道是不是网络原因,非常感谢。。。
    2016年3月29日 17:45
  • 这里是第二个链接中的代码:How to: Insert an Element Into Text Programmatically

    using System;
    using System.Windows;
    using System.Windows.Media;
    using System.Windows.Controls;
    using System.Windows.Documents;
    
    namespace SDKSample
    {
        public partial class InsertInlineIntoTextExample : Page
        {
            public InsertInlineIntoTextExample()
            {
    
                // Create a paragraph with a short sentence
                Paragraph myParagraph = new Paragraph(new Run("Neptune has 72 times Earth's volume..."));
    
                // Create two TextPointers that will specify the text range the Span will cover
                TextPointer myTextPointer1 = myParagraph.ContentStart.GetPositionAtOffset(10);
                TextPointer myTextPointer2 = myParagraph.ContentEnd.GetPositionAtOffset(-5);
    
                // Create a Span that covers the range between the two TextPointers.
                Span mySpan = new Span(myTextPointer1, myTextPointer2);
                mySpan.Background = Brushes.Red;
    
                // Create a FlowDocument with the paragraph as its initial content.
                FlowDocument myFlowDocument = new FlowDocument(myParagraph);
    
                this.Content = myFlowDocument;
    
            }
        }
    }
    

    上面的链接有很多代码和图,最好还是自己看一下。

    2016年3月29日 22:29
  • 我仔细看了下,自己试验了,这种插入方式可以改变同一个段落中插入文字的位置

    可能之前没有表达清楚问题,我想实现的是改变 区块 在 文档中的排列方式 比如下面的代码

    sendParas = new Paragraph(new Run("aaaaaa"));
    sendDoc.Blocks.Add(_sendParas);
    这样的效果是在文档视图里面从上到下添加行

    我想改成丛下往上添加行,就是在当前块之前添加新的块

    2016年3月30日 3:41
  • Blocks类型是BlockCollection, 他有InsertBefore 和 InsertAfter两个方法,你可以获取第一个Paragraph然后往前插入一个new Parapragh

    例子 https://msdn.microsoft.com/zh-cn/library/ms752359(v=vs.110).aspx

    Paragraph p = new Paragraph(new Run("Text to insert..."));
    flowDoc.Blocks.InsertBefore(flowDoc.Blocks.FirstBlock, p);


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。



    2016年3月30日 5:35
    版主
  • 非常感谢!

    看到这里我对block的概念还是有点疑问,代码如下

                    <RichTextBox Name="myRichInput" Grid.ColumnSpan="3">
                        <FlowDocument Name="SendDocument">
                            <Paragraph Name="SendMessageParas">                          
                                <Run></Run>                           
                            </Paragraph>                        
                        </FlowDocument>
                    </RichTextBox>

    这是我定义的文本输入框 , 所有的输入都应该在run下面吧,我调试发现不管怎样输入,
    var blockCount = SendDocument.Blocks.Count;
    取得得blockcount数都是1,请问flow doc是以什么方式来界定某个文本的block得呢

    2016年3月31日 2:17