WPF, некоторые события не запускаются из Grid To UserControl
У меня есть UserControl, где я переопределяю некоторые события, как это:
public class MyControl: UserControl
{
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonUp(e);
// handle mouse event up
}
}
Я добавляю этот элемент управления в другой UserControl -> Grid, для этой Grid зарегистрирован MouseUp.
public class MyParent: UserControl
{
private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
{
// handle grid mouse event
}
}
И в MyParent XAML у меня просто:
<UserControl ... >
<Grid Name="Grid" MouseUp="Grid_MouseUp">
<my:MyControl Height="250" Width="310" Visibility="Visible" Opacity="1" IsEnabled="True" />
</Grid>
</UserControl>
Что я заметил, так это то, что когда я отпускаю указатель мыши над MyControl, событие захватывается сеткой, а не направляется в MyControl, почему?
Как я могу получить событие MouseUp внутри класса MyControl?
РЕДАКТИРОВАТЬ С MouseDown все работает как положено, только MouseUp не работает... и оба события также зарегистрированы для родительского Grid, так в чем же разница?
EDIT2
Хорошо, я думаю, что нашел проблему, если я добавляю MyControl в MyParent -> Grid прямо в XAML, все работает хорошо, но если я добавляю это программно "MyParentInstance.Grid.Children.Add(MyControlInstance)", то у меня есть проблема выше,
Мой код для добавления контроля правильный?
Благодарю.
2 ответа
RoutedEvent
Работает только для родителей элемента, который вызывает конкретное событие. Для вас это означает, что все родительские элементы управления вашей сеткой будут получать событие, а дети - нет. Для получения дополнительной информации о маршрутизируемых событиях см. Обзор маршрутизируемых событий. Для решения вашей проблемы я бы предложил зарегистрировать MouseUp
Событие в MyControl:
<UserControl ... >
<Grid Name="Grid">
<my:MyControl MouseUp="Grid_MouseUp" Height="250" Width="310" Visibility="Visible" Opacity="1" IsEnabled="True" />
</Grid>
</UserControl>
Я не нашел ответа на этот вопрос после обширного поиска по форумам, поэтому я предоставляю свое решение здесь, хотя этот пост датирован. Я использовал обработчики событий, которые я уже встроил в дочерний элемент управления, сделав их общедоступными. Когда пользовательский элемент управления ChildControl добавляется в Window на верхнем уровне, они запускаются. Когда вложено в parent, событие должно было быть обработано на родительском уровне.
При программном добавлении элемента управления добавьте обработчик событий в родительский элемент управления, например:
class Parent : UIElement
{
//...
void Parent_AddChildControl()
{
ChildControl child = new ChildControl();
child.MouseEnter += child_MouseEnter;
UiElementX.Children.Add(child);
}
void child_MouseEnter( object sender , MouseEventArgs e )
{
((ChildControl)sender).ChildControl_MouseEnter(sender, e);
}
}
class ChildControl : UIElement
{
//...
public void ChildControl_MouseEnter(object sender, MouseEventArgs e)
{
//event handling
}
}