#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();
}