Silverlight: как предотвратить маршрутизацию события MouseMove с дочернего холста на родительский холст - PullRequest
2 голосов
/ 16 января 2012

У меня есть код 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 (родительский холст)?

Спасибо.

Peter

Ответы [ 3 ]

0 голосов
/ 16 января 2012

Вы можете попробовать сравнить e.OriginalSource в событии MouseMove mainCanvas и выйти из Sub, если он не был создан из mainCanvas.

private void mainCanvas_MouseMove(object sender, MouseEventArgs e)
{
    if (sender != e.OriginalSource)
        return;        
}

В ответ на ваш комментарий чуть более подробно. По ссылке UIElement.MouseMove Событие MSDN.

Элементы управления, которые наследуют MouseMove, могут обеспечить обработку события который действует как обработчик для всех экземпляров, переопределяя OnMouseMove метод. Как и в случае прямой обработки события, здесь не обрабатывается свойство доступно, поэтому OnMouseMove не может быть реализован таким образом что он подавляет дальнейшую обработку события через Обработано Техника. * * +1010

и эта ссылка заявляет:

Это событие создает псевдоним для вложенного события Mouse.MouseMove для этот класс

Что приводит нас к этой ссылке на AttachedEvents с указанием.

Расширяемый язык разметки приложений (XAML) определяет язык Компонент и тип события называется вложенным событием. Концепция чего-либо прикрепленное событие позволяет добавить обработчик для определенного события к произвольному элементу, а не к элементу, который на самом деле определяет или наследует событие. В этом случае ни один объект потенциально вызывает событие или экземпляр обработки пункта назначения определяет или иным образом «владеет» событием.

Так что, как я вижу, ваш единственный вариант - код вокруг него.

0 голосов
/ 16 января 2012

Попробуйте установить свойство IsHitTestVisible вашего Canvas. Если это свойство установлено соответствующим образом, события мыши будут либо проходить через ваш элемент управления, либо перехватываться им.

Надеюсь, это то, что вам нужно.

0 голосов
/ 16 января 2012

Функциональность называется «Event Bubbling».Вы можете остановить это, используя следующий код:

jQuery: event.stopPropagation ();Ссылка: http://api.jquery.com/event.stopPropagation/

Вы также можете попробовать код ниже: e.stopPropagation ();// чтобы предотвратить всплывание события e.preventDefault ();// затем отменим событие (если его можно отменить)

Ref: http://stackoverflow.com/questions/1967537/how-to-stop-event-bubbling-with-jquery-live

Спасибо, Рави Верма

...