Silverlight: как предотвратить маршрутизацию события MouseMove с дочернего холста на родительский холст
У меня есть код XAML:
<Canvas x:Name="mainCanvas" Width="200" Height="150" Background="LightGray"
MouseLeftButtonUp="mainCanvas_MouseLeftButtonUp"
MouseMove="mainCanvas_MouseMove">
<Canvas x:Name="topCanvas" Width="200" Height="100" Background="LightBlue"
MouseLeftButtonUp="topCanvas_MouseLeftButtonUp"
MouseMove="topCanvas_MouseMove">
</Canvas>
</Canvas>
и его код позади:
private void topCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("topCanvas_MouseLeftButtonUp");
e.Handled = true; // This can prevent routing to the mainCanvas
}
private void mainCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("mainCanvas_MouseLeftButtonUp");
}
private void topCanvas_MouseMove(object sender, MouseEventArgs e)
{
Debug.WriteLine("topCanvas_MouseMove");
// How to prevent routing to the mainCanvas?
// e.Handled = true does NOT exist in MouseEventArgs
}
private void mainCanvas_MouseMove(object sender, MouseEventArgs e)
{
Debug.WriteLine("mainCanvas_MouseMove");
}
Мой вопрос уже в комментариях.
Как предотвратить перенаправление события MouseMove из topCanvas (дочерний холст) в mainCanvas (родительский холст)?
Благодарю.
Питер
3 ответа
Попробуйте установить свойство IsHitTestVisible вашего Canvas. Если это свойство установлено соответствующим образом, события мыши будут либо проходить через ваш элемент управления, либо перехватываться им.
Надеюсь, это то, что вам нужно.
Вы можете попробовать сравнить e.OriginalSource в событии MouseMove mainCanvas и выйти из Sub, если он не был создан из mainCanvas.
private void mainCanvas_MouseMove(object sender, MouseEventArgs e)
{
if (sender != e.OriginalSource)
return;
}
В ответ на ваш комментарий чуть подробнее. По ссылке MSDN Событие UIElement.MouseMove.
Элементы управления, которые наследуют MouseMove, могут обеспечить обработку события, которое действует как обработчик для всех экземпляров, путем переопределения метода OnMouseMove. Как и в случае прямой обработки события, свойство Handled недоступно, поэтому OnMouseMove не может быть реализован таким образом, чтобы он подавлял дальнейшую обработку события с помощью метода Handled.
и эта ссылка гласит:
Это событие создает псевдоним для присоединенного события Mouse.MouseMove для этого класса.
Что приводит нас к этой ссылке на AttachedEvents, в которой говорится.
Расширяемый язык разметки приложений (XAML) определяет языковой компонент и тип события, называемого присоединенным событием. Концепция присоединенного события позволяет вам добавить обработчик для определенного события в произвольный элемент, а не в элемент, который фактически определяет или наследует событие. В этом случае ни объект, потенциально вызывающий событие, ни экземпляр пункта назначения не определяют или иначе "владеют" событием.
Так что, как я понимаю, ваш единственный вариант - это код вокруг него.
Функциональность называется "Event Bubbling". Вы можете остановить это, используя следующий код:
jQuery: event.stopPropagation (); Ссылка: http://api.jquery.com/event.stopPropagation/
Вы также можете попробовать код ниже: e.stopPropagation(); // для предотвращения всплеска события e.preventDefault(); // затем отменяем событие (если оно отменяется)
Ref: http://stackru.com/questions/1967537/how-to-stop-event-bubbling-with-jquery-live
Спасибо, Рави Верма