Событие Wpf в XAML не может получить правильный фокус на кнопке
Я пытаюсь заставить кнопку двигаться, когда нажимаю клавишу со стрелкой на клавиатуре. Но то, что я получаю, это то, что мне всегда нужно нажимать кнопку мышью, чтобы сначала получить правильный фокус, а затем я могу перемещать ее с помощью клавиши со стрелкой влево, иначе нет. Однако, как я знаю, событие KeyDown вызывается сеткой вместо кнопки.
Вот как я делаю это в Кодексе:
private void Panel_KeyDown(object sender, KeyEventArgs e)
{
Button source = Baffle;
if (source != null)
{
if (e.Key == Key.Left)
{
source.Margin = new Thickness(source.Margin.Left - 1, source.Margin.Top,
source.Margin.Right + 1, source.Margin.Bottom);
}
}
}
XAML:
<Grid Name="Panel" KeyDown="Panel_KeyDown" Background="BlanchedAlmond">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Name="Baffle" Template="{StaticResource ButtonTemplate}"
Grid.Row="1" VerticalAlignment="Bottom" Margin="20" HorizontalAlignment="Center"
Width="50" Height="20"/>
</Grid>
Кто-нибудь может объяснить это? Благодарю.
3 ответа
Интересно... Не знаю почему, но если вы хотите решить это простым способом, вы можете использовать это:
public partial class MainWindow : Window
{
private Button source;
public MainWindow()
{
InitializeComponent();
source = Baffle;
source.Focus();
}
private void Panel_KeyDown(object sender, KeyEventArgs e)
{
if (source != null)
{
if (e.Key == Key.Left)
{
source.Margin = new Thickness(source.Margin.Left - 1, source.Margin.Top,
source.Margin.Right + 1, source.Margin.Bottom);
}
}
}
}
(просто дайте этой кнопке сосредоточиться на нагрузке, и вы сможете перенести ее в свое удовольствие).
Это верно - ваше событие KEYDOWN срабатывает только тогда, когда Grid(Panel) фокусируется на нем. Но когда ваше приложение запускается, оно не фокусируется на нем и получит его, только когда вы выберете какой-либо элемент управления в Grid, например, эту кнопку или другую. MainWindow фокусируется на запуске, поэтому просто добавьте этот обработчик события в MainWindow KeyDown.
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" KeyDown="Panel_KeyDown">
<Grid Name="Panel" Background="BlanchedAlmond">
.....
Это потому что Grid
по умолчанию не фокусируется, поэтому KeyEvent
не будет работать, пока Grid
имеет фокус или один из элементов управления в Grid
FocusScope
имеет логическую направленность.
Вы можете установить Grid
в Focusable
и установите FocusedElement, используя FocusManager
к сетке, и это будет работать
Пример:
<Grid Name="Panel" KeyDown="Panel_KeyDown" Background="BlanchedAlmond" FocusManager.FocusedElement="{Binding ElementName=Panel}" Focusable="True">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Name="Baffle"
Grid.Row="1" VerticalAlignment="Bottom" Margin="20" HorizontalAlignment="Center"
Width="50" Height="20"/>
</Grid>