2016-01-12 33 views
0

在WPF中,默認情況下,當焦點控件變爲不可見時,焦點將更改爲下一個可調焦的父容器。有沒有一種通用的方式將焦點轉移到下一個可調焦的兄弟控制上?例如,給定這個人爲的例子:當控件變得不可見時,如何將焦點移至下一個兄弟而不是父項?

<StackPanel Focusable="True"> 
     <Button Height="30" Width="150" Click="Button_Click">First</Button> 
     <Button Height="30" Width="150">Second</Button> 
</StackPanel> 

與此事件處理程序來隱藏第一個按鈕:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    ((Button) sender).Visibility = Visibility.Collapsed; 
} 

如果標籤的第一個按鈕,然後按Enter,在StackPanel中獲得焦點。我想要第二個按鈕來獲得焦點。

我希望有一個通用的解決方案(相對於通過代碼背後的特定元素設置焦點),因爲我在我的應用程序中有幾個位置,這是鍵盤導航的一個問題。

+0

是否[FocusManager.IsFocusScope](https://msdn.microsoft.com /en-us/library/system.windows.input.focusmanager.isfocusscope(v=vs.110).aspx)在StackPanel上有這種效果嗎? –

+0

是的,它的行爲方式相同。如果直接父級將IsFocusScope設置爲false,那麼WPF似乎只是走到樹上找到第一個可調焦的父控件,然後將其聚焦。 (實際上,這些容器是用戶控件或ListBox,可以合法獲得焦點的東西,而不是StackPanels。) –

回答

1

FocusManager.SetFocusedElementhttps://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.setfocusedelement(v=vs.110).aspx可用於將邏輯焦點設置爲特定元素。

FocusManager.SetFocusedElement(focusScope1, button2); 

您需要擁有當前的焦點範圍。

這可以從XAML來完成:

<Style x:Key="FocusButton" TargetType="StackPanel"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding ElementName=button1, Path=IsVisible}" Value="True"> 
      <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=button2}"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

邏輯焦點是不一樣的鍵盤焦點 - MSDN

+0

這很有幫助。不幸的是,這不是一個理想的「一般情況」設置,我可以申請,但足以讓我通過我目前的問題。謝謝! –

相關問題