2016-07-06 82 views
1

所以我一直在做這方面的研究已經有好幾個星期了,並且還沒有真正拿出一個答案來解釋爲什麼這種方法無法正常工作......我甚至研究過JumpLists,看看這是不是我在找什麼,也無濟於事。這個問題涉及到當您嘗試通過右鍵單擊任務欄上的應用程序圖標來選擇「關閉所有窗口」時...如何在應用程序任務欄圖標上選擇「關閉所有窗口」時關閉所有窗口?

例如,下面是一個非常小且簡單的WPF應用程序,我用它來演示問題I我有。這裏是應用程序在其它的上下文菜單上選擇任務欄圖標...

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屬性)設置爲主窗口,就像我已經看到的所有示例都應該設置它,然後調用Show()。

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:

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

和它背後是相應的代碼,ChildWindow.xaml.cs:

using System; 
using System.Windows; 

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

正如你所看到的,這些類不會做太多...這是我可以編寫的最簡單的代碼示例,顯示了我遇到的問題。所以問題是,如果我從任務欄上下文菜單中選擇「關閉所有窗口」,它從不關閉所有窗口。相反,它會關閉一個子窗口,並仍然打開主窗口。有趣的是,當我這樣做時,我聽到窗口對話鈴聲,就像它被某些東西打斷,但我不知道是什麼。

這似乎也演得隨機......如果我產卵20個窗口,它有時會關閉窗戶,6然後所有的人......有時它會關閉幾個窗口一個接一個,然後關閉休息...有時會關閉所有的兒童窗戶,只讓主窗戶打開。不用說,我很困惑這種行爲,因爲它似乎沒有遵循任何明顯的模式......任何幫助非常感謝!並希望該示例是不夠好解釋什麼,我想要知道的....

+0

我也剛剛注意到,如果我有4個子窗口的倍數,單擊'關閉所有窗口'將關閉所有窗口,包括主窗口...非常奇怪的行爲。不知道這是巧合還是不...笑 – cwodarczyk82

+0

我要考慮這個封閉的......我相信沒有人會試圖回答這個問題......我發現它在的WinForms,這是奇怪的。我會後另一個堆棧溢出問題顯示的WinForms代碼我沒有和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項而不是任務欄'關閉所有窗口'來調用的,除非我錯過了一些東西,我試圖捕獲'關閉所有Windows'事件,如果有的話。當我收到子窗口關閉的事件時,我也無法關閉主窗口。這在我的應用程序中是不正確的行爲。謝謝! – cwodarczyk82

+0

這隻會關閉你添加事件處理程序的窗口......只是不要將處理程序添加到你的主窗口,它不會被關閉...... –

+0

事情是,我希望主窗口關閉與用戶一次從任務欄中關閉所有窗口時的所有子窗口。那有意義嗎?如果你看看附在問題上的截圖,或許這可能有助於解釋我正在處理的事件?問題是,結果是零星的,我在答覆中提到我自己的問題,它只會關閉所有窗口時,我有4個孩子的窗戶打開整整多......這是我今天只注意到它的一些玩後更多。 – cwodarczyk82