失去焦点后,在ElementHost中的WPF RichTextBox中显示选择

时间:2011-07-20 13:44:21

标签: c# wpf focus richtextbox selection

我目前正在使用WPF RichTextBox开发一个Windows窗体应用程序(基本上是一个文档编辑器)。当然,由于所有其余的都是一个Windows窗体应用程序,我在一个ElementHost中托管WPF RichTextBox。

问题是我希望RichTextBox中的选择保持可见,即使它没有焦点。例如,我在工具栏中有几个文本格式按钮(粗体,斜体,...),当我按下其中一个按钮时,我目前无法看到选择,因为RichTextBox失去了焦点。

不幸的是,RichTextBox没有像某些WinForms控件那样的HideSelection属性。

我已尝试取消其他帖子中描述的LostFocus事件。但是,当RichTextBox托管在ElementHost中时,这似乎不起作用(我试过,它确实在仅WPF项目中工作)。

我还在失去/获得焦点时设置/重置选择背景颜色进行了一些实验,但这看起来非常糟糕,并且努力使其可靠地工作。

有谁知道如何实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

向ElementHost添加第二个RichTextBox(高度为0) 在RichTextBox的LostFocus中执行以下操作:

bool firstLost = true;

void yourRichTextBox_LostFocus(object sender, RoutedEventArgs e)
{
        e.Handled = true;

        if (firstLost)
        {
            yourRichTextBox.Focus();
            firstLost = false;
        }
        else
        {
            firstLost = true;
        }

        invisibleRichTextBox.Focus();
}

因此它获得了Focus,将它提供给不可见的RichTextBox(因此e.Handled = true;工作正常)然后你可以在你的WinForms控件中做任何你想做的事。

仅在焦点设置为同一表单的控件时才起作用 - 如果直接从WPF-RichTextBox中保留父表单,则会丢失选择突出显示。 (LostFocus-Event似乎没有被提出。)

编辑: 您可以从表单中捕获Deactivate事件并关注yourRichTextBox,然后关注invisivleRichTextBox。所以你直接离开你的表格。