如何将RichTextBox子项中的内联引入视图

时间:2013-03-14 14:14:31

标签: c# wpf xaml focus richtextbox

如何将Inline关注到RichTextBox? 我从文本文件中创建FlowDocument并将其加载到我的richTextBox1中 并根据Button_click(重新创建Inline)在另一个之后标记一个FlowDocument

使用此代码:

            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没有进入View。有没有一种简单的方法可以将此Inline带入View?

2 个答案:

答案 0 :(得分:3)

直截了当的解决方案似乎是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();     // ** 

辅助方法,来自here

    public static void DoEvents()
    {
        Application.Current.Dispatcher.Invoke(
            System.Windows.Threading.DispatcherPriority.Background, 
            new Action(delegate { }));
    }

答案 1 :(得分:2)

你应该尝试其中一种方法

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

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

进一步的信息是herehere

修改

好了,在WPF RichTextBox中挖掘了一下,云你试试richTextBox.ScrollToVerticalOffset(Offset) 获得Offset可能你可以使用这个answer

编辑2

好的经过一些研究后我发现Link可以下载 this 工作示例