我正在编写一个使用“标签式浏览”比喻的应用程序,TabControl是窗口的完整大小,以及标签内的其他内容。有时这些选项卡本身包含其他TabControls。
(标签内的标签可能会令人困惑,所以我会重新设计内部TabControl样式,因此它看起来不像TabControl。我可能会将它设置为在顶部使用ToggleButtons而不是标签。)
我希望这个UI的行为与您期望的选项卡式浏览隐喻一样: Ctrl + Tab 应始终切换外部TabControl上的选项卡(看起来像一个TabControl),即使键盘焦点在内部TabControl内部(它看起来不像TabControl,因此不应该响应 Ctrl + Tab )。但是,当然,内部TabControl首先获取键事件并自行处理它。
保持内部TabControl不响应 Ctrl + Tab 和 Ctrl + Shift + Tab 键事件,那么那些事件可以冒泡到外部TabControl?
答案 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">
...