WPF如何在2个Canvas上设置Keyboardinput焦点?

问题描述

所以我怎么拥有Xamarin代码

<Canvas x:Name="player1" HorizontalAlignment="Left" Height="100" Margin="393,232,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,0" VerticalAlignment="Top" Width="10" Keyboard.GotKeyboardFocus="Players_GotKeyboardFocus">
            <Canvas.Background>
                <LinearGradientBrush EndPoint="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播放器1,则应该将小提琴向上移动,如果您按下S,则应该将小提琴移动。

解决方法

我为画布 player1 添加Focusable="True"和一个PreviewMouseLeftButtonDown以使其成为焦点,xaml如下所示:

<Canvas Background="Azure">
    <Canvas x:Name="player1" HorizontalAlignment="Left" Height="100" Margin="200,100,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,0" VerticalAlignment="Top" Width="10"  Focusable="True">
        <Canvas.Background>
            <LinearGradientBrush EndPoint="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();
    }