gpt4 book ai didi

c# - WPF RoutedEventHandler 不适用于内容

转载 作者:太空宇宙 更新时间:2023-11-03 15:47:44 27 4
gpt4 key购买 nike

我对 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));
}

}

如果我将 OmaEvent 放在 ToggleButton 中,它永远不会触发。如果我不把它放在 ToggleButton 里面,它就可以工作。

最佳答案

Oma 事件没有被引发,因为父 ToggleButton 在其 ButtonBase.OnMouseLeftButtonDown 方法中窃取了鼠标捕获,该方法被调用 < em>在 OnMouseDown 方法之后。只要 ToggleButton 具有鼠标捕获功能,其他元素就不会收到鼠标事件,因此您的标签不会收到 MouseUp 事件,而您的 OnMouseUp方法不会被调用。

OnMouseDown 方法中设置 e.Handled = true; 以防止事件冒泡到 ToggleButton。这将防止它窃取焦点,但它也会阻止按钮在单击 MyLabel 时正常工作。不清楚您希望在这种情况下采取什么行为。

关于c# - WPF RoutedEventHandler 不适用于内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389469/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com