制作WPF TabControl忽略Ctrl + Tab

时间:2009-05-07 13:05:55

标签: wpf tabcontrol keydown

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

(标签内的标签可能会令人困惑,所以我会重新设计内部TabControl样式,因此它看起来不像TabControl。我可能会将它设置为在顶部使用ToggleButtons而不是标签。)

我希望这个UI的行为与您期望的选项卡式浏览隐喻一样: Ctrl + Tab 应始终切换外部TabControl上的选项卡(看起来像一个TabControl),即使键盘焦点在内部TabControl内部(它看起来不像TabControl,因此不应该响应 Ctrl + Tab )。但是,当然,内部TabControl首先获取键事件并自行处理它。

保持内部TabControl不响应 Ctrl + Tab Ctrl + Shift + Tab 键事件,那么那些事件可以冒泡到外部TabControl?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

作为建议here创建自定义控件的替代方法,您可以创建一个“附加行为”来封装它:

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">
...