Как распространить нажатие кнопки Home / End на UWP RichEditBox внутри WPF ScrollViewer?

В приложении WPF (ориентированном на ядро ​​.NET 3.1) в одном из окон у меня есть ScrollViewer, а внутри ScrollViewer (среди других элементов) я разместил пользовательский элемент управления UWP, который содержит RichEditBox. Я добавил этот пользовательский элемент управления UWP через XamlHosts:

<Window xmlns:xaml="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost">
    ...
     <ScrollViewer>
        <Grid>
            ...
            <xaml:WindowsXamlHost InitialTypeName="UWPControls.MyRichBox" x:Name="UwpRichEditBox"/>
        </Grid>
    </ScrollViewer>
<Window>

RichEditBox в стиле UWP отображается в приложении WPF, я могу вводить текст, перемещать курсор с помощью кнопок со стрелками, но некоторые ключевые события не работают. Например, я не могу использовать кнопки Home / End для перехода к началу или концу строки в RichEditBox.

Проблема в том, что ScrollViewer в приложении WPF улавливает эти нажатия кнопок (Home / End / Ctrl + Right-Left) и не распространяется на элемент управления RichEditBox Xaml Island. Я знаю это, потому что, если я удалю ScrollViewer, проблема исчезнет.

Я пытался установить Focusable="False" и IsTabStop="False" для ScrollViewer, но не помогло. Я могу поймать эти события клавиатуры в WPF, но в элементе управления XamlIsland UWP события вообще не запускаются, когда я нажимаю кнопки «Домой» или «Конец» (ни KeyDownEvent, ни PreviewKeyDownEvent). Для остальных ключей они увольняются.

Могу ли я как-то запретить ScrollViewer перехватывать события клавиатуры? Или я могу как-то вызвать событие клавиатуры в UWP RichEditBox, когда я поймаю их в WPF?


person Attila Szász    schedule 21.01.2021    source источник


Ответы (1)


Наконец, я смог решить эту проблему, разделив ScrollViewer на подклассы и переопределив метод OnKeyDown.

namespace MyNameSpace.Custom {
    public class MyScrollViewer : ScrollViewer {
        protected override void OnKeyDown(KeyEventArgs e) {
            // do nothing!
        }
    }
}

Затем используйте этот элемент управления в представлении XAML

<Window x:Class="..."
        xmlns:custom="clr-namespace:MyNameSpace.Custom">
    <custom:MyScrollViewer>
        ....
    </custom:MyScrollViewer>
</Window>
person Attila Szász    schedule 03.02.2021