WPF как установить фокус ввода клавиатуры на 2 холста?

#c# #wpf #xamarin #visual-studio-2019

#c# #wpf #xamarin #visual-studio-2019

Вопрос:

Итак, как у меня есть код 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 вниз.

Комментарии:

1. Итак, вы сфокусировали холст player1 Keyboard.Focus(player1); , что означает, что это keys_KeyDown также холст player1? можете ли вы показать XAML?

2. Вы установили canvas .Focusable на true ?

Ответ №1:

Я добавляю Focusable="True" для холста player1 и a PreviewMouseLeftButtonDown , чтобы сделать его сфокусированным, 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();
    }