我正在编写一个usercontrol(winforms),它接受剪贴板中的图像,进行一些操作,然后允许用户上传它并获取图像的URL。
我希望该控件的用户编写他/她自己的代码进行上传。我在usercontrol中有一个上传按钮,我想在点击该按钮时调用用户编写的代码并传递图像对象。
我已经尝试过代理但是使用委托,用户必须调用它。 但我希望用户不应该调用它,而应该在我的控件中单击上传按钮时调用它。
我已阅读以下内容,但他们没有帮助
Pass Method as Parameter using C#
How can I pass a method name to another method and call it via a delegate variable?
有什么方法可以让我们允许用户在使用控件的表单中覆盖上传方法,这样他可以编写自己的代码或其他东西吗? 有人能指出我正确的方向吗?
答案 0 :(得分: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...
}
}