19

WPFにUserControlがあります。

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

UserControl UnloadイベントをMainWindowイベントハンドラーに追加するにはどうすればよいですか?

4

3 に答える 3

28

ドキュメントから:

「アプリケーションのシャットダウンが開始された後、Unloadedイベントは発生しないことに注意してください。アプリケーションのシャットダウンは、ShutdownModeプロパティで定義された条件が発生したときに発生します。ウィンドウやUserControlなどのUnloadedイベントのハンドラー内にクリーンアップコードを配置した場合、期待どおりに呼び出されない可能性があります。」

ウィンドウを閉じるとアプリケーションがシャットダウンする場合は、それが原因である可能性があります。その場合、WindowのUnloadイベントも呼び出されない可能性があるため、 Window.Closingイベントに依存する方がよいと思います。

アンロード時にUserControlが実行するタスクを処理する1つの方法は、コントロールのアンロードハンドラーメソッド( "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().
}

もう1つのオプションは、これまでの実装を維持するだけでなく、ここで説明するように、UserControlにDispatcher.ShutdownStartedイベントのハンドラーを追加することです。

public MyUserControl()
{
    this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
}
于 2013-01-23T12:50:41.210 に答える