WPF如何在2画布上设置键盘输入焦点



那么我是如何获得Xamarin代码的:

<Canvas x:Name="player1" HorizontalAlignment="Left" Height="100" Margin="393,232,0,0" VerticalAlignment="Top" Width="10" KeyDown="keys_KeyDown" Keyboard.GotKeyboardFocus="Players_GotKeyboardFocus">
<Canvas.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="Red" Offset="1"/>
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
<Canvas x:Name="player2" HorizontalAlignment="Left" Height="100" Margin="978,232,0,0" VerticalAlignment="Top" Width="10" Keyboard.GotKeyboardFocus="Players_GotKeyboardFocus">
<Canvas.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FF002EFF" Offset="1"/>
</LinearGradientBrush>
</Canvas.Background>
</Canvas>

这就是C#:

private void Players_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
Keyboard.Focus(player1);
}
private void keys_KeyDown(object sender, KeyEventArgs e)
{
var y = Canvas.GetTop(player1);
if (e.Key == Key.W)
{
Canvas.SetTop(player1, y + 5);
}
else if (e.Key == Key.S)
{
Canvas.SetTop(player1, y - 5);
}
}

我打成平手,但没用,有人能帮忙吗?这可能是,如果你按下W player1,你会向上移动一点,如果你向下按下S。

我为画布添加Focusable="True"player1PreviewMouseLeftButtonDown以使其聚焦,xaml如下所示:

<Canvas Background="Azure">
<Canvas x:Name="player1" HorizontalAlignment="Left" Height="100" Margin="200,100,0,0"  VerticalAlignment="Top" Width="10" Focusable="True" KeyDown="keys_KeyDown" PreviewMouseLeftButtonDown="player1_PreviewMouseLeftButtonDown">
<Canvas.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="Red" Offset="1"/>
</LinearGradientBrush>
</Canvas.Background>
<Canvas.RenderTransform>
<TranslateTransform x:Name="player1Transform" />
</Canvas.RenderTransform>
</Canvas>
<Canvas x:Name="player2" HorizontalAlignment="Left" Height="100" Margin="300,100,0,0" VerticalAlignment="Top" Width="10"  Focusable="True">
<Canvas.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FF002EFF" Offset="1"/>
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</Canvas>

然后您可以使用以下代码来实现该功能:

private void keys_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.W)
{
player1Transform.Y += 5;
}
else if (e.Key == Key.S)
{
player1Transform.Y -= 5;
}
}
private void player1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.player1.Focus();
}