WPF, некоторые события не запускаются из Grid To UserControl - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть 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, событие захватывается Grid и не направляется в MyControl, почему?

Как я могу получить событие MouseUp внутри класса MyControl?

EDIT С MouseDown все работает как положено, только MouseUp не работает ... и оба события также зарегистрированы для родительского Grid, так в чем же разница?

EDIT2

Хорошо, я думаю, что нашел проблему, если я добавляю MyControl в MyParent -> Grid непосредственно в XAML, все работает хорошо, но если я добавляю это программно "MyParentInstance.Grid.Children.Add (MyControlInstance)", то у меня есть проблема выше.

Мой код для добавления элемента управления корректен?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 марта 2015

Я не нашел ответа на этот вопрос после обширного поиска по форумам, поэтому я предоставляю свое решение здесь, хотя этот пост датирован.Я использовал обработчики событий, которые я уже встроил в дочерний элемент управления, сделав их общедоступными.Когда пользовательский элемент управления ChildControl добавляется в Window на верхнем уровне, они запускаются.При вложении в родительский объект событие должно было обрабатываться на родительском уровне.

При программном добавлении элемента управления добавьте обработчик событий в родительский элемент управления, например:

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
    }
}
0 голосов
/ 01 февраля 2012

RoutedEvent s работает только для родителей элемента, который вызывает конкретное событие. Для вас это означает, что все родительские элементы управления вашей сеткой будут получать событие, а дети - нет. Для получения дополнительной информации о перенаправленных событиях см. Обзор перенаправленных событий . Чтобы решить вашу проблему, я бы предложил зарегистрировать событие MouseUp на MyControl:

<UserControl ... >
  <Grid Name="Grid">
    <my:MyControl MouseUp="Grid_MouseUp" Height="250" Width="310" Visibility="Visible" Opacity="1" IsEnabled="True" />
  </Grid>
</UserControl>
...