#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
, чтобы он был зарегистрирован. Похоже, это решило мою проблему.