WPF RoutedEventHandler не работает с контентом
У меня проблема с C# WPF routedevent. Этот код работает нормально:
MyLabel myLabel = new MyLabel();//MyOwn component
myLabel.Oma += new RoutedEventHandler(myLabel_Click);
GameArea.Children.Add(mylabel);//GameArea is UniformGrid
Но когда я помещаю myLabel в содержимое ToggleButton, routedeventhandler(myLabel_Click) не перехватывает событие Oma (я это отлаживал):
MyLabel myLabel = new MyLabel();//MyOwn component
myLabel.Oma += new RoutedEventHandler(myLabel_Click);
System.Windows.Controls.Primitives.ToggleButton box = new System.Windows.Controls.Primitives.ToggleButton();
box.Content = myLabel;
GameArea.Children.Add(box);//GameArea is UniformGrid
Так почему же ToggleButton блокирует мой маршрут?
РЕДАКТИРОВАТЬ: Код работает нормально, но это создает проблемы, когда я помещаю myLabel в содержимое ToggleButton.
OmaEvent в MyLabel выглядит так:
public static readonly RoutedEvent OmaEvent =
EventManager.RegisterRoutedEvent("Oma", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(MyLabel));
public event RoutedEventHandler Oma
{
add { AddHandler(OmaEvent, value); }
remove { RemoveHandler(OmaEvent, value); }
}
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
CaptureMouse();
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
if (IsMouseCaptured)
{
ReleaseMouseCapture();
if (IsMouseOver)
RaiseEvent(new RoutedEventArgs(OmaEvent, this));
}
}
OmaEvent никогда не поднимать, если я положу его в ToggleButton. Если я не помещу это в ToggleButton, это работает.
2 ответа
Oma
событие не вызывается, потому что родитель ToggleButton
крадет захват мыши в его ButtonBase.OnMouseLeftButtonDown
метод, который вызывается после вашего OnMouseDown
метод. Никакой другой элемент не будет получать события мыши, пока ToggleButton
имеет захват мыши, поэтому ваш ярлык не получит MouseUp
событие, и ваш OnMouseUp
метод не будет вызван.
Задавать e.Handled = true;
в вашем OnMouseDown
метод, чтобы предотвратить пузыри событие до ToggleButton
, Это предотвратит кражу фокуса, хотя и не даст кнопке нормально работать, когда MyLabel
внутри нажимается. Непонятно, какое поведение вы хотите в этом сценарии.
Это звучит как ваша RoutingStrategy для вашего обычая Oma
событие может не соответствовать тому, что вы пытаетесь сделать.
Если Oma
событие RoutedEvent установлено в Direct
и MyLabel
класс имеет тип UIElement
тогда вы должны быть в состоянии сделать что-то вроде следующего:
GameArea.Children.Add(box);//GameArea is UniformGrid
GameArea.AddHandler(Oma, new RoutedEventHandler(myLabel_Click));