2016-07-06 6 views
1

だから私は今これについて数週間研究してきましたが、なぜこれが正しく動作しないのかという答えを実際には思いつかなかった...私はジャンプリストを調べてこれが私が探していたものだけでなく、役に立たなかった。この問題は、タスクバーのアプリケーションのアイコンを右クリックして[すべてのウィンドウを閉じる]を選択しようとしたときに発生します。アプリのタスクバーアイコンで「すべてのウィンドウを閉じる」を選択すると、すべてのウィンドウを閉じる方法を教えてください。

たとえば、問題を実証するために書かれた極小の単純なWPFアプリケーションです持っている。ここでは、タスクバーのアプリケーションのアイコンがそのコンテキストメニューの選択肢となっています...

contextmenutoolbar 「すべてのウィンドウを閉じる」を選択しています(下のものはXをそれの左)。

これは、WPFアプリケーションであり、ここでApp.xamlのためのコードです:

<Application x:Class="CloseAllWindows.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     > 
<Application.Resources> 

</Application.Resources> 
</Application> 

ここでメインウィンドウを起動App.xaml.csは、あります。また、アプリケーションのMainWindowプロパティを、インスタンス化されるMainWindowに設定します。また、メインウィンドウが閉じられているときだけShutdownModeを設定します...メインウィンドウが閉じていて、いくつかのセカンダリウィンドウが開いたままになっていても、アプリケーションを実行したくないです。ここで

using System.Windows; 

namespace CloseAllWindows 
{ 
    /// <summary> 
    /// Interaction logic for App.xaml 
    /// </summary> 
    public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      ShutdownMode = ShutdownMode.OnMainWindowClose; 
      var mainWindow = new MainWindow(); 
      Application.Current.MainWindow = mainWindow; 
      mainWindow.Show(); 
     } 
    } 
} 

はMainWindow.xamlのコードです:

<Window x:Class="CloseAllWindows.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:CloseAllWindows" 
     mc:Ignorable="d" 

     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <Button Content="NewWindow" Click="ButtonBase_OnClick"></Button> 
    </StackPanel> 
</Window> 

そして、ここではそのための背後にあるコード...私はボタンをクリックすると、二次ウィンドウが起動しています。親ウィンドウ(Ownerプロパティ)をメインウィンドウに設定していますが、これまで説明したすべての例のように、Setを設定してからShow()を呼び出します。 、ChildWindow.xaml.cs

<Window x:Class="CloseAllWindows.ChildWindow" 
     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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:CloseAllWindows" 
     mc:Ignorable="d" 
     Title="ChildWindow" Height="300" Width="300"> 
    <Grid> 

    </Grid> 
</Window> 

そして、それは背後に対応するコードです::

using System; 
using System.Windows; 

namespace CloseAllWindows 
{ 
    /// <summary> 
    /// Interaction logic for ChildWindow.xaml 
    /// </summary> 
    public partial class ChildWindow : Window 
    { 
     public ChildWindow() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

あなたが見ることができるようにここで

using System; 
using System.ComponentModel; 
using System.Windows; 

namespace CloseAllWindows 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
     { 
      var childWindow = new ChildWindow {Owner = this}; 
      childWindow.Show(); 
     } 
    } 
} 

は、ChildWindow.xaml子ウィンドウのコードですこれらのクラスは大したことではありません...私が書くことができるコードの最も簡単な例は、私が持っている問題を示しています。問題は、タスクバーのコンテキストメニューからすべてのウィンドウを閉じるを選択すると、すべてのウィンドウが閉じられることはありません。代わりに、1つの子ウィンドウを閉じ、メインウィンドウを開いたままにします。興味深いことに、私はこれを行うと窓のチャイムがチャイムを聞くのを聞いています。何かが中断されたようなものですが、何が分かりません。

また、非常にランダムに動作するようです...私は20のウィンドウを生成すると、時々6つのウィンドウが閉じ、その後すべてが...時にはいくつかのウィンドウが1つずつ閉じられ、休憩...時にはすべての子ウィンドウを閉じ、メインウィンドウだけを開いたままにします。言うまでもなく、目立つ模様をたどるようには見えないので、私は行動に関してかなり困惑しています...どんな助けも大いに感謝しています!そして、うまくいけば、私は何を得ようとしているのかを説明するのに十分です。

+0

私は4つの子ウィンドウが複数ある場合、「すべてのウィンドウを閉じる」をクリックすると、メインウィンドウを含むすべてのウィンドウが閉じられます。非常に奇妙な動作です。これが偶然かどうか分かりません...笑 – cwodarczyk82

+0

私はこれを閉じたと見なします...誰もそれに答えるつもりはないと信じています...私はそれがWinFormsでうまくいくことを発見しました。私がしたWPFコードとWPFコードを表示し、WPF(もし何か)に欠けているものを尋ねる別のスタックオーバーフローの質問を投稿します。 – cwodarczyk82

答えて

0

イベントを追加して、イベントが埋め込まれたすべてのウィンドウを閉じることができます。この例を試してみてください。

ステップ1:あなたが欲しいものは何でもそれを呼び出すプロジェクトにクラスを追加し、私はCloseWindowListenerそれを呼んだ、あなたのクラスにこのコードを追加します。

public static class CloseWindowListener 
{ 
    public static event EventHandler<EventArgs> ClosingWindows; 

    public static void CloseWindows() 
    { 
     var CWindows = ClosingWindows; 

     if (CWindows != null) 
     { 
      CWindows(null, EventArgs.Empty); 
     } 
    } 
} 

ステップ2:にイベントハンドラを追加します。それが呼び出されたときに閉じたいウィンドウ。

public partial class TestWindow1 : Window 
{ 
    public TestWindow1() 
    { 
     InitializeComponent(); 
     CloseWindowListener.ClosingWindows += CloseWindowListener_ClosingWindows; 
    } 

    private void CloseWindowListener_ClosingWindows(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
} 

ステップ3:メインウィンドウまたは必要な場所からイベントを呼び出します。

private void button_Click_1(object sender, RoutedEventArgs e) 
    { 
     CloseWindowListener.CloseWindows(); 
    } 
+0

これは私の特定のアプリケーションではうまくいきます...私はしませんユーザーがすべてのウィンドウを閉じるために押す新しいUI要素を追加したい(メインウィンドウを閉じることでこれを行うことができる)。私はあなたのコードが達成していることを理解していますが、何かが見つからない限り、タスクバーの「すべてのウィンドウを閉じる」ではなく、新しいUIアイテムを使って直接呼び出すことによって呼び出され、「Close All Windows」イベントをキャプチャしようとしています。もしあれば。子ウィンドウが閉じるというイベントが発生したときにメインウィンドウを閉じることもできません。これは私のアプリケーションで不正な動作になります。ありがとう! – cwodarczyk82

+0

これは、イベントハンドラを追加するウィンドウを閉じるだけです。メインウィンドウにハンドラを追加しないでください。閉じられません。 –

+0

問題は、メインウィンドウを閉じたいユーザがタスクバーからすべてのウィンドウを一度に閉じると、すべての子ウィンドウが表示されます。それは理にかなっていますか?質問に添付されたスクリーンショットの画像を見ると、おそらくこれが私が取り組んでいるイベントを説明するのに役立つでしょうか?問題は散発的で、私は4つの子ウィンドウが複数開かれているときにすべてのウィンドウを閉じることになるという自分の質問に対する回答で言及しました。もっと。 – cwodarczyk82

関連する問題