2013-01-23 11 views
12

Tôi có một UserControl trong WPF:Làm thế nào để bắn Unload trường hợp UserControl trong một cửa sổ 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> 

Khi tôi Unload này kiểm soát, WPF nâng cao sự kiện DBLoginUserFrame_Unloaded rằng lưu các thiết lập của tôi và nó làm một công việc.

Tôi có MainWindow trong WPF tải điều khiển người dùng này nhưng khi cửa sổ được đóng lại, UNLOAD usercontrol tôi không cháy:

<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> 

Làm thế nào để thêm sự kiện UserControl Unload để MainWindow xử lý sự kiện?

Trả lời

14

Từ documentation:

"Lưu ý rằng các sự kiện bốc dỡ không được đưa lên sau khi một ứng dụng bắt đầu tắt ứng dụng tắt máy xảy ra khi điều kiện xác định bởi thuộc tính ShutdownMode xảy ra Nếu bạn đặt mã ngẫu nhiên trong vòng một handler.. cho sự kiện Unloaded, chẳng hạn như cho một cửa sổ hoặc một UserControl, nó có thể không được gọi như mong đợi. "

Nếu đóng cửa sổ của bạn sẽ kích hoạt tắt ứng dụng của bạn, đó có thể là nguyên nhân. Trong trường hợp đó, ngay cả sự kiện Unload của Window cũng có thể không được gọi, vì vậy tôi tin rằng tốt hơn nên dựa vào sự kiện Window.Closing.

Một cách tiếp cận để xử lý các nhiệm vụ mà UserControl của bạn thực hiện khi dỡ tải là để hiển thị phương thức xử lý không kiểm soát ("DBLoginUserFrame_Unloaded"), đặt tên thể hiện UserControl của bạn trong MainWindow và gọi nó từ sự kiện Window.Closing.

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

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

Một lựa chọn khác là để giữ cho thực hiện của bạn cho đến nay mà còn thêm vào UserControl của bạn một handler cho sự kiện Dispatcher.ShutdownStarted, như mô tả here.

public MyUserControl() 
{ 
    this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; 
}