派生的异步委托被调用两次
本文关键字:两次 调用 异步 派生 | 更新日期: 2023-09-27 18:10:51
我正在尝试重用我的自定义控件,重写派生控件中的一些事件处理程序。
代码如下:
public partial class ControlBase : UserControl {
public ControlBase() {
this.InitializeComponent();
//Buttons
PickFileButton.Click += pickFile;
}
protected virtual async void pickFile(object sender, RoutedEventArgs e) {
var picker = new FileOpenPicker();
picker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
picker.FileTypeFilter.Add(".wmv");
picker.FileTypeFilter.Add(".mp4");
var file = await picker.PickSingleFileAsync();
if (file == null) return;
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
inputFile = file;
InputVideoElement.SetSource(stream, file.ContentType);
}
}
public sealed partial class DerivedControl : ControlBase {
public DerivedControl() {
this.InitializeComponent();
PickFileButton.Click += pickFile;
}
//This handler called twice
protected async override void pickFile(object sender, RoutedEventArgs e) {
base.pickFile(sender, e);
//some other actions
}
当我试图调试它时,我看到以下内容:当我单击派生控件上的按钮时,它调用override void pickFile()
,它调用基实现。在基本方法pickFile()
执行丰富的var file = await picker.PickSingleFileAsync();
,然后,派生处理程序pickFile()
调用第二次和动作重复,直到var file = await picker.PickSingleFileAsync();
再次,之后我得到System.UnauthorizedAccessException
。
与基础控制按钮相同的操作可以正常工作。有什么问题吗?提前感谢
您将两次添加Click
事件处理程序:一次在DerivedControl
构造函数中,一次在ControlBase
构造函数中。
如果您只需要一个处理程序(正如我所期望的),只需删除DerivedControl
构造函数中的订阅。您的重写方法仍然会被调用,因为ControlBase
构造函数中的订阅只是一个委托,它将虚拟地调用该方法。