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 { }));
}