2016-07-06 3 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 приложения в экземпляр 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 дочерних окон, нажатие «Закрыть все окна» закроет все окна, в том числе главное окно ... очень странное поведение. Не уверен, если это совпадение или нет ... lol – cwodarczyk82

+0

Я собираюсь рассмотреть это закрытое ... Я считаю, что никто другой не попытается ответить на него ... Я нашел, что он работает в WinForms, что странно .. I опубликует другой вопрос о переполнении стека, показывающий код 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

Не уверен, что это сработает для моего конкретного приложения ... Я не хотите добавить новый элемент пользовательского интерфейса, который пользователь нажмет, чтобы закрыть все окна (они уже могут сделать это, закрыв главное окно). Я понимаю, что ваш код достигает, но он вызывается путем прямого вызова его через новый элемент пользовательского интерфейса, а не панель задач «Закрыть все окна», если только я чего-то не хватает, я пытаюсь захватить событие «Закрыть все Windows», если таковые имеются. Я также не могу закрыть главное окно, когда я получаю событие, когда дочернее окно закрывается. Это было бы неправильным поведением в моем приложении. Благодаря! – cwodarczyk82

+0

это только закроет окно, на которое вы добавите обработчик событий ... просто не добавляйте обработчик к вашему главному окну, и он не будет закрыт ... –

+0

Дело в том, что я хочу, чтобы главное окно закрывалось со всеми дочерними окнами, когда пользователь закрывает все окна с панели задач за один раз. Имеет ли это смысл? Если вы посмотрите на изображение скриншота, которое я приложил к вопросу, возможно, это может помочь объяснить, с каким событием я борюсь? Дело в том, что результаты являются спорадическими, и я упомянул в ответе на свой собственный вопрос, что он будет закрывать все окна только тогда, когда у меня будет ровно кратное четыре дочерних окна ... что-то, что я только что заметил сегодня после игры с ним Больше. – cwodarczyk82

Смежные вопросы