【问题标题】:How to propagate Home/End button press to a UWP RichEditBox inside of a WPF ScrollViewer?如何将 Home/End 按钮按下传播到 WPF ScrollViewer 内的 UWP RichEditBox?
【发布时间】:2021-04-25 15:07:48
【问题描述】:

在其中一个窗口上的WPF 应用程序(针对.NET core 3.1)中,我有一个ScrollViewer,在ScrollViewer(以及其他元素中)我放置了一个自定义UWP 控件,其中包含一个@ 987654324@。我通过XamlHosts添加了这个自定义UWP控件:

<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>

UWP 样式的 RichEditBox 显示在 WPF 应用程序中,我可以键入文本、使用箭头按钮移动插入符号,但某些关键事件不起作用。例如,我不能使用 Home/End 按钮转到 RichEditBox 中一行的开头或结尾。

问题在于,WPF 应用程序中的 ScrollViewer 会捕获这些按钮按下(Home/End/Ctrl+Right-Left),并且不会传播到 Xaml Island RichEditBox 控件。我知道这一点,因为如果我删除 ScrollViewer,问题就会消失。

我尝试为 ScrollViewer 设置 Focusable="False"IsTabStop="False",但没有帮助。我可以在 WPF 中捕获这些键盘事件,但在 XamlIsland UWP 控件中,当我按下 Home 或 End 按钮(也不是KeyDownEvent,也不是PreviewKeyDownEvent)时,根本不会触发这些事件。对于其他键,它们会被触发。

我能否以某种方式阻止 ScrollViewer 捕获键盘事件?或者,当我在 WPF 中捕获它们时,我能否以某种方式在 UWP RichEditBox 上引发键盘事件?

【问题讨论】:

    标签: c# wpf uwp xaml-islands


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 2017-07-05
      相关资源
      最近更新 更多