0

我正在编写一个用户控件(winforms),它接受来自剪贴板的图像,进行一些操作,然后允许用户上传它并取回图像的 URL。

我希望该控件的用户编写他/她自己的代码来上传。我在用户控件中有一个上传按钮,我想在单击该按钮时调用用户编写的代码并传递图像对象。

我尝试过委托,但委托,用户必须调用它。但我希望用户不应该调用它,而是应该在单击我的控件中的上传按钮时调用它。

我已阅读以下内容,但它们没有帮助
使用 C# 将方法作为参数
传递 如何将方法名称传递给另一个方法并通过委托变量调用它?

有什么办法可以让用户以使用控件的形式覆盖上传方法,以便他可以编写自己的代码或其他东西?有人可以指出我正确的方向吗?

4

1 回答 1

0

您有两个主要选项来实现此目的,或者要求控件的用户提供一个上传方法,当单击“上传”按钮时由您的控件调用该方法,或者您可以要求控件是子类,并且Upload方法实施的。

方法 1 - 提供要在上传时调用的委托:

public partial class MyControl
{
    // Define a delegate that specifies the parameters that will be passed to the user-provided Upload method
    public delegate void DoUploadDelegate(... parameters ...);

    private readonly DoUploadDelegate _uploadDelegate;

    public MyControl(DoUploadDelegate uploadDelegate)
    {
        if (uploadDelegate == null)
        {
            throw new ArgumentException("Upload delegate must not be null", "uploadDelegate");
        }
        _uploadDelegate = uploadDelegate;
        InitializeComponent();
    }

    // ...

    // Upload button Click event handler
    public void UploadButtonClicked(object sender, EventArgs e)
    {
        // Call the user-provided upload handler delegate with the appropriate arguments
        _uploadDelegate(...);
    }
}

方法 2 - 要求覆盖上传方法:

public abstract partial class MyControl
{
    private readonly DoUploadDelegate _uploadDelegate;

    protected MyControl()
    {
        InitializeComponent();
    }

    // ...

    // The method that users of the control will need to implement
    protected abstract void DoUpload(... parameters ...);

    // Upload button Click event handler
    public void UploadButtonClicked(object sender, EventArgs e)
    {
        // Call the overridden upload handler with the appropriate arguments
        DoUpload(...);
    }
}

对于后一种选项,用户需要先对控件进行子类化,然后才能使用它,如下所示:

public class MyConcreteControl : MyControl
{
    protected override void DoUpload(... parameters ...)
    {
        // User implements their own upload logic here...
    }
}
于 2012-12-12T17:55:38.177 回答