带触摸的WPF选项卡控件不工作

本文关键字:控件 工作 选项 触摸 WPF | 更新日期: 2023-09-27 18:24:12

我有一个选项卡控件,它只通过鼠标单击来响应更改的选项卡。

尽管有Surface SDK,我是否需要在事件处理程序中手动编码选项卡控件?或者有更好的控制处理程序可以在这里使用吗?

我觉得这与拥有SDK完全相反。特别是因为我计划在我的程序中有很多不同的、唯一的选项卡,并且不想用button_TouchDown函数中的嵌套if单独处理每个选项卡。我已经有了自定义按钮,这些按钮具有button_TouchDown设置,添加单独的选项卡控件将是一件令人头疼的事情,而且代码非常混乱。

我试着寻找,但一无所获,这让我想,也许我错过了什么,它应该起作用。是因为我有一个预定义的button_TouchDown函数吗?

带触摸的WPF选项卡控件不工作

private void TabItem_TouchDown(object sender, TouchEventArgs e)
    {
        TabItem tab = sender as TabItem;
        TabControl control = tab.Parent as TabControl;
        control.SelectedItem = tab;
        e.Handled = true;
    }

XAML

 <TabItem x:Name="hccontactTab" Header="Phone" TouchDown="TabItem_TouchDown">

基于上述答案,但经过增强以考虑每次触摸的滚动。使用ClassHandler在应用程序中干净地处理此问题(我使用AutoFac的IStartable在构建容器期间自动注册它):

using System.Windows;
using System.Windows.Controls;
using Autofac;
namespace ...ClassHandlers
{
    public class TabItemTouchClassHandler : IStartable
    {
        public void Start()
        {
            Register();
        }
        public void Register()
        {
            EventManager.RegisterClassHandler(typeof(TabItem), UIElement.TouchDownEvent, new RoutedEventHandler(OnTabItemTouchDown));
        }
        //must be static! otherwise memory leaks!
        private static void OnTabItemTouchDown(object ender, routedEventArgs e)
        {
            var tab = sender as TabItem;
            var control = tab?.Parent as TabControl;
            if (control != null && !Equals(tab, control.SelectedItem))
            {
                control.SelectedItem = tab;
                e.Handled = true;
            }
        }
    }
}