Я прихожу в UWP из многих лет, пишущих пользовательские интерфейсы WPF.
С помощью элемента управления WPF можно обеспечить настраиваемую логику тестирования попаданий путем переопределения метода HitTestCore элемента управления следующим образом:
protected override HitTestResult HitTestCore(PointHitTestParameters params)
{
//Do some kind of test on params.HitPoint
if (HitPointIsOverTheControl(params.HitPoint))
return new PointHitTestResult(this, params.HitPoint);
else
return null;
}
Я успешно использовал этот подход, чтобы позволить мне проверить, находится ли мышь над любым изображением PNG неправильной формы (в элементе управления изображением), проверив пиксель изображения, который находится непосредственно под текущей точкой мыши, чтобы увидеть, имеет ли он альфазначение байта канала равно 0, и, если это так, возвращает нулевое значение в вышеуказанной функции.
Другими словами, этот подход позволяет мне выбирать маску альфа-канала PNG для того, что может быть ниже ее в видимом стеке элементов управления.И это работает на удивление хорошо.
Теперь для UWP ...
Я не могу найти подход, аналогичный описанному выше, в рамках UWP, поэтому я подозреваю, что «переопределение теста удара» недоступно в UWP.
Может кто-нибудь сказать мне, если этот подход все еще возможен в UWP, и если нет, есть ли альтернативный подход, который я могу использовать для достижения того же результата?
Спасибо
Изменить: Пример
Давайте предположим, что есть 2 элемента управления изображениями друг на друге, самый верхний элемент управления это изображение желтого круга с отверстием в середине, а нижнее изображение представляет собой сплошной синий квадрат, который полностьюпокрыта верхним элементом управления, но частично видна через отверстие в круге.
Теперь я хочу иметь возможность а) перемещать круг, нажимая на его желтую часть, или б) перемещать синий квадрат снизунажав на него через отверстие в круге.
ОК.Когда я перемещаю мышь над желтым кружком, она запускает события PointerMoved, и тогда я могу решить, находится ли мышь над частью маски изображения PNG.Пока все хорошо.
Теперь предположим, что мышь находится над отверстием в середине круга, я действительно хочу начать получать все события Pointer и Manipulation из квадрата, а не из круга.Единственный способ сделать это - установить свойство «IsHitTestVisible = false» для круга, когда указатель мыши находится над частью «отверстия» изображения, и установить значение «IsHitTestVisible = true» для круга, если указатель мыши находится над«желтая» часть изображения.
Проблема с этим подходом состоит в том, что как только я установлю «IsHitTestVisible = false» на круг, он больше не будет вызывать дальнейшие события PointerMoved.
Другими словами, уже слишком поздно начинать изменять свойства IsHitTestVisible в событиях PointerMoved, поэтому возможность переопределить HitTestCore в WPF была настолько полезной, поскольку это происходило до возникновения событий Pointer.
Так что теперь я знаючто переопределение HitTestCore недоступно в UWP (что является настоящим позором, если честно), есть ли другой способ добиться того, что я описываю?Например, можно ли перенаправить события указателя и события касания на второй элемент управления, когда они вызываются первым элементом управления, и при этом события также игнорируются первым элементом управления?
Любые идеи приветствуются