4

我怎样才能把注意力集中Inline在一个RichTextBox
我从文本文件创建一个FlowDocument并将其加载到我的文件中,并根据 Button_clickrichTextBox1 一个接一个地标记(重新创建)InlineFlowDocument

使用此代码:

            richTextBox1.SelectAll();
            richTextBox1.Selection.Text = "";

            string text = System.IO.File.ReadAllText(file);
            int iZeile = 0;

            string[] split = text.Split(new string[] {"\r\n"},StringSplitOptions.None);

                    foreach (string s in split)
                    {
                        if (iZeile != 27)
                        {
                            paragraph.Inlines.Add(s + "\r\n"); // adds line added without marking
                        }
                        else
                        {
                            Run run = new Run(split[27]); // adds line with marking
                            run.Background = Brushes.Yellow;
                            paragraph.Inlines.Add(run);
                            paragraph.Inlines.Add("\r\n");
                        }
                        iZeile++;
                    }

            FlowDocument document = new FlowDocument(paragraph);
            richTextBox1.Document = new FlowDocument();
            richTextBox1.Document = document;
            Keyboard.Focus(richTextBox1);
        }

我知道它不..完美。

问题

到目前为止它有效,但出现的问题是我的市场Inline没有进入视图。有没有一种简单的方法可以将它Inline带入View?

4

2 回答 2

5

直接的解决方案似乎是,FrameworkContentElement.BringIntoView()但在将其放入下面的代码之后,它最初没有任何效果。事实证明,这是这些时间问题之一(我在 WinForms 中看到过类似的问题),可以通过处理未完成的 Windows 消息来解决。WPF 没有直接的等价物,DoEvents()但存在一个众所周知的替代品。

我把它放在一个 ButtonClick 中,更改标记为//**

        Paragraph paragraph = new Paragraph();
        Inline selected = null;   //**

        richTextBox1.SelectAll();
        richTextBox1.Selection.Text = "";

        string text = System.IO.File.ReadAllText(@"..\..\MainWindow.xaml.cs");
        int iZeile = 0;

        string[] split = text.Split(new string[] { "\r\n" }, StringSplitOptions.None);

        foreach (string s in split)
        {
            if (iZeile != 27)
            {
                paragraph.Inlines.Add(s + "\r\n"); // adds line added without marking
            }
            else
            {
                Run run = new Run(split[27]); // adds line with marking
                run.Background = Brushes.Yellow;
                paragraph.Inlines.Add(run);
                paragraph.Inlines.Add("\r\n");
                selected = run;                // ** remember this element
            }
            iZeile++;
        }

        FlowDocument document = new FlowDocument(paragraph);
        richTextBox1.Document = new FlowDocument();
        richTextBox1.Document = document;
        Keyboard.Focus(richTextBox1);

        DoEvents();                   // ** this is required, probably a bug
        selected.BringIntoView();     // ** 

和辅助方法,从这里

    public static void DoEvents()
    {
        Application.Current.Dispatcher.Invoke(
            System.Windows.Threading.DispatcherPriority.Background, 
            new Action(delegate { }));
    }
于 2013-03-18T15:41:51.213 回答
3

您应该尝试其中一种方法

richTextBox.SelectionStart = richTextBox.Text.Length;
richTextBox.ScrollToCaret();

.

richTextBox.AppendText(text);  
richTextBox.ScrollToEnd();

更多信息在这里这里

编辑

好的,在 WPF RichTextBox 中进行了一些挖掘之后,您尝试richTextBox.ScrollToVerticalOffset(Offset) 获取偏移量,也许您可​​以使用这个答案

编辑 2

好的,经过更多研究后,我发现以下链接,您可以在其中下载工作示例

于 2013-03-18T08:08:11.383 回答