我試圖以編程方式將鍵盤焦點設置爲樹視圖項目(在某些條件下)。我已經嘗試了兩種設置焦點的方法,它們都成功獲得了TreeViewItem
的焦點,但失去了鍵盤焦點。如何以編程方式將鍵盤焦點放在WPF TreeViewItem上?
樹視圖綁定到一個視圖模型:
<TreeView Name="solutionsModel" TreeViewItem.Selected="solutionsModel_Selected"
ItemsSource="{Binding Items, Mode=OneWay}" />
我試圖通過TreeViewItem
Selected
路由事件將焦點設置:
private void solutionsModel_Selected(object sender, RoutedEventArgs e)
{
if (solutionsModel.SelectedItem != null && solutionsModel.SelectedItem is SolutionViewModel)
{
if (e.OriginalSource != null && e.OriginalSource is TreeViewItem)
{
FocusManager.SetFocusedElement(solutionsModel, e.OriginalSource as TreeViewItem);
}
}
}
我試圖將焦點設置ControlTemplate
:
<Style d:IsControlPart="True" TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Trigger.Setters>
<Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}"></Setter>
</Trigger.Setters>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="IsSelectionActive" Value="false" />
</MultiTrigger.Conditions>
<!--
<MultiTrigger.Setters>
<Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}"></Setter>
</MultiTrigger.Setters>
-->
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
這兩種方法都會獲得焦點,但會失去鍵盤焦點(爲false)。窗口中沒有其他元素具有我可以說的焦點或鍵盤焦點(在測試中,在另一個面板上只有一個只讀文本框可以獲得焦點)。有趣的是,我可以將鍵盤專注於(註釋掉)MultiTrigger
,其中IsSelectionActive
是錯誤的,但當然這會使鍵盤始終集中在TreeViewItem
上。
有沒有另一種方法獲得鍵盤焦點的更好機會,以及在哪些情況下無法獲得鍵盤焦點?
謝謝約書亞。在我的情況下,我試圖最小化代碼,並讓用戶能夠使用輸入手勢(不必重新選擇節點)在樹視圖項上下文菜單上執行命令。目前,我正在擴展TreeViewItem以添加可用於MultiTrigger的NeedsFocus屬性。 – 2011-05-11 16:42:07