none
MVVM - Popup ständig im Fokus

    Frage

  • Hallo,

    leider habe ich nach einer Suche im Netz nichts gefunden. In meiner aktuellen WPF Anwendung verwende ich Popup Fenster zur Anzeige bzw Eingabe von Daten. Diese Fenster ist jedoch ständig im Focus. Das heißt auch wenn Browser - Fenster oder andere Programme geöffnet werden, erscheint dieses Popup immer im Vordergrund. Wie kann man das ändern?

    Anbei der Code

            <Popup Placement="Center" AllowsTransparency="True" IsOpen="{Binding IsPopupAnzeigeNullenVisible}">
                <Border BorderBrush="Black" BorderThickness="2">
                    <StackPanel>
                        <TextBlock Text="Anzeigen Nullen" FontSize="50" FontWeight="ExtraBold" HorizontalAlignment="Center" Background="AntiqueWhite"/>
                        <StackPanel>
                            <TextBlock Text="Bitte Messkopf auf" FontSize="30" Background="AntiqueWhite"/>
                            <TextBlock Text="Ursprung setzen und"  FontSize="30" Background="AntiqueWhite"/>
                            <TextBlock Text="Anzeigen Nullen"  FontSize="30" Background="AntiqueWhite"/>
                            <Image Source="{Binding AnzeigeNullenImagePath}" MaxHeight="200" HorizontalAlignment="Left"></Image>
                        </StackPanel>
                        <Button Content="Anzeigen Nullen" FontSize="20" Command="{Binding ClickAnzeigeNullen}"/>
                    </StackPanel>
                </Border>
            </Popup>

    Vielen Liebe Dank und schöne Woche Euch!

    Viele Grüße
    Martin


    • Bearbeitet mApO18 Montag, 3. Dezember 2018 10:26 Titel korrigiert
    Montag, 3. Dezember 2018 10:25

Antworten

  • Hallo Martin, hallo Dimitar,

    das Problem bei "StaysOpen=false" ist, das das PopUp verschwindet, wenn man irgendwo in das Window klickt. Standard bei PopUps ist (leider), das sie "topmost" sind. Eine kleine Abhilfe ist die Erweiterung des PopUps:

        public class PopupNonTopmost : Popup
        {
            protected override void OnOpened(EventArgs e)
            {
                var hwnd = ((HwndSource)PresentationSource.FromVisual(this.Child)).Handle;
                RECT rect;
    
                if (GetWindowRect(hwnd, out rect))
                {
                    SetWindowPos(hwnd, -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0);
                }
            }
    
            #region P/Invoke imports & definitions
    
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int Left;
                public int Top;
                public int Right;
                public int Bottom;
            }
    
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
    
            [DllImport("user32", EntryPoint = "SetWindowPos")]
            private static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags);
    
            #endregion
        }

    Damit bleibt dein PopUp sichtbar, bis du es wirklich schließen möchtest, steht aber anderen Fenstern nicht mehr im Weg.

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    • Als Antwort markiert mApO18 Dienstag, 4. Dezember 2018 11:55
    Dienstag, 4. Dezember 2018 11:18

Alle Antworten

  • Hallo Martin,

    Schau Dir die Popup.StaysOpen-Eigenschaft an. Es sollte reichen, den Wert auf false festzulegen.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 4. Dezember 2018 10:13
    Moderator
  • Hallo Martin, hallo Dimitar,

    das Problem bei "StaysOpen=false" ist, das das PopUp verschwindet, wenn man irgendwo in das Window klickt. Standard bei PopUps ist (leider), das sie "topmost" sind. Eine kleine Abhilfe ist die Erweiterung des PopUps:

        public class PopupNonTopmost : Popup
        {
            protected override void OnOpened(EventArgs e)
            {
                var hwnd = ((HwndSource)PresentationSource.FromVisual(this.Child)).Handle;
                RECT rect;
    
                if (GetWindowRect(hwnd, out rect))
                {
                    SetWindowPos(hwnd, -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0);
                }
            }
    
            #region P/Invoke imports & definitions
    
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int Left;
                public int Top;
                public int Right;
                public int Bottom;
            }
    
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
    
            [DllImport("user32", EntryPoint = "SetWindowPos")]
            private static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags);
    
            #endregion
        }

    Damit bleibt dein PopUp sichtbar, bis du es wirklich schließen möchtest, steht aber anderen Fenstern nicht mehr im Weg.

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    • Als Antwort markiert mApO18 Dienstag, 4. Dezember 2018 11:55
    Dienstag, 4. Dezember 2018 11:18
  • Einwandfrei. Ich Danke Euch!

    Viele Grüße
    Martin

    Dienstag, 4. Dezember 2018 11:55