我有一個 WPF 文本框,帶有PreviewMouseLeftButtonDown在帶觸摸屏的筆記本電腦上運行的事件處理程式。
當我觸摸 TextBox 時,事件處理程式會按預期觸發。但是,如果我隨后觸摸應用程式中的其他位置,則該事件將在 8 次或 9 次觸摸后觸發。似乎 .NET 認為控制元件已被直接觸摸,即使觸摸不在 TextBox 控制元件的頂部。據我所知,事件處理程式的發送者和滑鼠事件引數在合法的 TextBox 觸摸和控制元件外的第 9 次觸摸之間沒有顯示任何可識別的差異。
這可以在獨立應用程式中輕松重現(請參閱下面的代碼和步驟):
- 觸摸 TextBox 一次。應打開一個新視窗以顯示已觸發的事件。
- 關閉由事件處理程式創建的視窗
- 觸摸應用程式視窗中不是 TextBox 的任意位置 9 次。
- 一個視窗應該再次打開,這意味著事件被觸發。
public MainWindow()
{
InitializeComponent();
MyTextBox.PreviewMouseLeftButtonDown = MyTextBox_PreviewMouseLeftButtonDown;
}
private void MyTextBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var win = new Window();
win.ShowDialog();
}
- 有什么解釋為什么在控制元件之外的觸摸有時會觸發 .NET 中控制元件的滑鼠事件?
- 是否有針對此問題的解決方法,以便可以在沒有誤報事件觸發器的情況下支持觸摸和滑鼠?
uj5u.com熱心網友回復:
經過更多的搜索找到了解決方案。
這是一個已知錯誤(請參閱https://github.com/dotnet/wpf/issues/2491)。
解決方法是在事件處理程式ShowDialog()的Dispatcher.BeginInvoke()呼叫中執行代碼。
可能發生的情況背后的理論是,在事件處理程式期間將焦點更改為新視窗會導致控制元件繼續認為它處于“觸摸”狀態。當進行后續觸摸時,WPF 認為它是多點觸摸操作的“第二根手指”并創建另一個處理程式。它一直這樣做,直到所有“十個手指”都被按下。之后,它回圈回到第一個處理程式。由于控制元件仍然認為它正在被觸摸,因此當您的“食指”觸摸應用程式的任何位置時,它就會觸發。
這解釋了為什么在文本框外觸摸 9 次后事件始終觸發,以及為什么在事件處理程式完成后呼叫 ShowDialog 可以解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/359042.html
下一篇:如何在WPF中停止后臺作業人員?
