首页 文章

制作WPF TabControl忽略Ctrl Tab

提问于
浏览
2

我正在编写一个使用“标签式浏览”比喻的应用程序,TabControl是窗口的完整大小,以及标签内的其他内容 . 有时这些选项卡本身包含其他TabControls .

(选项卡内的选项卡可能会令人困惑,因此我将重新设置内部TabControl的样式,因此它看起来不像TabControl . 我可能会将其设置为使用顶部的ToggleButtons而非标签 . )

我希望这个UI的行为就像你期望选项卡式浏览隐喻一样:Ctrl Tab应该总是切换外部TabControl(看起来像TabControl的那个)上的标签,即使键盘焦点位于内部TabControl内部(也不是't look like a TabControl, and therefore shouldn' t应该响应Ctrl Tab) . 但是,当然,内部TabControl首先获取键事件并自行处理它 .

保持内部TabControl不响应Ctrl Tab和Ctrl Shift Tab键事件的最佳方法是什么,这些事件可以冒泡到外部TabControl?

3 回答

  • 1

    WPF TabControl似乎通过OnKeyDown方法管理键盘导航功能 . 我建议创建一个继承自TabControl的自定义控件,并覆盖OnKeyDown方法 .

  • 1

    您可以在内部TabControl上处理PreviewKeyDown事件,并设置e.Handled = true以防止它处理关键事件 . 然后,您可以找到父TabControl(可能递归通过((TabControl)发送者).Parent)并以编程方式更改其SelectedIndex .

    将其包装在自定义控件中将使其保持合理清洁 .

  • 3

    作为建议here创建自定义控件的替代方法,您可以创建一个"Attached behaviour"来封装它:

    namespace WpfApplication1
    {
      using System.Windows;
      using System.Windows.Input;
    
      public static class IgnoreCtrlTabBehaviour
      {
        //Setter for use in XAML: this "enables" this behaviour
        public static void SetEnabled(DependencyObject depObj, bool value)
        {
          depObj.SetValue(EnabledProperty, value);
        }
    
        public static readonly DependencyProperty EnabledProperty =
            DependencyProperty.RegisterAttached("Enabled", typeof(bool), 
            typeof(IgnoreCtrlTabBehaviour), 
            new FrameworkPropertyMetadata(false, OnEnabledSet));
    
        static void OnEnabledSet(DependencyObject depObj, DependencyPropertyChangedEventArgs args)
        {
          var uiElement = depObj as UIElement;
          uiElement.PreviewKeyDown += 
            (object _, System.Windows.Input.KeyEventArgs e) => 
            {
              if (e.Key == Key.Tab && 
                  (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
              {
                e.Handled = true;
              }
            };
          }
        }
      }
    

    像这样在XAML中使用:

    <Window x:Class="WpfApplication1.MainWindow"
        ...
        xmlns:local="clr-namespace:WpfApplication1"
    
    ...
    <TabControl local:IgnoreCtrlTabBehaviour.Enabled="True">
      <TabItem Header="tab1">
    ...
    

相关问题