プログラムでキーボード フォーカスをツリー ビュー項目に設定しようとしています (特定の条件下で)。フォーカスを設定する 2 つの方法を試しましたが、どちらも にフォーカスを正常に取得できますが、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);
}
}
}
にフォーカスを設定しようとして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>
これらのメソッドはどちらもフォーカスを取得しますが、キーボード フォーカスを失います (TreeViewItem.IsSelectionActive
は false)。ウィンドウ内の他の要素には、私が知ることができるフォーカスまたはキーボードフォーカスはありません(テストでは、フォーカスを取得できる別のパネルに読み取り専用テキストボックスが1つしかありません)。興味深いことに、(コメント アウトされた) が false の場所でキーボード フォーカスを取得できますMultiTrigger
がIsSelectionActive
、もちろん、TreeViewItem
常にキーボード フォーカスが強制されます。
キーボード フォーカスを取得する可能性を高める別の方法はありますか? また、キーボード フォーカスを取得できない条件にはどのようなものがありますか?