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