PresentationCore.dll中发生'System.StackOverflowException'

ser*_*hio 5 .net wpf events wpf-controls

我有一个WPF UserControl,我尝试在其中实现自定义 MouseClick(因为WPF(用户)控件上没有MouseClick事件)事件.

我得到以下内容:

替代文字

一些代码:

/// <summary>
/// Occurs when users left clicks the MyControl.
/// </summary>
public event MouseButtonEventHandler MouseClick { add { AddHandler(MouseClickEvent, value); } remove { RemoveHandler(MouseClickEvent, value); } }

    protected virtual void OnMouseClick(MouseButtonEventArgs e)
    {
        base.RaiseEvent(e);
        //this.RaiseEvent(new RoutedEventArgs(MouseClickEvent, this));
    }

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonUp(e);
        if (!this.movedAfterMouseDown)
        {
            OnMouseClick(e);
        }
        this.gotLeftButtonDown = false;
        this.movedAfterMouseDown = false;
    }
Run Code Online (Sandbox Code Playgroud)

那么,问题出在哪里?

更新1

protected virtual void OnMouseClick(MouseButtonEventArgs e)
{
    //base.RaiseEvent(e);
    MouseButtonEventArgs args = new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton);
    this.RaiseEvent(args);
}
Run Code Online (Sandbox Code Playgroud)

值不能为空.参数名称:routedEvent

替代文字

更新2

我成功实施的其他自定义事件(没有问题的工作) - SelectedChanged:

static void OnIsSelectedChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    var s = (MyControl)source;

    s.RaiseEvent(new RoutedEventArgs(SelectedChangedEvent, s));
}
Run Code Online (Sandbox Code Playgroud)

更新3

System.Windows.Controls.Control的OnPreviewMouseDoubleClick实现:

protected virtual void OnPreviewMouseDoubleClick(MouseButtonEventArgs e)
{
    base.RaiseEvent(e);
}
Run Code Online (Sandbox Code Playgroud)

更新5(对于坦克中的人)

class Foo : FrameworkElement
{
    event EasterCameEvent; // I named it MouseClick

    public DoSomething()
    {
        EasterCameArgs args= ...

        if (Date.Now = EasterDate)
            OnEasterCame(args)
    }

    protected virtual void OnEasterCame(EasterCameArgs e)
    {
        base.RaiseEvent(e);
    }
}
Run Code Online (Sandbox Code Playgroud)