派生的异步委托被调用两次

本文关键字:两次 调用 异步 派生 | 更新日期: 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构造函数中的订阅只是一个委托,它将虚拟地调用该方法。