Возможно ли при каких-либо обстоятельствах вызвать всплывающее событие MouseEnter?
MSDN сообщает, что это прикрепленное событие со стратегией прямой маршрутизации, что технически исключает такую возможность.У меня довольно сложный элемент управления (по сути, иерархия, состоящая из сеток, стековых панелей и элементов управления содержимым).Мне кажется, что событие MouseEnter распространяется снизу вверх, вот отладочный дамп, взятый из обработчика OnMouseEnter (у меня есть один и тот же пользовательский элемент управления, включенный на разных уровнях иерархии, который обрабатывает MouseEnter, поэтому у меня есть центральное место для прослушивания этого события):
In: родительский: s7b, метка времени: 37989609
In: родительский: s2, метка времени: 37989609
In: родительский: Root, метка времени: 37989609
s7b, s2 и Root - это имена FrameworkElement, а отметка времени - это e.Timestamp из события MosueEnter.
При условии, что стратегия маршрутизации является прямой, как WPF принимает решение об источнике событий?Проходит ли оно визуальное дерево до тех пор, пока не будет найден первый FrameworkElement с прикрепленным событием MouseEnter?
Пока я работаю над минималистичным набором репродукций для этой проблемы, кто-нибудь может подсказать, что может вызвать поведение?
А вот репродукция:
- Создайте два пользовательских элемента управления, один - постоянный, другой - получатель событий.
1.1.MyContentControl
Код:
public class MyContentControl : ContentControl
{
static MyContentControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyContentControl),
new FrameworkPropertyMetadata(typeof(MyContentControl)));
}
protected override void OnMouseEnter(MouseEventArgs e)
{
if (e.Source == e.OriginalSource
&& e.Source is MyContentControl)
{
Debug.Write(string.Format("mouseenter:{0}, timestamp:{1}\n",
(e.Source as MyContentControl).Name,
e.Timestamp));
}
base.OnMouseEnter(e);
}
}
XAML:
<Style TargetType="{x:Type local:MyContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyContentControl}">
<StackPanel Orientation="Horizontal">
<local:MouseEventReceiver />
<ContentPresenter />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
1.2 MouseEventReceiver
Код:
public class MouseEventReceiver : Control
{
static MouseEventReceiver()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MouseEventReceiver),
new FrameworkPropertyMetadata(typeof(MouseEventReceiver)));
}
}
XAML:
<Style TargetType="{x:Type local:MouseEventReceiver}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid Background="LightGray" Width="20" Height="20" Margin="5"></Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
- Наконец разметка моего тестового жгута:
XAML:
<Window x:Class="MouseTricks.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MouseTricks"
Title="MainWindow" Height="350" Width="525">
<Grid>
<local:MyContentControl x:Name="c1">
<local:MyContentControl x:Name="c2">
<local:MyContentControl x:Name="c3" />
</local:MyContentControl>
</local:MyContentControl>
</Grid>
</Window>
Чтобы воспроизвести проблему простонаведите курсор мыши на самый правый серый квадрат и посмотрите в окно «Вывод отладки», там вы увидите три записи, а я ожидаю только одну.
Приветствия.