Как обнаружить два одновременных касания?

Обнаружение касания в Windows Phone 8 использует событие System.Windows.Input.Touch.FrameReported, которое является наиболее необработанным и, безусловно, наиболее отзывчивым событием касания, доступным для разработчиков.

Вы бы использовали это событие так:

public MainPage()
{
    InitializeComponent();

    // setup sounds
    Ellipse1.Tag = new Uri("Sounds/GVD_snr1.wav", UriKind.Relative);
    Ellipse2.Tag = new Uri("Sounds/GVD_snr2.wav", UriKind.Relative);
    Ellipse3.Tag = new Uri("Sounds/GVD_snr3.wav", UriKind.Relative);
    Ellipse4.Tag = new Uri("Sounds/GVD_snr4.wav", UriKind.Relative);
    Ellipse5.Tag = new Uri("Sounds/GVD_snr5.wav", UriKind.Relative);
    Ellipse6.Tag = new Uri("Sounds/GVD_snr6.wav", UriKind.Relative);
    Ellipse7.Tag = new Uri("Sounds/Gong.wav", UriKind.Relative);

    // respond to touch(es)
    var _Ellipses = new[] { Ellipse1, Ellipse2, Ellipse3, Ellipse4, Ellipse5, Ellipse6, Ellipse7 };
    System.Windows.Input.Touch.FrameReported += (s, e) =>
    {
        var _Touches =
            from touch in e.GetTouchPoints(null)
            where touch.Action == System.Windows.Input.TouchAction.Down
            let ellipse = touch.TouchDevice.DirectlyOver as Ellipse
            where _Ellipses.Contains(ellipse)
            select ellipse;
        System.Diagnostics.Debug.WriteLine("{0} touch(es).", _Touches.Count());
        foreach (var ellipse in _Touches)
        {
            var _Stream = Application.GetResourceStream(ellipse.Tag as Uri).Stream;
            var _SoundEffect = Microsoft.Xna.Framework.Audio.SoundEffect.FromStream(_Stream);
            Microsoft.Xna.Framework.FrameworkDispatcher.Update();
            _SoundEffect.Play();
        }
    };
}

(протестировано с Lumia 920)

Это работает как шарм - до тех пор, пока есть только одно касание за раз. Когда пользователь пытается коснуться двух или более точек одновременно (и я имею в виду одно и то же время), событие вообще не возникает. Когда пользователь пытается коснуться двух или более точек почти одновременно (с интервалом в доли секунды), событие возникает, и обе точки сообщаются.

Как я могу обнаружить два одновременных касания?

Если вы хотите увидеть XAML, здесьS XAML:



    
        
            
            
        
    

    
    
    
    
    
    
    


 kanchirk31 мая 2013 г., 19:32
Спасибо за разъяснения.
 kanchirk30 мая 2013 г., 20:21
@ Джерри .. Ты пробовал это? Имейте галочку lastTappedTime в переменной экземпляра. Обработайте событие Tap во всех эллипсах и проверьте разницу между lastTappedTime и текущим временем. Если разница составляет менее 200 миллисекунд, мы можем смело считать ее Simul-Touch, иначе установите новый lastTappedTime.
 Jerry Nixon - MSFT31 мая 2013 г., 17:13
Чтобы быть более ясным, проблема не обнаруживает, если они являются одновременными, это то, что два одновременных касания не вызывают событие FrameReported.

Ответы на вопрос(1)

Решение Вопроса

Добавление этого решило проблему:

var _Timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(50) };
_Timer.Tick += (s, e) =>
{
    try { Microsoft.Xna.Framework.FrameworkDispatcher.Update(); }
    catch { }
};
_Timer.Start();

Ваш ответ на вопрос