WPF:禁用 tabcontrol 上的箭头键

标签 wpf xaml tabcontrol

我在我的应用程序中使用 WPF TabControl 以便在程序的不同区域/功能之间切换。

不过有一件事让我很恼火。我隐藏了选项卡,因此我可以控制选定的选项卡,而不是用户。但是,用户仍然可以使用箭头键在选项卡之间切换。

我曾尝试使用 KeyboardNavigation-attribute,但无法正常工作。

这个可以禁用吗?

最佳答案

您可以为这个事件挂上 TabControl.PreviewKeyDown 事件。检查它是向左还是向右箭头,然后说你已经处理了它。

    private void TabControl_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Left || e.Key == Key.Right)
            e.Handled = true;
    }

如果您使用的是纯 View 模型应用程序,则可以将上述内容作为附加属性应用。

XAMl 使用以下附加属性。
<TabControl local:TabControlAttached.IsLeftRightDisabled="True">
    <TabItem Header="test"/>
    <TabItem Header="test"/>
</TabControl>

TabControlAttached.cs
public class TabControlAttached : DependencyObject
{
    public static bool GetIsLeftRightDisabled(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsLeftRightDisabledProperty);
    }

    public static void SetIsLeftRightDisabled(DependencyObject obj, bool value)
    {
        obj.SetValue(IsLeftRightDisabledProperty, value);
    }

    // Using a DependencyProperty as the backing store for IsLeftRightDisabled.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsLeftRightDisabledProperty =
        DependencyProperty.RegisterAttached("IsLeftRightDisabled", typeof(bool), typeof(MainWindow), new UIPropertyMetadata(false, new PropertyChangedCallback((s, e) =>
        {
            // get a reference to the tab control.
            TabControl targetTabControl = s as TabControl;
            if (targetTabControl != null)
            {
                if ((bool)e.NewValue)
                {
                    // Need some events from it.
                    targetTabControl.PreviewKeyDown += new KeyEventHandler(targetTabControl_PreviewKeyDown);
                    targetTabControl.Unloaded += new RoutedEventHandler(targetTabControl_Unloaded);
                }
                else if ((bool)e.OldValue)
                {
                    targetTabControl.PreviewKeyDown -= new KeyEventHandler(targetTabControl_PreviewKeyDown);
                    targetTabControl.Unloaded -= new RoutedEventHandler(targetTabControl_Unloaded);
                }
            }
        })));

    static void targetTabControl_Unloaded(object sender, RoutedEventArgs e)
    {

        TabControl targetTabControl = sender as TabControl;
        targetTabControl.PreviewKeyDown -= new KeyEventHandler(targetTabControl_PreviewKeyDown);
        targetTabControl.Unloaded -= new RoutedEventHandler(targetTabControl_Unloaded);
    }

    static void targetTabControl_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Left || e.Key == Key.Right)
            e.Handled = true;
    }
}

关于WPF:禁用 tabcontrol 上的箭头键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11096621/

相关文章:

WPF 按钮图标被镜像,为什么?

c# - 将 wpf 元素树序列化为 Xaml 的最佳方法?

wpf - 水平列表框项目垂直布局

xaml - 忽略 XamlWriter.Save 中的不可序列化对象

c# - 无法从 DoubleClick 事件切换 TabItem

c# - 使选项卡标题灵活地适应 WPF 上的标题文本

c# - 当列表计数为 "0"时插入到列表中

c# - 附加属性不触发 IMultiValueConverter

WPF TabControl 和 DataTemplates

c# - WPF 验证 (IDataErrorInfo) 和制表符聚焦问题