WPF: Disable arrow-keys on tabcontrol

丶灬走出姿态 提交于 2019-12-10 11:27:26

问题


I'm using the WPF TabControl in my application in order to switch between different areas/functions of the program.

One thing annoys me though. I have hidden the tabs so I can control the selectedtab, instead of the user. The user however, can still switch between tabs using the arrow-keys.

I have tried using the KeyboardNavigation-attribute, but I can't get this working.

Can this be disabled?


回答1:


You can hook on to the TabControl.PreviewKeyDown event for this one. Check to see if it's the left or right arrow and say that you've handled it.

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

if you're using a pure view model application you could apply the above as an attached property.

XAMl to use the below attached property.

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


来源:https://stackoverflow.com/questions/11096621/wpf-disable-arrow-keys-on-tabcontrol

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!