2013-01-23 64 views
12

我有一個用戶控件在WPF:如何激發用戶控件的卸載事件在WPF窗口

<UserControl x:Class="XLogin.DBLogin" 
      x:Name="DBLoginUserFrame" 
      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" 
      mc:Ignorable="d" 
      Height="263" 
      Width="353" 
      Loaded="DBLoginUserFrame_Loaded" 
      Unloaded="DBLoginUserFrame_Unloaded"> 
    <Grid> 
    <GroupBox Header="Database Connection" 
       HorizontalAlignment="Left" 
       Height="243" 
       Margin="10,10,0,0" 
       VerticalAlignment="Top" 
       Width="333"> 
     <Grid> 
     <TextBox x:Name="TextUserDB" 
       HorizontalAlignment="Left" 
       Height="20" 
       Margin="101,60,0,0" 
       TextWrapping="Wrap" 
       VerticalAlignment="Top" 
       Width="173" /> 
     <Label Content="Password:" 
       HorizontalAlignment="Left" 
       Height="24" 
       VerticalAlignment="Top" 
       Width="70" 
       HorizontalContentAlignment="Right" 
       Margin="10,85,0,0" /> 
     <PasswordBox x:Name="TextPasswordDB" 
        HorizontalAlignment="Left" 
        Height="20" 
        Margin="101,89,0,0" 
        VerticalAlignment="Top" 
        Width="173" /> 
     <Button x:Name="BtnConnect" 
       Content="Connetti" 
       Height="29" 
       Width="123" 
       Margin="101,152,97,24" 
       Click="BtnConnect_Click" /> 
     </Grid> 
    </GroupBox> 

    </Grid> 
</UserControl> 

當我卸載該控件,WPF提高事件DBLoginUserFrame_Unloaded是保存我的設置和它的工作。

我在WPF是加載此用戶的控制,但窗口被關閉,我的用戶UNLOAD不火的主窗口:

<Window x:Class="XLogin.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    xmlns:local="clr-namespace:XLogin" Unloaded="Window_Unloaded_1"> 
<Grid> 
    <local:DBLogin/> 
</Grid></Window> 

如何添加用戶控件Unload事件到主窗口的事件處理程序?

回答

14

documentation

「注意,應用程序開始關閉後不會引發空載事件時,由ShutdownMode屬性定義的條件發生如果您在處理程序中清除代碼出現應用程序關閉。對於Unloaded事件,例如對於Window或UserControl,它可能不會按預期調用。「

如果關閉窗口會觸發應用程序的關閉,那可能是原因。在這種情況下,即使窗口的卸載事件也可能不會被調用,所以我認爲最好依靠Window.Closing事件。

處理您的UserControl在卸載時執行的任務的一種方法是公開控件的卸載處理程序方法(「DBLoginUserFrame_Unloaded」),在MainWindow中命名您的UserControl實例並從Window.Closing事件調用它。

public MainWindow() 
{ 
    // Add this 
    this.Closing += MainWindow_Closing; 
} 

void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    this.MyUserControl.MethodToBeCalledWhenUnloaded(). 
} 

另一種選擇是讓你實現,但迄今爲止還你的用戶控件添加處理程序Dispatcher.ShutdownStarted事件,如所描述here

public MyUserControl() 
{ 
    this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; 
} 
相關問題