Показать выделение в WPF RichTextBox в ElementHost после потери фокуса - PullRequest
2 голосов
/ 20 июля 2011

В настоящее время я разрабатываю приложение для форм Windows (в основном редактор документов) с WPF RichTextBox. Разумеется, поскольку все остальное - это приложение для форм Windows, я размещаю WPF RichTextBox в ElementHost.

Проблема в том, что я хочу, чтобы выделение в RichTextBox было видимым, даже если оно не имеет фокуса. Например, у меня есть несколько кнопок форматирования текста (полужирный, курсив, ...) на панели инструментов, и когда я нажимаю одну из них, я больше не вижу выделение, потому что RichTextBox теряет фокус.

К сожалению, RichTextBox не имеет свойства HideSelection, как некоторые элементы управления WinForms.

Я уже пытался отменить событие LostFocus, как описано в других постах. Однако, похоже, это не работает, когда RichTextBox размещен внутри ElementHost (я пытался, и это работало в проекте только для WPF).

Я также немного поэкспериментировал с установкой / сбросом цветов фона выделения при потере / усилении фокуса, но это кажется очень хакерским, и для обеспечения его надежной работы требуется много усилий.

У кого-нибудь есть идеи, как этого можно достичь?

Спасибо!

1 Ответ

0 голосов
/ 24 ноября 2011

Я нашел решение:

Добавьте второй элемент RichTextBox в свой ElementHost (с высотой 0).
В LostFocus вашего RichTextBox сделайте это:

bool firstLost = true;

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

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

        invisibleRichTextBox.Focus();
}

Таким образом, он получает Фокус, передает его невидимому RichTextBox (так что e.Handled = true; работает правильно), а затем вы можете делать все, что захотите, в ваших элементах управления WinForms.

Работает только тогда, когда фокус установлен на элемент управления той же формы - если вы оставляете родительскую форму непосредственно из вашего WPF-RichTextBox, она теряет выделение выделения. (Кажется, событие LostFocus не было возбуждено.)

Edit: Вы можете поймать событие Деактивации из своей формы и сфокусировать yourRichTextBox, а затем сфокусировать invisivleRichTextBox. Таким образом, вы можете оставить форму.

...