2014-02-17 2 views
4

터치 지원이 .NET (v 4.0)에 추가되기 전에 WPF 프로젝트가 작성되어 마우스 이벤트 만 처리되었습니다. 손가락으로 터치 스크린에서 프로젝트를 테스트 할 때이 문제가 발생합니다.MouseDown 이벤트에서 WPF가 터치 위치를 가져올 수 없습니다.

첫 번째 터치에서 위치 (X, Y)가 올바르게 검색되지만 터치 한 위치와 상관없이 (X, Y) 값은 이후 터치에서 동일하게 유지됩니다. 이미지의 MouseDown 이벤트가 발생하면 더 이상해집니다.

Win7/Win8에서 테스트 한 .NET 3.0/3.5/4.0으로 재생할 수 있으며 둘 다 64 비트입니다. 그리고 그것이 오작동하는 MouseDown 이벤트 인 것 같습니다. MouseUp은 정상적으로 작동합니다.

업데이트 :이 긴 역사를 가진 버그이며 같은 증상이 발생할 경우 코드를 업데이트 할 수 있도록 MS는 아직 (도 4.5)를 고정하지 않은

- 터치를 얻을 수 마우스 이벤트가 아닌 터치 이벤트의 위치. 다행히도이 버그는 미묘하지는 않기 때문에 위치를 확인하고 수정하는 데 약간의 시간이 걸립니다.

코드 문제를 재현하는 방법 :

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> 

코드 뒤에 : WPF에서 기본적으로

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

, 터치 이벤트는 컨트롤이 처리되지 않는 경우 Mouse 이벤트로 승격됩니다. 터치 이벤트는 라우트 된 이벤트이므로 Mouse 이벤트가 트리거되면 시각적 트리를 위아래로 이동합니다 (이미지 외부를 터치하더라도 이벤트 핸들러가 실행 됨).

MouseDown 이벤트가 승진 터치 이벤트에서 오는 경우, 당신은 아마 StylusDevice 사용하여 정확한 위치를 얻을 수 :

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

또는 대안으로

, 당신은 컨트롤의 터치 다운 이벤트에 대한 처리기를 추가 할 수 있습니다를 위치가 필요한 위치 :

+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

관련 문제