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にMainWindowがありますが、ウィンドウを閉じると、ユーザーコントロールの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>
serControl UnloadイベントをMainWindowイベントハンドラーに追加する方法
ドキュメント から:
「アプリケーションのシャットダウンが開始された後は、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().
}
別のオプションは、これまでの実装を維持するだけでなく、 here のように、UserControlにDispatcher.ShutdownStartedイベントのハンドラーを追加することです。
public MyUserControl()
{
this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
}
ロジックをユーザーコントロール自体に組み込んで、もう少し自己完結型にすることもできます。
public UserControl1()
{
InitializeComponent();
this.Loaded += UserControl1_Loaded;
}
void UserControl1_Loaded(object sender, RoutedEventArgs e)
{
Window window = Window.GetWindow(this);
window.Closing += window_Closing;
}
void window_Closing(object sender, global::System.ComponentModel.CancelEventArgs e)
{
//Save your settings here
}
これをチェックしてください 回避策 。
public partial class Window1 : Window { public Window1() { InitializeComponent(); new Window(); //<-- this will make Unloaded Event to trigger in WPF } }