выкидывая штрихи в WPF - PullRequest
       55

выкидывая штрихи в WPF

1 голос
/ 23 февраля 2012

Я пытаюсь исключить TouchDevices в WPF для Surface, чтобы я мог игнорировать прикосновения без пальцев, потому что кажется, что BLOB-объекты запускают события, которые мне не нужны.
Сначала у меня было что-то простое, как это

private void SurfaceWindow1_PreviewTouchDown(object sender, TouchEventArgs e)
    {
        if (!e.TouchDevice.GetIsFingerRecognized() && InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported == true)
        {
            e.Handled = true;
        }

    }

Что хорошо работает, чтобы не допустить сенсорного взаимодействия с такими вещами, как внутри ScatterViewItems и манипуляций. однако перед PreviewTouchDown должно произойти что-то еще, потому что я могу использовать BLOB-объект, чтобы активировать SVI и вывести его наверх, хотя никаких других манипуляций не происходит. Я предполагаю, что TouchEnter на SVI все еще появляется и продвигает его вперед, но обработка TouchEnter на всех элементах дает мне то же самое, так что все еще происходит что-то еще.

Я посмотрел в Touch.FrameReported, но не могу выпустить нужные TouchCaptures, пока SVI не услышат об этом

    private void myTouchFrameHandler(object sender, TouchFrameEventArgs e)
    {
        foreach (TouchPoint _tp in e.GetTouchPoints(this)) {
            if (!_tp.TouchDevice.GetIsFingerRecognized())
            {
                this.ReleaseAllTouchCaptures();    
            }
        }
    }

Есть идеи?
Спасибо

Ответы [ 3 ]

2 голосов
/ 18 марта 2012

Я наткнулся на ту же проблему и реализовал прикрепленное поведение для ScatterViewItems.Это поведение отключает автоматическое поведение IsTopmostOnActivation и прослушивает события PreviewTouchDown, чтобы решить, должен ли элемент быть выведен на вершину на основе условия теста.Он имеет простой в использовании метод активации

CustomTopmostBehavior.Activate();

, который добавляет стиль для всего приложения, включающий поведение для всех элементов ScatterViewI.по умолчанию:

CustomTopmostBehavior.TestCondition = (t) =>
{
    return t.GetIsFingerRecognized();
};
1 голос
/ 29 февраля 2012

Хорошо, вот мой грязный обходной путь, чтобы остановить продвижение Touches, когда они не распознаются как пальцы, и не дать SVI подняться наверх, когда завис над ними.

    this.PreviewTouchDown += new EventHandler<System.Windows.Input.TouchEventArgs>(SurfaceWindow1_PreviewTouchDown);    
    SVI.TouchEnter += new EventHandler<TouchEventArgs>(SVI_TouchEnter);
    SVI.TouchLeave +=new EventHandler<TouchEventArgs>(SVI_TouchLeave);

    void SurfaceWindow1_PreviewTouchDown(object sender, System.Windows.Input.TouchEventArgs e)
    {

        if (!e.TouchDevice.GetIsFingerRecognized() && Microsoft.Surface.Presentation.Input.InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported) { e.Handled = true; }
        else
        {
           //normal stuff
        }



    }
    private void SVI_TouchEnter(object sender, TouchEventArgs e)
    {
        ScatterViewItem svi = sender as ScatterViewItem;

        if (!e.TouchDevice.GetIsFingerRecognized() && Microsoft.Surface.Presentation.Input.InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported == true)
        {
            svi.IsTopmostOnActivation = false;
            e.Handled = true;
        }
        else
        {
            foreach(ScatterViewItem svi in mainScatterView.Items.SourceCollection){
                svi.IsTopmostOnActivation = false;
            }

            SVI.IsTopmostOnActivation = true;
        }

    }
    private void SVI_TouchLeave(object sender, TouchEventArgs e)
    {
            ScatterViewItem svi = sender as ScatterViewItem;
            svi.IsTopmostOnActivation = true;
    }

Я чувствую себя грубым, просто придумывая такой неумелый метод.Но поскольку нет TouchEnter для туннелирования, вам придется проверять все объекты визуального дерева, которые получают TouchEnter, что еще хуже.Плюс я просто не мог понять, как использовать защищенный метод TouchDevice.Deactivate () в любом случае.Но поскольку SVI в любом случае фиксируют touchDevice и переупорядочиваются, я нашел единственный способ сохранить их на месте - с помощью свойства TopmostOnActivation, затем перехватить PreviewTouchDown в Window и выбросить не-пальцы.

Должен быть лучший способ войти в сенсорную иерархию, верно?

0 голосов
/ 24 февраля 2012

ОК, так что я углубился в сенсорную иерархию.Прежде всего TouchEnter происходит до того, как произойдут все TouchDown, но для этого не существует события туннелирования.TouchFrameHandler происходит после того, как все события сделаны, поэтому выбросьте это.

Тогда я понял, что освобождение захватов на элементах UIElements на самом деле не имеет значения для моей проблемы, потому что Touch уже захвачен.Поэтому мне нужно исключить TouchDevice в TouchEnter для каждого элемента.В TouchDevice есть метод Deactivate, но он защищен.Если я смогу выяснить, как отключить TouchDevice, я думаю, что это должно сработать.Это звучит разумно?Если это так, я должен выяснить, как переопределить защищенный метод.

...