2014-02-17 87 views
4

我有一個在將觸摸支持添加到.NET(v 4.0)之前編寫的WPF項目,因此只處理了鼠標事件。當用手指在觸摸屏上測試項目時,我遇到了這個問題。WPF無法從MouseDown事件獲取觸摸位置

問題是,在第一次觸摸中位置(X,Y)被正確檢索,但(X,Y)值在後續觸摸中保持不變,無論我觸摸哪個位置,即使觸摸了的圖像,MouseDown事件被觸發,這使得它更奇怪。它可以在.NET 3.0/3.5/4.0中複製,在Win7/Win8上測試,都是64位。它似乎是MouseDown事件是行爲不端,MouseUp工作正常。

更新:

這是一個歷史悠久的錯誤和MS還沒有固定它(甚至4.5),所以你必須,如果你遇到同樣的症狀更新代碼 - 得到觸摸來自Touch事件的位置,而不是Mouse事件。幸運的是,這個bug並不是微妙的,所以它只需要一段時間來定位和修復。

代碼來重現問題:

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Image Height="60" Width="80" x:Name="Image" MouseDown="Image_MouseDown" 
       Source="/WpfApplication1;component/Images/Desert.jpg" /> 
    </Grid> 
</Window> 

後面的代碼:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
     private void Image_MouseDown(object sender, MouseButtonEventArgs e) 
     { 
      Point p = e.GetPosition(Image); 
      MessageBox.Show(p.X.ToString() + " " + p.Y.ToString()); 
     } 
    } 
} 

回答

1

默認情況下在WPF中,如果觸摸事件不是由一個控制它處理將被提升爲鼠標事件。觸摸事件是路由事件,所以當鼠標事件被觸發時,它會沿着可視樹上下移動(因此即使您在圖像之外觸摸,也會執行事件處理程序)。

如果MouseDown事件來自於提升觸摸事件,你可以使用StylusDevice可能得到正確的位置:

if (e.StylusDevice != null) 
    point = e.StylusDevice.GetPosition(sender as Image); 

或者作爲替代,你可以添加一個處理程序的控制觸下事件您需要的位置:

<Image TouchDown="UIElement_OnTouchDown"/> 

private void UIElement_OnTouchDown(object sender, TouchEventArgs e) 
{ 
     var touchPoint = e.GetTouchPoint(sender as Image); 
     // more processing using touchPoint.Position 
} 
+0

是的,處理TouchDown事件適用於我。但它在我看來更像是框架本身的一個明顯錯誤,因爲與鼠標點擊很好地協作的遺留代碼預計可以在觸摸時很好地工作。 – kennyzx

+0

@kennyzx我可以通過一個示例新項目來重現此問題,所以是的,它看起來像是一個問題,或者只是添加了觸摸支持的方式。 –

+0

我接受你的答案關閉線程:) – kennyzx

0

如果您在.NET 4.5.0中運行,則不會看到此問題。它在4.5.1被引入。我試圖看看我是否可以讓MS有人注意並解決這個問題,因爲沒有你和我篡改我們的代碼。

+0

我將在4.5 – kennyzx

+0

中檢查出來。不幸的是,這並沒有什麼區別,我試過重新定位4.5和4.5.1,沒有運氣。 – kennyzx

+0

我很抱歉。我花了太多時間搞這個,弄得很困惑。增加接地的修復對於4.5.0是必需的和足夠的。同時,在4.5.1及更高版本中,我也必須添加明確的觸筆處理。 – osoblanco