为什么KeyDown不是在我的控件上工作,而是在整个窗体上工作

本文关键字:工作 窗体 控件 KeyDown 我的 为什么 | 更新日期: 2023-09-27 17:57:48

我使用此例程检查我的LeftCtrl键是否在图像控件上按下

private void mainImage_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.LeftCtrl)
    {
        LeftCtrlButtonIsPressed = true;
    }
}
private void mainImage_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.LeftCtrl)
    {
        LeftCtrlButtonIsPressed = false;
    }
}

当我在图像或图像周围的边框上设置事件时,不会命中

<Border x:Name="mainImageBackBorder" .... KeyDown="mainImage_KeyDown" KeyUp="mainImage_KeyUp"> <! -- Does not Hit -->
    <Image x:Name="mainImage" ... KeyDown="mainImage_KeyDown" KeyUp="mainImage_KeyUp"> <! -- Does not Hit -->
        <Image.RenderTransform>
            <! -- ... -->
        </Image.RenderTransform>
    </Image>
</Border>

但是,当我在我的窗口:上设置它时,它命中s

<Window x:Class="ProjectName.MainWindow"
        ..
        DataContext="{StaticResource mainViewModel }"
        Title="MainWindow" Height="600" Width="800" KeyDown="mainImage_KeyDown" KeyUp="mainImage_KeyUp"> <!-- It Hits -->

为什么KeyDown不是在我的控件上工作,而是在整个窗体上工作

您的图像控件将不会接收KeyDown事件,因为Focusable属性默认设置为false。来自Focusable文档的第一行:

只有聚焦元素接收键盘输入。

同样值得注意的是:

当直接从UIElement导出时(与从Control相反),考虑一下你是否希望你的元素是可聚焦的,因为默认情况下,元素将不可聚焦。如果您希望元素如果是可聚焦的,请重写类型的静态构造函数,如下所示:

正如您从Image类文档中看到的,它派生自UIElement,而不是Control,因此默认情况下它无法接收焦点。

如果您使图像可聚焦,这应该是正确的,但请记住明显的副作用-用户的当前焦点可能会在没有视觉指示的图像控件上丢失。