none
Zeige ein WPF Window in einem anderen WPF Window RRS feed

  • Allgemeine Diskussion

  • Hi,

    ich habe diesen Code hier und er funktioniert so wie er soll. Aber wenn ich jetzt ein model ChildWindow haben will, dann habe ich ein Problem. Um ein model ChildWindow in einem MainWindow zu haben muss ich ja erst einmal ".Show();" machen um es anzuzeigen, danach kann ich dann den Style holen. Jetzt schließe ich das ChildWindow mit ".Hide();" wieder um es danach mit ".ShowDialog();" wieder anzuzeigen. Jetzt habe ich aber das Problem, das es entweder gleich Fehler wirft, oder man schafft es, wenn man die Methode "SetParent" aus verschiednen Events wie z.B. Loaded() vom ChildWindow aufruft, dass etwas angezeigt wird. Das angezeigte, sieht genau so aus wie man es sicht vorstellt ein modales ChildWindow in einem MainWindow, blos reagiert dieses auf keine art von Eingabe (z.B. an der Titelleiste das Fenster verschieben geht nicht, Btns Drücken geht nicht, usw.). Und somit funktioniert es nun doch nicht.

        public class WindowHelper
        {
            private const int GWL_STYLE = (-16);
    
            private const UInt32 WS_POPUP = 0x80000000;
            private const UInt32 WS_CHILD = 0x40000000;
    
            [DllImport("user32.dll", SetLastError = true)]
            private static extern UInt32 GetWindowLongApi(IntPtr hWnd, int nIndex);
    
            [DllImport("user32.dll")]
            private static extern int SetWindowLongApi(IntPtr hWnd, int nIndex, UInt32 dwNewLong);
    
            [DllImport("user32.dll", SetLastError = true)]
            private static extern IntPtr SetParentApi(IntPtr hWndChild, IntPtr hWndNewParent);
    
            public void SetParent(Window childWindow, Window parentWindow)
            {
                childWindow.Owner = parentWindow;
                childWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
    
                childWindow.Show();
    
                IntPtr childWindowHandle = new WindowInteropHelper(childWindow).Handle;
                IntPtr parentWindowHandle = new WindowInteropHelper(parentWindow).Handle;
    
                uint windowStyle = GetWindowLongApi(childWindowHandle, GWL_STYLE);
                windowStyle = (windowStyle & ~(WS_POPUP)) | WS_CHILD;
    
                SetWindowLongApi(childWindowHandle, GWL_STYLE, windowStyle);
    
                SetParentApi(childWindowHandle, parentWindowHandle);
            }
    }

    Vielen Dank schon mal.

    Eric Weber
    Mittwoch, 5. Dezember 2012 15:56

Alle Antworten