Выкидывая штрихи в WPF
Я пытаюсь исключить 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 ответа
Я наткнулся на ту же проблему и реализовал прикрепленное поведение для ScatterViewItems. Это поведение отключает автоматическое поведение IsTopmostOnActivation и прослушивает события PreviewTouchDown, чтобы решить, должен ли элемент быть выведен на вершину на основе условия теста. Он имеет простой в использовании метод активации
CustomTopmostBehavior.Activate();
который добавляет стиль приложения, включающий поведение для всех ScatterViewItems.
Поведение можно настроить, установив его свойство TestCondition, которое по умолчанию:
CustomTopmostBehavior.TestCondition = (t) =>
{
return t.GetIsFingerRecognized();
};
Хорошо, вот мой грязный обходной путь, чтобы остановить продвижение 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 и выбросить не-пальцы.
Должен быть лучший способ войти в сенсорную иерархию, верно?
Хорошо, я углубился в иерархию касаний. Прежде всего TouchEnter происходит до того, как произойдут все TouchDown, но для этого не существует события туннелирования. TouchFrameHandler происходит после того, как все события сделаны, поэтому выбросьте это.
Затем я понял, что "Освобождение снимков" на элементах UIElements не имеет значения для моей проблемы, потому что касание уже захвачено. Поэтому мне нужно исключить TouchDevice в TouchEnter для каждого элемента. В TouchDevice есть метод Deactivate, но он защищен. Если я смогу выяснить, как отключить TouchDevice, я думаю, что это должно сработать. Это звучит разумно? Если это так, я должен выяснить, как переопределить защищенный метод.