某项目中,需通过com口的方式读取CF卡的rfid,。
问题:当我关闭模块,然后第二次打该模块时,弹出如下错误”对端口Com1的访问被拒绝”(编程这一行业,不是找不到对象,就是被xxx拒绝!):
断点调试:在用户控件Loaded事件尝试打开Com口时出现异常:对端口Com1的访问被拒绝”。
最后找到原因及解决方法:
加载用户控件时打开了com口,关闭模块时同时也该关闭com口,但是用户控件没有Closing或Closed事件,咋办呢?于是我用了UnLoaded事件解决了这个问题,反复打开关闭模块,不再出现”访问com口被拒绝”这个错误:
UnLoaded事件:
关闭Com口:
总结:WPF之Window.Closing 、Window.Closed、FrameworkElement.Unloaded
三则的区别:
Window.Closing 事件 :在调用 Close 之后立即发生,并且可进行处理以取消关闭窗口。
可以处理 Closing 来检测窗口何时关闭(例如,何时调用 Close)。此外,可以使用 Closing 来阻止窗口关闭。若要阻止窗口关闭,可以 将CancelEventArgs 参数的 Cancel 属性设置为 true。
当调用 Close、单击窗口的“关闭”按钮,将引发 Closing 事件。
代码示例:
private void Window_Closing(object sender, CancelEventArgs e) { if (this.IsLoaded) { MessageBoxResult result = MessageBox.Show("是否退出程序?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { //do something to record the shutdown event DateTime shutDownDt = DateTime.Now; } else { e.Cancel = true; } } }
Window.Closed 事件:在窗口即将关闭时发生。
一旦引发此事件,就无法阻止窗口关闭。
FrameworkElement.Unloaded事件:当从加载的元素的元素树中移除元素时发生。
在某些情况下是不会被触发的。比如说:Window在Closing的时候,是不会去触发它的子元素的Unloaded 事件。
Loaded和UnLoaded和UI有关。Closing和窗体本有关。
比如下窗口初始化的时候,如果窗口是隐藏的,那么Loaded是不会触发的。
因为它只在这个控件开始Visible的时候触发。同理,UnLoaded也是。