代码之家  ›  专栏  ›  技术社区  ›  viky

键盘导航不工作

  •  0
  • viky  · 技术社区  · 14 年前

    1 回复  |  直到 14 年前
        1
  •  0
  •   Dennis    14 年前

    我们的 能够 与您的类似,是键盘焦点事件没有路由到 TreeViewItem .

    我们解决这个问题的方法是向TreeViewItem样式和 获取键盘焦点时的节点。我用一个 图案。见下表:

    在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;
          }
    
        }
    
      }
    

    嗯,