none
Window.Deactivated wird nicht immer aufgerufen RRS feed

  • Frage

  • Hallo allerseits,

    ich habe ein UserControl, welches innerhalb der Applikation in einem eigenen Window w1 geöffnet wird:

    var view = new SpotlightSearchView();

    Window w1 = new Window { Title = title, Content = view, SizeToContent = SizeToContent.WidthAndHeight, WindowStartupLocation = WindowStartupLocation.CenterOwner, ResizeMode = ResizeMode.NoResize, Owner = Application.Current.MainWindow, WindowStyle = WindowStyle.None, AllowsTransparency = true, ShowInTaskbar = false, WindowState = WindowState.Normal }; w1.ShowDialog();

    Wie man sieht, hat w1 als Owner Application.Current.MainWindow.

    Ich möchte wissen, wenn jemand im Hauptfenster der Applikation irgendwo außerhalb w1 klickt. In diesem Fall will ich das Fenster schließen.

    Hierzu registriere ich im SpotlightSearchView einen Event-Handler für Window.Deactivated:

    private void SpotlightSearchView_Loaded(object sender, RoutedEventArgs e)
    {
        Window.GetWindow(this).Deactivated += (s, evt) =>
        {
            Console.WriteLine("Deactivated called ...");
            Window.GetWindow(this).Close();
        };
    }

    Problem: Der Event-Listener für Deactivated wird nur dann aufgerufen, wenn man außerhalb der Applikation klickt, also z.B. Mit ALT+TAB in ein anderes Fenster wechselt.

    Was ich will: ich möchte mitkriegen, wenn man innerhalb der Applikation, aber außerhalb von w1 klickt, also irgendwo in Application.Current.MainWindow. In diesem Fall wird aber der der Deactivated-Listener nicht aufgerufen.

    Hat jemand eine Idee, wie ich das umsetze?

    Gruß

    Freitag, 8. März 2019 14:36

Antworten

  • Hi Abid,
    wenn Du anstelle vom ShowDialog einfach Show nimmst und Dein Fenster "w1" deaktiviert wird, z.B. so:

    using System;
    using System.Windows;
    
    namespace WpfApp1
    {
      /// <summary>
      /// Interaction logic for Window08.xaml
      /// </summary>
      public partial class Window08 : Window
      {
        public Window08()
        {
          InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
          Window w1 = new Window
          {
            Title = "Titel",
            Width=100, Height=100,
            WindowStartupLocation = WindowStartupLocation.CenterOwner,
            ResizeMode = ResizeMode.NoResize,
            Owner = Application.Current.MainWindow,
            ShowInTaskbar = false,
            WindowState = WindowState.Normal
          };
          w1.Deactivated += W1_Deactivated;
          w1.Show();
        }
    
        private void W1_Deactivated(object sender, EventArgs e)
        {
          ((Window)sender).Close();
        }
      }
    }
    


    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Freitag, 8. März 2019 17:49

Alle Antworten

  • Hi Abid,
    wenn Du anstelle vom ShowDialog einfach Show nimmst und Dein Fenster "w1" deaktiviert wird, z.B. so:

    using System;
    using System.Windows;
    
    namespace WpfApp1
    {
      /// <summary>
      /// Interaction logic for Window08.xaml
      /// </summary>
      public partial class Window08 : Window
      {
        public Window08()
        {
          InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
          Window w1 = new Window
          {
            Title = "Titel",
            Width=100, Height=100,
            WindowStartupLocation = WindowStartupLocation.CenterOwner,
            ResizeMode = ResizeMode.NoResize,
            Owner = Application.Current.MainWindow,
            ShowInTaskbar = false,
            WindowState = WindowState.Normal
          };
          w1.Deactivated += W1_Deactivated;
          w1.Show();
        }
    
        private void W1_Deactivated(object sender, EventArgs e)
        {
          ((Window)sender).Close();
        }
      }
    }
    


    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Freitag, 8. März 2019 17:49
  • Super danke. Genauso hat es funktioniert.
    Dienstag, 12. März 2019 09:20