WPF,某些事件无法从Grid To UserControl启动

时间:2012-02-01 12:14:38

标签: c# wpf user-controls routed-events

我有一个UserControl,我覆盖了这样的事件:

public class MyControl: UserControl
{
    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonUp(e);
        // handle mouse event up
    }
}

我将此控件添加到另一个UserControl - >网格,此网格已注册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,为什么?

如何在MyControl类中接收MouseUp事件?

修改 使用MouseDown所有工作都按预期工作,只有MouseUp不起作用......并且这两个事件也为父Grid注册,那么有什么区别?

EDIT2

好吧,我想我发现了问题,如果我将MyControl添加到MyParent - &gt;网格直接在XAML中,一切正常,但如果我以编程方式添加它“MyParentInstance.Grid.Children.Add(MyControlInstance)”,那么我有上面的问题。

我的代码添加控件是否正确?

感谢。

2 个答案:

答案 0 :(得分:0)

RoutedEvent仅适用于调用特定事件的元素的父元素。这对您来说意味着您的网格的所有父控件都将收到该事件,但孩子不会。有关路由事件的详细信息,请参阅Routed Events Overview。为解决您的问题,我建议在MyControl上注册MouseUp事件:

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

答案 1 :(得分:0)

在广泛搜索论坛之后,我没有遇到这个问题的答案,所以我在这里提供我的解决方案,尽管这篇文章已经过时了。我使用了已经在子控件中构建的事件处理程序,将它们公之于众。当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
    }
}