C#WPF窗口上的KeyDown事件不起作用

Ara*_*emi 6 c# onkeydown

我正在尝试在窗口(不是窗体)中接收按键。我收到事件,直到按下按钮。在那之后,无论我做什么,按下键事件都不再触发。有什么解决办法吗?我已经搜索过了,似乎每个人都在建议一种解决方案,使用

this.KeyPreview = true;
Run Code Online (Sandbox Code Playgroud)

但这在这里不起作用,因为Window没有这样的属性。帮助非常感谢。我已经将所有子项的Focusable设置为False,并且Window设置为可聚焦。但这并没有帮助。

XAML是

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="463" Width="726" AllowsTransparency="False" PreviewKeyDown="Window_PreviewKeyDown" KeyDown="Window_KeyDown_1" WindowStartupLocation="CenterScreen"  Focusable="True">
    <Window.Background>
        <RadialGradientBrush>
            <GradientStop Color="#FF3EB5FF" Offset="1" />
            <GradientStop Color="White" Offset="0" />
        </RadialGradientBrush>
    </Window.Background>
    <Grid Name="grid1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="434*" />
            <ColumnDefinition Width="270*" />
        </Grid.ColumnDefinitions>
        <Grid Margin="10,10,0,12" Name="EquiGrid"  Focusable="False">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="2*" />
                <ColumnDefinition Width="198*" />
            </Grid.ColumnDefinitions>
            <Image Grid.ColumnSpan="2" Name="EquiImage" Stretch="Uniform" Margin="0,0,0,6" />
            <Grid Grid.Column="1" Height="100" HorizontalAlignment="Left" Margin="489,90,0,0" Name="grid2" VerticalAlignment="Top" Width="200" />
        </Grid>
        <Label Content="Label" Height="28" Margin="14,12,12,0" Name="longLabel" VerticalAlignment="Top" Grid.Column="1" OpacityMask="White" BorderBrush="Red" Focusable="False">
            <Label.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="White" Offset="0.025" />
                    <GradientStop Color="#FFDBDBDB" Offset="1" />
                </LinearGradientBrush>
            </Label.Background>
        </Label>
        <Label Content="Label" Height="28" Margin="14,46,12,0" Name="latLabel" VerticalAlignment="Top" Grid.Column="1" Focusable="False">
            <Label.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="White" Offset="0.025" />
                    <GradientStop Color="#FFDBDBDB" Offset="1" />
                </LinearGradientBrush>
            </Label.Background>
        </Label>
        <TextBlock Margin="14,80,12,54" Name="descriptionText" Padding="10" Text="" Grid.Column="1" Focusable="False"><TextBlock.Background><LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="White" Offset="0.025" /><GradientStop Color="#FFDBDBDB" Offset="1" /></LinearGradientBrush></TextBlock.Background></TextBlock>
        <Button Content="Load Image" Grid.Column="1" Margin="14,0,0,12" Name="button1" Height="36" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="124" Click="button1_Click" Focusable="False" />
        <Button Content="Load XML" Grid.Column="1" Margin="0,0,12,12" Name="button2" Height="36" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="114" Click="button2_Click" Focusable="False" />
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

和处理程序:

 private void Window_KeyDown_1(object sender, System.Windows.Input.KeyEventArgs e)
 { 
       Console.WriteLine("k"); 
 }
Run Code Online (Sandbox Code Playgroud)

我还发现问题出在重点。这些孩子虽然设置为无法聚焦,但他们将焦点转移到了窗口上并停止了事件触发。

Ral*_*ine 2

尝试使用 KeyDown 事件。

在代码隐藏中

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("KeyDown");
        System.Diagnostics.Debug.WriteLine(e.Key);
    }

    private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("PreviewKeyDown");
        System.Diagnostics.Debug.WriteLine(e.Key);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Button clicked");
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" KeyDown="Window_KeyDown" PreviewKeyDown="Window_PreviewKeyDown">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <TextBox Grid.Row="0"></TextBox>
        <Button Grid.Row="1" Content="Click me!" Click="Button_Click"></Button>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

  • 尝试启动一个新的 WPF 应用程序并将空白表单与这些事件处理程序一起使用。这段代码工作正常,一定是别的东西。 (2认同)
  • 这里非常相似的事情:[链接](http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/f146d886-f837-4d39-ad4a-7a191fbaf034)。有人说:上面的代码适用于空白表单和具有某些控件的表单,例如,在表单上放置一个按钮将阻止事件在具有焦点时触发,对此您无能为力。 (2认同)