Почему e.Handled = true не работает? - PullRequest
10 голосов
/ 09 июня 2011

У меня есть следующий XAML

 <StackPanel MouseEnter="StackPanel_MouseEnter" Height="130" Background="Blue">
    <Grid MouseEnter="Grid_MouseEnter" Height="60" Background="Red" >
       <Button MouseEnter="Button_MouseEnter" Height="20"/>
    </Grid>
 </StackPanel>

В коде я делаю это

private void StackPanel_MouseEnter(object sender, MouseEventArgs e)
{

}

private void Grid_MouseEnter(object sender, MouseEventArgs e)
{
    e.Handled = true;
}

private void Button_MouseEnter(object sender, MouseEventArgs e)
{   
    e.Handled = true;
}

Теперь, даже если я наведу курсор мыши на Button и установлю e.Handled = true, событияGrid и StackPanel называются соответственно.Зачем?Что я должен сделать, чтобы остановить всплывающее событие?

1 Ответ

11 голосов
/ 09 июня 2011

Событие MouseEnter не является пузырьковым событием, это прямое событие (как классические события CLR).Из документации :

Вы можете определить несколько событий MouseEnter для объектов в содержимом XAML.Однако, если дочерний объект и его родительский объект оба определяют событие MouseEnter, событие MouseEnter родительского объекта происходит до события MouseEnter дочернего объекта.Это не случай пузырящегося события;это указывает только на то, что мышь (или стилус) вошла в оба объекта, возможно, в разное время, в зависимости от макета и композиции визуального дерева.

Таким образом, вы не можете предотвратить его запускна родителей.Вы можете использовать свойство IsMouseDirectlyOver , чтобы увидеть, находится ли мышь фактически только над данным элементом.

...