我在使用C#WPF routedevent时遇到问题。这段代码可以正常工作:
MyLabel myLabel = new MyLabel();//MyOwn component
myLabel.Oma += new RoutedEventHandler(myLabel_Click);
GameArea.Children.Add(mylabel);//GameArea is UniformGrid
但是,当我将MyLabel放入ToggleButton的内容中时,routedeventhandler(myLabel_Click)无法捕获Oma事件(我对此进行了调试):
MyLabel myLabel = new MyLabel();//MyOwn component
myLabel.Oma += new RoutedEventHandler(myLabel_Click);
System.Windows.Controls.Primitives.ToggleButton box = new System.Windows.Controls.Primitives.ToggleButton();
box.Content = myLabel;
GameArea.Children.Add(box);//GameArea is UniformGrid
那为什么ToggleButton阻止我的routedevent?
编辑:
当我将myLabel放入ToggleButton的内容中时,代码可以正常工作,但会带来麻烦。
MyLabel中的OmaEvent看起来像这样:
public static readonly RoutedEvent OmaEvent =
EventManager.RegisterRoutedEvent("Oma", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(MyLabel));
public event RoutedEventHandler Oma
{
add { AddHandler(OmaEvent, value); }
remove { RemoveHandler(OmaEvent, value); }
}
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
CaptureMouse();
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
if (IsMouseCaptured)
{
ReleaseMouseCapture();
if (IsMouseOver)
RaiseEvent(new RoutedEventArgs(OmaEvent, this));
}
}
如果我将其放在ToggleButton中,则OmaEvent永远不会提高。如果我不将其放在ToggleButton中,它将起作用。
最佳答案
不会引发Oma
事件,因为父级ToggleButton
在其ButtonBase.OnMouseLeftButtonDown
方法中窃取了鼠标捕获,该捕获在您的OnMouseDown
方法之后被调用。只要ToggleButton
具有鼠标捕获功能,其他任何元素都不会接收鼠标事件,因此您的标签将不会接收MouseUp
事件,并且不会调用OnMouseUp
方法。
在e.Handled = true;
方法中设置OnMouseDown
,以防止事件冒泡到ToggleButton
。这将防止它失去焦点,但是当单击其中的MyLabel
时,也会阻止按钮正常工作。目前尚不清楚在这种情况下您想要什么行为。
关于c# - WPF RoutedEventHandler不适用于内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27389469/