C# 班次+;选项卡在TreeView控件中不工作
我无法在包含文本框的树视图中使用Shift+Tab进行向后导航,使用Tab进行向前导航可以正常工作,并在树视图中从文本框跳到文本框。当树状视图中的一个文本框使用Shift+Tab时,焦点将移动到树状视图外的上一个控件,而不是树状视图内的上一个控件 此外,它的唯一一个Shift+Tab导航无法正常工作,Ctrl+Shift+Tab按预期顺序正常工作 对我做错了什么有什么建议吗 示例代码:C# 班次+;选项卡在TreeView控件中不工作,c#,wpf,treeview,navigation,C#,Wpf,Treeview,Navigation,我无法在包含文本框的树视图中使用Shift+Tab进行向后导航,使用Tab进行向前导航可以正常工作,并在树视图中从文本框跳到文本框。当树状视图中的一个文本框使用Shift+Tab时,焦点将移动到树状视图外的上一个控件,而不是树状视图内的上一个控件 此外,它的唯一一个Shift+Tab导航无法正常工作,Ctrl+Shift+Tab按预期顺序正常工作 对我做错了什么有什么建议吗 示例代码: <Window x:Class="TestTabTreeView.MainWindow" xml
<Window x:Class="TestTabTreeView.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>
<Style TargetType="TreeViewItem">
<Setter Property="KeyboardNavigation.TabNavigation" Value="Continue" />
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox Text="First Line" Grid.Row="0" />
<TreeView Grid.Row="1" KeyboardNavigation.TabNavigation="Continue" IsTabStop="False">
<TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBox Text="Popular Words"/></TreeViewItem.Header>
<TreeViewItem><TreeViewItem.Header><TextBox Text="Foo"/></TreeViewItem.Header></TreeViewItem>
<TreeViewItem><TreeViewItem.Header><TextBox Text="Bar"/></TreeViewItem.Header></TreeViewItem>
<TreeViewItem><TreeViewItem.Header><TextBox Text="Hello"/></TreeViewItem.Header></TreeViewItem>
</TreeViewItem>
<TreeViewItem IsExpanded="True"><TreeViewItem.Header><TextBox Text="Unpopular Words"/></TreeViewItem.Header>
<TreeViewItem><TreeViewItem.Header><TextBox Text="Work"/></TreeViewItem.Header></TreeViewItem>
<TreeViewItem><TreeViewItem.Header><TextBox Text="Duplication"/></TreeViewItem.Header></TreeViewItem>
</TreeViewItem>
</TreeView>
<TextBox Text="Last Line" Grid.Row="2" />
</Grid>
如果使用ILSpy/Reflector查看TreeView.OnKeyDown处理程序,可以看到问题的原因。按下Shift+Tab键时,TreeView具有特殊处理功能。有关守则如下:
Key key = e.Key;
if (key != Key.Tab) {
// ...
}
else {
if (TreeView.IsShiftKeyDown && base.IsKeyboardFocusWithin &&
this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous))) {
e.Handled = true;
return;
}
}
不幸的是,您需要使用自定义的TreeView类来解决这个问题。类似这样的工作原理:
public class MyTreeView : TreeView {
protected override void OnKeyDown(KeyEventArgs e) {
if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0 && e.Key == Key.Tab)
return;
base.OnKeyDown(e);
}
}
您不必使用从TreeView继承的自定义类:
treeView.PreviewKeyDown += this.HandleTreeView_PreviewKeyDown
连同:
private void HandleTreeView_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Shift)
&& e.Key == Key.Tab)
{
var focusedElement = Keyboard.FocusedElement;
if (focusedElement != null)
{
focusedElement.MoveFocus(FocusNavigationDirection.Previous, 1);
}
e.Handled = true;
}
}
也很好用
例如,使用此解决方案,您可以创建自定义行为并将其附加到树视图