Исключение происходит при нажатии кнопки на сенсорном экране с помощью стилуса или пальца в приложении WPF
У меня есть приложение WPF с начальным окном, которое отображается при запуске как Splashscreen. Во время запуска есть фоновый поток, и мы можем отменить этот поток, нажав кнопку на заставке. Все это прекрасно работает при использовании мыши и нажатии на кнопку, чтобы отменить. Однако, если я использую сенсорный экран, чтобы нажать на эту кнопку, то иногда приложение вылетает, и следом идет трассировка стека. Приложение является 64-битной целевой, работающей на Windows 7 64-битной.
Severity:
Fatal
Stack Trace:
Exception 0
Message: Object reference not set to an instance of an object.
StackTrace:
at MS.Internal.PointUtil.TryClientToRoot(Point point, PresentationSource presentationSource, Boolean throwOnError, Boolean& success)
at System.Windows.Input.StylusDevice.GetPosition(IInputElement relativeTo)
at System.Windows.Input.StylusDevice.ChangeStylusOver(IInputElement stylusOver)
at System.Windows.Input.StylusLogic.PreProcessInput(Object sender, PreProcessInputEventArgs e)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.PossiblyDeactivate(IntPtr hwndCapture, Boolean stillActiveIfOverSelf)
at System.Windows.Interop.HwndMouseInputProvider.Dispose()
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
FromSubsystem:
PresentationCore
Help Link:
Not specified
Кто-нибудь сталкивался с этой проблемой раньше?
2 ответа
Вы используете сенсорный экран Elo? У меня похожий сбой в StylusLogic OnDispatcherShutdown с сенсорным дисплеем Elo. Я решил это, отключив RealTimeStylus для wpf ( отключите RealTimeStylus для приложений WPF). Мне кажется, что событие обрабатывается дважды (в драйвере дисплея и стилусе wpf), но в обработчике стилуса wpf окно уже уничтожено. Также у меня сработала небольшая задержка перед вызовом close window.
Основываясь на ответе Луз Де Гана, я обнаружил, что задержка закрытия окна работает лучше всего без необходимости отключать RealTimeStylus.
В вашем обработчике события отмены используйте это, чтобы отложить закрытие окна:
Dispatcher.InvokeAsync(this.Close, DispatcherPriority.Input);
Это должно быть DispatcherPriority.Input
чтобы убедиться, что закрытие происходит после обработки событий сенсорного ввода.