2013-10-17 49 views
1

我嘗試按下鍵盤上的箭頭鍵時按鈕移動。 但我得到的是,我總是需要用鼠標按下按鈕來首先獲得正確的焦點,然後我可以用左箭頭鍵移動它,否則不能。但是,正如我所知,KeyDown事件是由Grid而不是按鈕觸發的。XAML中的Wpf事件無法正確對焦按鈕

這裏是我如何做到這一點在後面的代碼:

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> 

誰能解釋一下嗎?謝謝。

回答

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

(簡單地給該按鈕的焦點上的負載,並且可以移動它到你心中的內容)。

0

沒錯 - 您的KEYDOWN事件只有在網格(面板)專注於它時觸發。但是當你的應用程序啓動時,它並沒有專注於它,只有當你選擇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"> 
    ..... 
0

這是因爲Grid默認不可作爲焦點,所以KeyEvent不會工作,直到Grid具有焦點或在GridFocusScope其中一個控件具有邏輯焦點。

您可以設置GridFocusable和設置使用FocusManager到電網的FocusedElement,這將工作

例子:

<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>