Определение, является ли объект видимым и активным - PullRequest
6 голосов
/ 13 марта 2011

Я ищу способы эффективно определить, является ли элемент управления видимым и активным. Я имею в виду не только проверку свойства видимости объекта.

Я могу проверить RenderSize, и это будет [0,0], если какой-либо из родительских элементов будет свернут. Так что это тоже просто. Я также могу пройти по визуальному дереву и посмотреть, установлено ли значение Непрозрачность всех элементов на 1.

То, что я не знаю, как хорошо проверить, это следующие сценарии:

  1. Объект заблокирован каким-либо другим объектом . Очевидно, что можно использовать FindElementsInHostCoordinates () и выполнять вычисления, чтобы выяснить, насколько сильно эти объекты мешают, но это может быть излишним. Я также могу сделать «снимок экрана» рассматриваемого объекта и «снимок экрана» всей страницы и проверить, соответствуют ли пиксели, в которых должен находиться мой объект, фактическим пикселям объекта. Это звучит как излишнее убийство.
  2. Объект закрыт прозрачным объектом, который все еще «глотает» щелчки (удары) . Обходные пути для первой проблемы все еще могут потерпеть неудачу в этом сценарии.

Обновление (еще один сценарий)

  1. Объект находится за пределами родительского объекта / экрана . Есть ли другой способ выяснить это, кроме множества расчетов?

Есть идеи получше? Я что-то пропустил?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 13 марта 2011

Вы можете программно протестировать Visiblity и свойство HitTestVisible элемента, однако за пределами этого вы не сможете на самом деле протестировать , если событие щелчка будет перенаправлено на элемент или проглочено элементами сверху об этом - потому что блокировка или переадресация кликов могут происходить в методах обработчика событий, которые вы просто не можете определить общим способом.

Возьмите следующий пример:

  • Вы хотите проверить, активна ли панель ParentElement, на которой есть ChildElement
  • ChildElement имеет обработчик события, который обрабатывает событие click, он видим, и его свойство HitTestVisible установлено в true.
  • Исходя из этого, вы еще не можете решить, будет ли событие перенаправлено на ParentElement: в обработчике события click для ChildElement он может установить для свойства Handled события значение true, что остановит ParentPanel, получающий событие или оно может оставить значение false, чтобы ParentPanel получил событие.

Таким образом, если задействованы пользовательские EventHandlers, вы не сможете точно сказать, является ли элемент кликабельным или нет. Максимум, что вы можете сделать, это проверить свойства Visiblity и IsHitTestVisible дочерних и родительских элементов и проверить, где дети / родители отображаются друг относительно друга, используя метод TransformToVisual.

0 голосов
/ 13 марта 2011

Вы ищете VisualTreeHelper.FindElementsInHostCoordinates.Первым возвращаемым элементом будет элемент, который получит щелчок мыши / нажатие на этот пиксель.Конечно, как сказал Гергели, вы не можете сказать, будет ли этот элемент игнорировать щелчок и передавать его вам.

Вот пример функции:

// pass in a point and the UIElement that the point is relative to
// (or null if the point is relative to the root visual)
public static UIElement HitTest(Point p, UIElement relativeTo = null)
{
    if (relativeTo != null)
        p = relativeTo.TransformToVisual(Application.Current.RootVisual)
    return VisualTreeHelper
          .FindElementsInHostCoordinates(p, Application.Current.RootVisual)
          .FirstOrDefault();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...