1

当我按下键盘上的箭头键时,我尝试让按钮移动。但是我得到的是我总是需要先用鼠标按下按钮才能获得正确的焦点,然后我可以用左箭头键移动它,否则不能。但是,据我所知,KeyDown 事件是由 Grid 而不是按钮触发的。

这是我在后面的代码中的做法:

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>

谁能解释一下?谢谢。

4

3 回答 3

0

有趣......不知道为什么,但如果你想以一种简单的方式解决它,你可以使用这个:

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

(只需将该按钮的重点放在加载上,您就可以将其移至您的内心深处)。

于 2013-10-17T07:48:52.520 回答
0

没错-您的 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">
    .....
于 2013-10-17T07:48:59.460 回答
0

这是因为Grid默认情况下是不可聚焦的,因此在具有焦点或其中的控件之一具有逻辑焦点KeyEvent之前,它不会起作用。GridGrid FocusScope

您可以使用 GridGrid设置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>
于 2013-10-17T07:51:37.173 回答