C# 如何将RichTextBox子项中的内联显示在视图中

C# 如何将RichTextBox子项中的内联显示在视图中,c#,wpf,xaml,focus,richtextbox,C#,Wpf,Xaml,Focus,Richtextbox,如何在RichTextBox中聚焦内联? 我从文本文件创建一个FlowDocument,并将其加载到我的richTextBox1 并相应地在一个按钮上依次标记一个内联(正在重新创建流程文档) 使用此代码: 我知道不是。。太好了 问题 到目前为止,它仍然有效,但出现的问题是市场Inline没有进入视野。有没有一种简单的方法可以将此内联导入视图?您应该尝试以下方法之一 richTextBox.SelectionStart = richTextBox.Text.Length; richTextBox.

如何在
RichTextBox
中聚焦
内联

我从文本文件创建一个
FlowDocument
,并将其加载到我的
richTextBox1
并相应地在一个按钮上依次标记一个
内联
(正在重新创建
流程文档

使用此代码: 我知道不是。。太好了

问题
到目前为止,它仍然有效,但出现的问题是市场
Inline
没有进入视野。有没有一种简单的方法可以将此
内联
导入视图?

您应该尝试以下方法之一

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

进一步的信息是和

编辑

好的,在WPF RichTextBox中挖掘一点之后,我想你可以试试RichTextBox。滚动到垂直偏移量(Offset)
为了得到偏移量,也许你可以用这个

编辑2
好的,经过进一步的研究,我发现下面是可以下载的工作示例,简单的解决方案似乎是
FrameworkContentElement.BringIntoView()
,但在将其放入下面的代码后,最初没有效果。事实证明,这是一个计时问题(我在WinForms中见过类似的问题),可以通过处理未完成的Windows消息来解决。WPF没有直接等同于
DoEvents()
,但存在一个众所周知的替代品

我把它放在一个按钮上,更改标记为
/**

        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();     // ** 
和助手方法,来自:


这个问题的代码太多了。请总结。如果流程文档太长@Henk Holtermann没有理由发布所有案例块,我想显示标记的行,这样我就不必滚动。我总结了它,现在我希望您能更好地阅读@Henkholtmandid您是否尝试过FrameworkContentElement.BringIntoView()?但是它可能不起作用,因为你建立了一个巨大的段落。第一种方法在windows窗体中很有用。第二步,让我滚动到richtextbox的末尾,而不是我添加的,以计算偏移量。请参见下面的内容,我对BringIntoView()也有同样的问题。出于某种原因,在没有DoEvents()和BringIntoView()的情况下,使用第二个答案中的策略是有效的。用如下代码替换它们:
Rect rctStart=selected.ContentStart.GetCharacterRect(System.Windows.Documents.LogicalDirection.Forward);Rect rctEnd=selected.ContentEnd.GetCharacterRect(System.Windows.Documents.LogicalDirection.Forward);richTextBox1.ScrollToVerticalOffset((rctStart.Top+rctEnd.Bottom-richTextBox1.ViewportHeight)/2+richTextBox1.VerticalOffset)
richTextBox.AppendText(text);  
richTextBox.ScrollToEnd();
        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 { }));
    }