Почему взаимодействие с касанием происходит медленнее, чем события щелчка в WPF?

#c# #wpf #touch

#c# #wpf #коснитесь

Вопрос:

В моем приложении WPF (которое находится в производстве) происходит чрезвычайно странный сценарий. У меня есть пара <Button> элементов на экране, к которым Click привязаны события в коде XAML. Обработчик щелчка для кнопки используется HttpClient для перехода к конечной точке REST (используя await / async ), а затем обновляет экран полученными данными.

Это приложение работает на некоторых дешевых планшетах Dell, поэтому сенсорный экран является основным способом взаимодействия. Однако для целей тестирования я подключил мышь.

Когда я использую мышь для нажатия кнопки, приложение работает очень эффективно; другими словами, это быстро. Вызов REST завершается в течение 100-200 мс.

Когда я нажимаю на экран, чтобы нажать кнопку, которая — поверьте мне — я подтвердил, попадает в тот же самый обработчик щелчка и выполняет тот же самый путь кода, обычно это неэффективно. Внезапно тот же самый вызов REST занимает намного больше времени. Иногда это занимает 2 секунды. В других случаях это занимает 10 секунд. У меня нет объяснения, почему возникает эта разница.

Когда я отлаживаю это же приложение на своем Surface Pro 3 (гораздо лучшее оборудование, чем планшет Dell), я не могу воспроизвести проблему. Но если бы это была чисто аппаратная проблема, мне пришлось бы задаться вопросом, почему она может быть эффективной в некоторых случаях (с помощью мыши), но не в других (с использованием сенсорного экрана).

Я изо всех сил пытался создать MVCE, потому что мои урезанные ответвления, которые я пытался создать, похоже, не имеют этой проблемы, но я продолжу пытаться редактировать этот пост, если смогу его придумать.

В то же время мне интересно, сталкивался ли кто-нибудь еще с подобной проблемой с сенсорными экранами. Единственная теория, которая у меня есть, заключается в том, что что-то в обработчике касания WPF запускает что-то в отдельных потоках или отдельных контекстах или с отдельными приоритетами (что-то в этом роде).

Комментарии:

1. Вы пробовали . Net framework версии 4.6.1? С сенсорными устройствами произошло значительное улучшение производительности .

2. Я только вчера попробовал это обновление, и, к сожалению, оно не решило проблему. Тем не менее, спасибо за предложение.

Ответ №1:

Итак, сегодня я, наконец, понял это. У меня был глобальный обработчик события приземления, зарегистрированный в моем файле App.xaml.cs, с использованием этого кода:

 EventManager.RegisterClassHandler(typeof(UIElement), UIElement.TouchDownEvent, new EventHandler<TouchEventArgs>(MyEventHandler));
  

Когда я комментирую эту строку, все отлично работает в 100% случаев. Я вижу, что проблема в том, что он зарегистрирован на каждом UIElement , когда на самом деле я просто хочу Window , чтобы он был зарегистрирован. Похоже, это решило мою проблему.