Page Unload Event

      在〈Page Unload Event〉中尚無留言

knew Issue

Page 的 Unload event 有個嚴重的 knew issue, 如下

使用menu item 由Page A切換到Page B, 此時Page A的 Unload Event會發生. 如果Window再關掉, 才會發生Page A 的shutdown event.

但如果Page A並沒有切換到Page B, 而是直接關掉Windows, 則Unload並不會發生, 會直接發生shutdown event

Page關閉前的工作

Page關閉前需處理的工作, 最好寫在Unload之內, 因為一切換Page就會立即處理. 如果將要處理的工作寫在shutdown裏, 則在切換頁面時, 並不會立即處理, 需等到不知何年何月按下Window的關閉鈕, 才會執行.

但此時問題又來了, 上述knew issue的關係, 若直接按下Window的關閉鈕時, 因為Unload event並不會發生, 所以就無法執行要處理的工作.

解決方案

解決此問題, 就是在Unload處理一次, 並將 unloadFlag設為true. 然後於shutdown裏判斷unloadFlag若不為true, 則再處理一次, 如下代碼所示

namespace MyPage
{
    public partial class MachineSetting : Page
    {
        bool pageUnloadFlag = false;
        public MachineSetting()
        {
            InitializeComponent();
            this.Dispatcher.ShutdownStarted+=Page_ShutdownStarted;
            this.Unloaded += new RoutedEventHandler(Page_Unloaded);

        }
        private void Page_Unloaded(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("Unload");
            task();
            pageUnloadFlag = true;
        }
        private void Page_ShutdownStarted(object sender, EventArgs e)
        {
            Console.WriteLine("shutdown");
            if (!pageUnloadFlag)
            {
                
                task();
            }
        }
        private void task()
        {
		//要處理的工作
        }
    }
}

xaml亦需註明Unload事件

<Page x:Class="Dant2.Setting.MachineSetting"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:Dant2.Setting"
    mc:Ignorable="d" 
    d:DesignHeight="450" d:DesignWidth="800"
    Unloaded="Page_Unloaded"
    Title="MachineSetting" Background="#FF1C9EFE">
    <Grid>
    </Grid>
</Page>

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *