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
    }
}
Другие вопросы по тегам