Я использую KeyBinding
в своем окне, привязанном к Command
, чтобы обеспечить глобальную навигацию по TreeView
особым образом (итерации по узлам третьего уровня) с использованием Page Up и Page Down.Когда TreeView
или какой-либо из его элементов находятся в фокусе, нажатие Page Up или Page Down перемещается по узлам без запуска команды.Я попытался захватить PreviewKeyDown
в TreeView и установить событие в Handled, но это ничего не дает.TreeView съедает ключевое событие и никогда не попадает в окно для запуска команды.Есть ли способ переопределить, как эти нажатия клавиш обрабатываются в TreeView?
XAML:
<Window>
<Window.InputBindings>
<KeyBinding Key="PageDown" Command="{Binding NextPageCommand}"/>
<KeyBinding Key="PageUp" Command="{Binding PrevPageCommand}"/>
</Window.InputBindings>
<DockPanel>
<TreeView ItemsSource="{Binding Path=Documents}"
PreviewKeyDown="tv_OnPreviewKeyDown">
<TreeView.ItemTemplate>
<!--Unimportant hierarchical templates-->
</TreeView.ItemTemplate>
</TreeView>
</DockPanel>
</Window>
CodeBehind:
private void tv_OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.PageDown || e.Key == Key.PageUp)
e.Handled = true
}
Я нашел, что могу обойтиэто путем повторного выделения InputBinding
s на уровне TreeView, но действительно ли это лучший способ сделать это?