如何解决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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。