Управление вкладками WPF с сенсорным экраном не работает

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

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

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

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


person user99999991    schedule 22.07.2013    source источник
comment
Возможно, ваш сенсорный экран устарел и «эмулирует» мышь? У меня есть приложение WPF и сенсорный экран, который отлично работает. Возможно, какой-то ваш «беспорядок кода» что-то отключает.   -  person kenny    schedule 22.07.2013


Ответы (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">
person user99999991    schedule 23.07.2013
comment
почти! убедитесь, что вы не установили для e.Handled значение true, если текущая вкладка уже правильная. иначе прокрутка за касание больше не будет работать - person uTILLIty; 08.08.2016

На основе приведенного выше ответа, но улучшенного для учета прокрутки за касание. Используйте 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;
            }
        }
    }
}
person uTILLIty    schedule 08.08.2016