如何在WPF中为用户控件创建用户定义(新的)事件?给出一个小例子。

13 浏览
0 Comments

如何在WPF中为用户控件创建用户定义(新的)事件?给出一个小例子。

我有一个UserControl,其中我使用了一个Canvas,在该Canvas中有一个Rectangle。我想为该用户控件(Canvas和Rectangle)创建一个点击事件,然后在主窗口中使用它。

问题是:我想为UserControl创建一个新的点击事件。如何做到?请提供一个简单的示例或代码。

0
0 Comments

问题的出现原因:用户想要在WPF中的自定义用户控件中创建一个新的事件,以便主窗口可以注册并处理该事件。

解决方法:用户需要在用户控件中声明一个事件,并在用户控件的点击事件中引发该事件。然后,在主窗口中注册该事件,并处理相应的事件处理程序。另外,还需要确保在XAML中将用户控件的点击事件与实际的MouseDown事件绑定。

以下是解决方法的具体步骤:

在用户控件中:

1. 声明一个事件:

public event EventHandler UserControlClicked;

2. 在点击事件中引发该事件:

private void UserControl_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (UserControlClicked != null)
    {
        UserControlClicked(this, EventArgs.Empty);
    }
}

在主窗口中:

通过以下代码注册用户控件的事件并处理相应的事件处理程序:


需要注意的是,为了使注册的事件生效,还需要将用户控件的MouseDown事件与实际的MouseDown事件绑定。

另外,如果需要取消注册该事件,可以使用相应的方法进行取消。

另一种可能性是重写当前的OnMouseDown处理程序,并在其中调用base.OnMouseDown(e)。这样可以确保事件处理程序能够正常工作。

如果在实际操作中遇到了"UserControlClicked is not accessible or not recognized"的错误提示,可能是由于未正确声明或引用事件的原因。需要仔细检查代码并确保事件的访问权限正确。

0
0 Comments

在WPF中,创建用户定义的事件对于用户控件是非常有用的。下面的代码演示了如何创建用户定义的事件。

首先,我们可以通过创建类的属性来模拟事件,例如在自定义控件类中创建一个名为CustomClick的属性,代码如下:

public event RoutedEventHandler CustomClick
{
    add { lock (objectLock) { myClickableInnerControl.Click += value; } }
    remove { lock (objectLock) { myClickableInnerControl.Click -= value; } }
}

类似地,我们也可以创建CustomPreviewMouseDown属性来模拟PreviewMouseDown事件,代码如下:

public event MouseButtonEventHandler CustomPreviewMouseDown
{
    add { lock (objectLock) { myInnerControl.PreviewMouseDown += value; } }
    remove { lock (objectLock) { myInnerControl.PreviewMouseDown -= value; } }
}

其中myInnerControl是自定义控件中的Canvas。

然后,我们可以在XAML中初始化事件,例如:


或者


接下来,在代码后台我们可以订阅事件,例如:

ClickCtrl1.CustomClick += ClickCtrl1_CustomClick;

或者

CustomCtrl1.CustomPreviewMouseDown += CustomCtrl1_CustomPreviewMouseDown;

我们还可以订阅多个内部控件的事件,只需小心处理重叠的问题,代码如下:

public event MouseButtonEventHandler CustomPreviewMouseDown
{
    add
    {
        lock (objectLock)
        {
            myInnerControl1.PreviewMouseDown += value;
            myInnerControl2.PreviewMouseDown += value;
        }
    }
    remove
    {
        lock (objectLock)
        {
            myInnerControl1.PreviewMouseDown -= value;
            myInnerControl2.PreviewMouseDown -= value;
        }
    }
}

最后,我们可以为内部控件触发的事件添加一层控制,代码如下:

bool MousePreviewDownUsed = false;
event MouseButtonEventHandler _myPreviewMouseDownEvent = null;
public event MouseButtonEventHandler CustomPreviewMouseDown
{
    add
    {
        lock (objectLock)
        {
            _myPreviewMouseDownEvent += value;
            if (value != null && !MousePreviewDownUsed)
            {
                myInnerControl.PreviewMouseDown += myInnerControl_PreviewMouseDown;
                MousePreviewDownUsed = true;
            }
        }
    }
    remove
    {
        lock (objectLock)
        {
            if (_myPreviewMouseDownEvent != null)
            {
                _myPreviewMouseDownEvent -= value;
                if ((_myPreviewMouseDownEvent == null ||
                     _myPreviewMouseDownEvent.GetInvocationList().Length == 0)
                      && MousePreviewDownUsed)
                {
                    _myPreviewMouseDownEvent = null;
                    myInnerControl.PreviewMouseDown -= myInnerControl_PreviewMouseDown;
                    MousePreviewDownUsed = false;
                }
            }
        }
    }
}
private void myInnerControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    // Do some previous operations or control whether the event must be broadcasted
    _myPreviewMouseDownEvent?.Invoke(sender, e);
}

这样,我们就可以像之前一样在XAML或代码后台中初始化事件。

以上就是在WPF中创建用户定义事件的方法和一个小例子。

0
0 Comments

在WPF中创建用户定义(新)事件的方法是使用Action委托。通过Action委托,可以将事件处理程序中需要传递的值作为参数传递。

在上述代码中,通过定义一个名为onUserCodeFetched的Action事件,并将其声明为public,可以在用户控件中创建一个新的事件。该事件的参数类型为string,即需要传递的值的类型。

在按钮的点击事件btnEnterClicked中,通过调用onUserCodeFetched事件,并将PersonellCode.Text作为参数进行传递。在传递参数后,将PersonellCode.Text重置为空。

作者在之前使用Action而不是EventHandler的原因是因为Action更容易传递值给事件处理程序。然而,经过阅读stackoverflow.com上的一篇回答后,作者重新考虑了这种做法。

文章完整内容如下:

在WPF中,创建用户定义(新)事件的方法是使用Action委托。通过Action委托,可以将事件处理程序中需要传递的值作为参数传递。

下面是一个简单的示例:

public event Action onUserCodeFetched;
private void btnEnterClicked(object sender, RoutedEventArgs e)
{
    onUserCodeFetched(PersonellCode.Text);
    PersonellCode.Text = "";
}

在上述代码中,我们首先定义了一个名为onUserCodeFetched的Action事件,并将其声明为public。该事件的参数类型为string,即需要传递的值的类型。

在按钮的点击事件btnEnterClicked中,我们通过调用onUserCodeFetched事件,并将PersonellCode.Text作为参数进行传递。在传递参数后,我们将PersonellCode.Text重置为空,以便下一次输入。

有人可能会问,为什么作者之前使用Action而不是EventHandler?原因是Action更容易传递值给事件处理程序。然而,通过阅读stackoverflow.com上的一篇回答,作者重新考虑了这种做法。

希望这个简单的例子能帮助你了解如何在WPF中创建用户定义的事件。如果你想了解更多关于WPF的知识,可以参考相关文档和教程。

0