web-dev-qa-db-ja.com

WPFでApplication.Exitイベントを使用するには?

特定のファイルをいくつか削除する必要があります。その後、ユーザーはWPFでプログラムを閉じます。だから私はここからMDSNコードを試しました http://msdn.Microsoft.com/en-us/library/system.windows.application.exit.aspx このように:

ここにあるこのコードApp.xml.cs

public partial class App : Application
{
 void App_Exit(object sender, ExitEventArgs e)
    {
       MessageBox.Show("File deleted");
        var systemPath = System.Environment.GetFolderPath(
                                  Environment.SpecialFolder.CommonApplicationData);

                var _directoryName1 = Path.Combine(systemPath, "RadiolocationQ");
                var temp_file = Path.Combine(_directoryName1, "temp.ini");

                if (File.Exists(temp1_file))
                {
                    File.Delete(temp1_file);
                }

    }

}

// App.xaml
<Application x:Class="ModernUIApp1.App"
             xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
             ShutdownMode="OnExplicitShutdown"
             Exit="App_Exit">
    <Application.Resources>

まず第一に、それはファイルを削除しません。第二に、このプログラムはexitボタンを押した後もプロセスに残ります(これは本当に奇妙です)。このコードではエラーは発生しません。最後にMessageBoxが表示されないので、ここで何か問題がありますか?

彼はこの機能を見つけることができないと思う。

16
Rocketq

とても簡単です:

「終了」プロパティをアプリケーションタグに追加します

<Application x:Class="WpfApplication4.App"
             xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
             Exit="Application_Exit">
</Application>

「コードビハインド」で処理します

private void Application_Exit(object sender, ExitEventArgs e)
{
    // Perform tasks at application exit
}

アプリケーションがシャットダウンするか、Windowsセッションが終了すると、Exitイベントが発生します。 SessionEndingイベントの後に発生します。 Exitイベントをキャンセルすることはできません。

43
Ofir

xamlコードにapp_exitを追加する必要があります

 <Application x:Class="CSharp.App"
  xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
  StartupUri="MainWindow.xaml" 
  ShutdownMode="OnExplicitShutdown"
  Exit="App_Exit"
    >
</Application>

次のようにメインウィンドウでClosingイベントをフックすることができます-

 <Window Closing="Window_Closing">

そして、あなたのイベントで必要なすべての仕事をしてください

    private void Window_Closing(object sender, CancelEventArgs e)
{
     MessageBox.Show("File deleted");
    var systemPath = System.Environment.GetFolderPath(
                              Environment.SpecialFolder.CommonApplicationData);

            var _directoryName1 = Path.Combine(systemPath, "RadiolocationQ");
            var temp_file = Path.Combine(_directoryName1, "temp.ini");

            if (File.Exists(temp1_file))
            {
                File.Delete(temp1_file);
            }
}
13
BRAHIM Kamel

MVVMの原則に従う場合は、System.Windows.Interactivity.WPFを使用できます。

MainWindow.xaml

<Window x:Class="Endonext.View.MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
    xmlns:i="http://schemas.Microsoft.com/expression/2010/interactivity"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <i:InvokeCommandAction Command="{Binding WindowClosingCommand, Mode=OneTime}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

MainWindowViewModel.cs

public class MainWindowViewModel 
{
    ICommand WindowClosingCommand => new RelayCommand(arg => this.WindowClosing());

    private void WindowClosing()
    {
      // do what you want.
    }
}

このアプローチはよりテスト可能です。ごきげんよう。

1
Jouan Antoine
  1. 名前空間(MyApp)が「x:Class = MyApp ...」と一致することを確認します
  2. <Application></Application>のプロパティで、[終了]の横のテキストボックスをダブルクリックします。
  3. 「イベントハンドラを追加できません」と表示された場合は、プロジェクトを再構築すると修正されました。

XAML

<Application x:Class="MyApp.App"
         xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml"
         Exit="Application_Exit"
>

コードビハインド

using System.Windows;

namespace MyApp
{ 
   public partial class App : Application
   {
     private void Application_Exit(object sender, ExitEventArgs e)
     {
         //your code
     }
  }
}
0
icernos