WPF Tab Control с сенсорным не работает

У меня есть элемент управления вкладками, который реагирует только на изменение вкладок одним щелчком мыши.

Нужно ли вручную кодировать в обработчике событий для управления вкладками, несмотря на наличие Surface SDK? Или есть лучший обработчик управления, который я мог бы использовать здесь?

Я чувствую, что это совершенно контрпродуктивно, вплоть до наличия SDK. Тем более, что я планирую иметь много разных уникальных вкладок в своей программе и не хочу обрабатывать каждую вкладку отдельно с вложенными if в функции button_TouchDown. У меня уже есть пользовательские кнопки с настройкой button_TouchDown, и добавление отдельных элементов управления вкладками было бы головной болью и адским беспорядком кода.

Я попытался искать, но пришел с пустыми руками, что заставляет меня думать, что, возможно, я что-то упустил, и это должно работать. Это потому, что у меня есть предопределенная функция button_TouchDown?

2 ответа

Решение
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 для аккуратной обработки этого в вашем приложении (я использую IStartable AutoFac для автоматической регистрации при сборке контейнера):

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;
            }
        }
    }
}
Другие вопросы по тегам