繁体   English   中英

Paragraph.BringIntoView()仅在聚焦时有效

[英]Paragraph.BringIntoView() works only when focused

我正在基于RichEditBox的文本编辑器上工作。 我已经实现了“转到行”功能,该功能最终解析为TextPointer.Paragraph.BringIntoView();

与此同时,我还设置了插入符号的位置。 我发现, BringIntoView仅在我首先单击RichEditBox时才起作用(将其聚焦)。 否则,它似乎会被忽略。 我可以看到,插入符号的位置已通过BringIntoView周围的代码进行了调整。

有人知道该问题的原因/性质是什么吗? 我该如何克服?

找到了解决方法,不确定是否可以在纯WPF环境中使用,就我而言,我在需要使用WPF UserControls的Windows Forms解决方案中运行WPF。

与其立即调用BringIntoFocus(),不如通过将其添加到由计时器处理的队列中,将其推迟到稍后。 例如:

System.Windows.Forms.Timer DeferredActionTimer = new System.Windows.Forms.Timer() { Interval = 200 };

Queue<Action> DeferredActions = new Queue<Action>();

void DeferredActionTimer_Tick(object sender, EventArgs e) {
  while(DeferredActions.Count > 0) {
    Action act = DeferredActions.Dequeue();
    act();
  }
}

在您的表单构造函数中,或在OnLoad事件中添加:

DeferredActionTimer.Tick += new EventHandler(DeferredActionTimer_Tick);
DeferredActionTimer.Enabled = true;

最后,不要调用TextPointer.Paragraph.BringIntoView(); 直接调用,如下所示:

DeferredActions.Enqueue(() => TextPointer.Paragraph.BringIntoView());

请注意,Windows Forms计时器会在主线程中启动事件(通过消息泵循环)。 如果必须使用另一个计时器,则需要一些额外的代码。 我建议您使用System.Timers.Timer而不是System.Threading.Timer (这是线程安全的一点)。 您还必须将动作包装在Dispatcher.Invoke结构中。 就我而言,WinForms计时器就像一个超级按钮。

您不能先使用Keyboard.Focus(richTextBox)richTextBox.Focus()首先给RichTextBox (?)焦点吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM