某項目中,需通過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也是。