Событие Wpf в XAML не может получить правильный фокус на кнопке

Я пытаюсь заставить кнопку двигаться, когда нажимаю клавишу со стрелкой на клавиатуре. Но то, что я получаю, это то, что мне всегда нужно нажимать кнопку мышью, чтобы сначала получить правильный фокус, а затем я могу перемещать ее с помощью клавиши со стрелкой влево, иначе нет. Однако, как я знаю, событие KeyDown вызывается сеткой вместо кнопки.

Вот как я делаю это в Кодексе:

private void Panel_KeyDown(object sender, KeyEventArgs e)
 {
    Button source = Baffle;
     if (source != null)
     {
        if (e.Key == Key.Left)
          {
             source.Margin = new Thickness(source.Margin.Left - 1, source.Margin.Top,
             source.Margin.Right + 1, source.Margin.Bottom);
            }
        }
 }

XAML:

<Grid Name="Panel" KeyDown="Panel_KeyDown"  Background="BlanchedAlmond">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Button Name="Baffle" Template="{StaticResource ButtonTemplate}"   
Grid.Row="1" VerticalAlignment="Bottom" Margin="20" HorizontalAlignment="Center" 
Width="50" Height="20"/>
</Grid>

Кто-нибудь может объяснить это? Благодарю.

3 ответа

Интересно... Не знаю почему, но если вы хотите решить это простым способом, вы можете использовать это:

public partial class MainWindow : Window
{
    private Button source;
    public MainWindow()
    {
        InitializeComponent();
        source = Baffle;
        source.Focus();
    }

    private void Panel_KeyDown(object sender, KeyEventArgs e)
    {
        if (source != null)
        {
            if (e.Key == Key.Left)
            {
                source.Margin = new Thickness(source.Margin.Left - 1, source.Margin.Top,
                source.Margin.Right + 1, source.Margin.Bottom);
            }
        }
    }
}

(просто дайте этой кнопке сосредоточиться на нагрузке, и вы сможете перенести ее в свое удовольствие).

Это верно - ваше событие KEYDOWN срабатывает только тогда, когда Grid(Panel) фокусируется на нем. Но когда ваше приложение запускается, оно не фокусируется на нем и получит его, только когда вы выберете какой-либо элемент управления в Grid, например, эту кнопку или другую. MainWindow фокусируется на запуске, поэтому просто добавьте этот обработчик события в MainWindow KeyDown.

 <Window x:Class="WpfApplication4.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="Panel_KeyDown">
    <Grid Name="Panel"   Background="BlanchedAlmond">
    .....

Это потому что Grid по умолчанию не фокусируется, поэтому KeyEvent не будет работать, пока Grid имеет фокус или один из элементов управления в GridFocusScope имеет логическую направленность.

Вы можете установить Grid в Focusable и установите FocusedElement, используя FocusManager к сетке, и это будет работать

Пример:

<Grid Name="Panel" KeyDown="Panel_KeyDown"  Background="BlanchedAlmond" FocusManager.FocusedElement="{Binding ElementName=Panel}" Focusable="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Button Name="Baffle"    
Grid.Row="1" VerticalAlignment="Bottom" Margin="20" HorizontalAlignment="Center" 
Width="50" Height="20"/>
    </Grid>
Другие вопросы по тегам