我创建了一个 TreeViewComboBox 控件,在这个控件中,我有一个带有 TreeView 项目的 ComboBox,但键盘导航在 TreeView 上不起作用。我无法使用键盘浏览 TreeViewItems。有什么帮助吗?
问问题
918 次
1 回答
0
在实现我们的属性网格控件时,我遇到了类似的问题。我们具体的问题(可能与您的类似)是键盘焦点事件未路由到TreeViewItem
.
我们解决它的方法是向 TreeViewItem 样式添加一个 AttachedProperty,并在它获得键盘焦点时选择节点。我使用服务模式实现了这一点。见下文:
在 XAML 中:
<Style x:Key="EditorBorder" TargetType="{x:Type Border}">
<Setter Property="Controls_Services:TreeViewItemService.SelectWhenKeyboardIsFocused" Value="True"/>
</Style>
在代码隐藏中:
public class TreeViewItemService
{
public static readonly DependencyProperty SelectWhenKeyboardIsFocusedProperty = DependencyProperty.RegisterAttached("SelectWhenKeyboardIsFocused",
typeof(bool), typeof(TreeViewItemService), new FrameworkPropertyMetadata(false, TreeViewItemService.OnSelectWhenKeyboardIsFocusedPropertyChanged));
static void OnSelectWhenKeyboardIsFocusedPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
{
FrameworkElement element = sender as FrameworkElement;
if (element == null)
return;
TreeViewItem target = MTVisualTreeHelper.FindParent<TreeViewItem>(element as DependencyObject);
if (target != null)
new IsSelectedOnKeyboardFocusAction(element, target);
}
public static bool GetSelectWhenKeyboardIsFocused(FrameworkElement target)
{
return (bool)target.GetValue(SelectWhenKeyboardIsFocusedProperty);
}
public static void SetSelectWhenKeyboardIsFocused(FrameworkElement target, bool value)
{
target.SetValue(SelectWhenKeyboardIsFocusedProperty, value);
}
private class IsSelectedOnKeyboardFocusAction
{
TreeViewItem m_Target;
FrameworkElement m_Source;
public IsSelectedOnKeyboardFocusAction(FrameworkElement source, TreeViewItem item)
{
m_Source = source;
m_Target = item;
m_Source.Loaded += OnSource_Loaded;
m_Source.Unloaded += OnSource_Unloaded;
}
void OnSource_Loaded(object sender, RoutedEventArgs e)
{
m_Source.PreviewMouseLeftButtonDown += OnSource_PreviewMouseLeftButtonDown;
m_Source.GotFocus += OnSource_GotFocus;
m_Source.LostFocus += OnSource_LostFocus;
m_Source.GotKeyboardFocus += OnSource_GotKeyboardFocus;
m_Source.LostKeyboardFocus += OnSource_LostKeyboardFocus;
}
void OnSource_Unloaded(object sender, RoutedEventArgs e)
{
m_Source.PreviewMouseLeftButtonDown -= OnSource_PreviewMouseLeftButtonDown;
m_Source.GotFocus -= OnSource_GotFocus;
m_Source.LostFocus -= OnSource_LostFocus;
m_Source.GotKeyboardFocus -= OnSource_GotKeyboardFocus;
m_Source.LostKeyboardFocus -= OnSource_LostKeyboardFocus;
}
void OnSource_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (!m_Target.IsSelected)
m_Target.IsSelected = true;
}
void OnSource_GotFocus(object sender, RoutedEventArgs e)
{
if (!m_Target.IsSelected)
m_Target.IsSelected = true;
}
void OnSource_LostFocus(object sender, RoutedEventArgs e)
{
if (m_Target.IsSelected)
m_Target.IsSelected = false;
}
void OnSource_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
if (!m_Target.IsSelected)
m_Target.IsSelected = true;
}
void OnSource_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
if (m_Target.IsSelected)
m_Target.IsSelected = false;
}
}
}
高温下,
于 2010-07-19T07:46:30.553 回答