Как я могу заставить IsMouseOver не заботиться о других вещах, скрывающих элемент управления?

Я часто использую свойство IsMouseOver в своей программе WPF. К сожалению, у меня есть другие визуальные элементы из других ветвей визуального дерева, которые иногда закрывают мои элементы управления. Когда они закрывают мои элементы управления, IsMouseOver становится ложным для моих элементов управления, даже когда моя мышь находится над закрытым элементом управления.

Как мой элемент управления может иметь такое свойство, как IsMouseOver, которому все равно, скрыто ли оно в месте расположения курсора? Как тест на удар, который может туннелировать брошенные крышки.

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

Обратите внимание, что визуальные элементы, которые закрывают мои элементы управления, не являются дочерними элементами моих элементов управления.

Редактировать: Установка IsHitTestVisible в false для элемента, выполняющего покрытие, была бы очень хорошим решением, но когда я это делаю, элемент покрытия вообще не взаимодействует с мышью. Мне нужно, чтобы и закрытые, и закрывающие элементы реагировали на мышь.


person davidbludlow    schedule 08.08.2013    source источник
comment
Должны ли другие вещи, охватывающие элемент управления, заботиться о мыши?   -  person McAden    schedule 09.08.2013
comment
Если есть что-то, закрывающее элемент управления, мышь не может находиться над элементом управления, потому что она находится над другим элементом управления.   -  person sa_ddam213    schedule 09.08.2013
comment
@sa_ddam213 Метафора: мой мобильный телефон лежит на моем столе. Поэтому мой телефон лежит и над столом, и над полом.   -  person davidbludlow    schedule 09.08.2013
comment
Думайте о мыши как о своих глазах, вы не можете видеть стол через телефон и не можете видеть пол через стол. Похоже, вам нужно думать о чем-то еще, кроме событий IsMouseOver, только одно может быть сразу под мышью   -  person sa_ddam213    schedule 09.08.2013
comment
Вероятно, мне нужно использовать что-то другое, кроме событий IsMouseOver. Я хочу использовать что-то подобное, хотя. Многие из моих элементов управления должны менять свой внешний вид при наведении на них указателя мыши. К сожалению, такие вещи, как большие прозрачные оверлеи и декоративные элементы выделения с пунктирными линиями, иногда закрывают часть моих элементов управления. Когда мышь наводится на эти объекты, IsMouseOver становится ложным, а базовый элемент управления изменяется так, как будто мышь не наводит на него курсор. Это выглядит плохо и запутанно.   -  person davidbludlow    schedule 09.08.2013


Ответы (1)


Сделайте покрывающий элемент управления невидимым для проверки попаданий, установив IsHitTestVisible="False"

<Grid>
  <Control1/>

  <!-- Control2 will visually "cover" Control1, but mouse events will "pass thru" To Control1 -->
  <Control2 IsHitTestVisible="False"/>
</Grid>
person Federico Berasategui    schedule 09.08.2013
comment
Это отличное решение вопроса, который я изначально написал. К сожалению, это не работает для меня. Я отредактировал свой исходный вопрос, включив в него описание того, почему я не думаю, что это работает для меня. - person davidbludlow; 10.08.2013