Невозможно надежно установить фокус на элемент управления редактора с помощью Scintill aNET .WPF - PullRequest
0 голосов
/ 24 января 2020

Я строю специализированный редактор на основе этого проекта: https://github.com/Stumpii/ScintillaNET.WPF

Чтобы воспроизвести проблему, вам нужно скачать весь проект (он просто работает), но на мой вопрос задействовано только 2 файла.

Моя цель: когда я создаю новый документ, я хочу сразу же начать его набирать. Как и сейчас, вы должны сначала сфокусировать окно редактора.

Итак, я создал процедуру для фокусировки ActiveDocument. И это работает. Иногда.

Измененный код:

в MainWindow.xaml Я добавил эту однострочную строку:

<MenuItem Name="focusDocument" Click="focusWindowMenuItem_Click" Header="_Focus"/>

в MainWindow.xaml.cs Я изменил / добавил:

// I changed this
private void newMenuItem_Click(object sender, RoutedEventArgs e)
{
    NewDocument(); // adds new document and makes it the ActiveDocument
    // I added this line
    FocusScintilla(); // doesn't do anything
}

// I added this
private void focusWindowMenuItem_Click(object sender, RoutedEventArgs e)
{
    FocusScintilla(); // works as expected
}

// I added this
// put focus on active document (and optionally move caret, not important here)
private void FocusScintilla(int offSet = 0)
{
    if (ActiveDocument == null) { return; }
    ActiveDocument.Scintilla.Scintilla.CurrentPosition = ActiveDocument.Scintilla.CurrentPosition + offSet;
    ActiveDocument.Scintilla.Scintilla.AnchorPosition = ActiveDocument.scintilla.CurrentPosition;
    ActiveDocument.Scintilla.Scintilla.Focus();
}

Мой вопрос: почему это работает с focusWindowMenuItem_Click, а не с обработчиком newMenuItem_Click?

В окне вывода есть подсказка: после того, как newMenuItem_Click завершится , это читает SetFocusOnLastElement(focused=False, model=SCide.WPF.DocumentForm, element=). Эта строка не отображается после focusWindowMenuItem_Click. Это наводит меня на мысль, что это как-то связано с AvalonDock выполнением некоторой пост-обработки после добавления нового документа, возможно, в ответ на отображаемое окно? Поэтому я искал еще немного и нашел эту тему: AvalonDock focus Содержимое LayoutDocument , но я не смог перевести это в мою ситуацию.

Я мог бы воспользоваться некоторыми советами здесь.

...