我有一个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)”,那么我有上面的问题。
我的代码添加控件是否正确?
感谢。
答案 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
}
}