2011-07-14 74 views
3

我有一個網格和一個按鈕。我希望能夠按向下箭頭選擇一行,然後點擊按鈕,然後按向下箭頭選擇下一行,然後單擊按鈕。即使左鍵單擊時也保留網格焦點狀態

但是,當我點擊按鈕時,網格鍵盤焦點不再在行上。

下面是一個例子。在這幅圖中,我選擇了第三行。我想要的行爲是:我用鼠標點擊按下我,然後按鍵盤向下箭頭一次選擇第四行。相反,當我按向下箭頭頂部單元格有一個框架,當我再次按下時,頂部行被選中。

A WPF grid and a button

我應該如何去創造我所需要的行爲?我試着編輯後面的代碼來明確地關注網格,但那不起作用。

下面是該示例的完整代碼。

<Window x:Class="WpfTest.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"> 
<Window.Resources> 
     <XmlDataProvider x:Key="DcCharacters"> 
      <x:XData> 
       <Characters xmlns=""> 
        <Character HeroName="Catwoman" Identity="Selina Kyle" /> 
        <Character HeroName="Batman" Identity="Bruce Wayne" /> 
        <Character HeroName="Starman" Identity="Jack Knight" /> 
        <Character HeroName="BlueBeetle" Identity="Jaime Reyes" /> 
       </Characters> 
      </x:XData> 
     </XmlDataProvider> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <DataGrid 
      Grid.Row="0" 
      ItemsSource="{Binding Source={StaticResource DcCharacters}, 
      XPath=//Characters/Character}" 
      AutoGenerateColumns="False" 
          IsReadOnly="True" 
      > 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding [email protected]}" /> 
       <DataGridTextColumn Binding="{Binding [email protected]}" /> 
      </DataGrid.Columns> 

     </DataGrid> 
     <StackPanel Grid.Row="1"> 
      <Button Margin="3,3,3,3" Width="Auto" Height="Auto" HorizontalAlignment="Left">_Press Me!</Button> 
     </StackPanel> 
    </Grid> 
</Window> 

回答

2

我認爲你正在尋找附加屬性FocusManager.IsFocusScope

通過將其設置爲StackPanel上的true,其中的Button's(或其他控件)在用鼠標單擊時不會竊取焦點。它們將像工具欄按鈕或菜單一樣工作。儘管如此,你仍然可以選中它們。

下面是一個例子,如果你有三個按鈕,而不是一個,剪切,複製和粘貼

<StackPanel Grid.Row="1" 
      FocusManager.IsFocusScope="True" > 
    <Button Width="Auto" Height="Auto" HorizontalAlignment="Left">Cut</Button> 
    <Button Width="Auto" Height="Auto" HorizontalAlignment="Left">Copy</Button> 
    <Button Width="Auto" Height="Auto" HorizontalAlignment="Left">Paste</Button> 
</StackPanel> 

或者在你的情況,只是

<StackPanel Grid.Row="1" 
      FocusManager.IsFocusScope="True"> 
    <Button Margin="3,3,3,3" Width="Auto" Height="Auto" HorizontalAlignment="Left">_Press Me!</Button> 
</StackPanel> 
1

只需Focusable = "False"爲您的按鈕。這個對我有用。

<Button Margin="3,3,3,3" Width="Auto" Height="Auto" HorizontalAlignment="Left" Focusable="False">_Press Me!</Button> 
+0

+1因爲它有效。我唯一的問題是,如果我想要的話,我不能在該按鈕上標籤。 (讓我們看看我們是否可以實現一切:-) –

+0

只有一件事出現在我的腦海裏 - 把'Focusable'綁定到某個屬性上。當你在桌上時 - 它是虛假的。當你離開 - 它的真實。 – stukselbax

1

一個黑客攻擊的一種,但它的工作原理

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
     { 
      if (myDataGrid.SelectedItem != null && e.Key == Key.Down) 
      { 
       DataGridRow dgrow = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.SelectedItem); 
       dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
      } 
     } 
+0

+1不錯。我試圖覆蓋按鈕點擊處理程序,但通過隧道事件處理箭頭鍵更聰明。 –

相關問題