WPF: Child windows , oder MDI?



  • hervorragend mir Evil;) Bist ein gute Mann... und wie würdest du das ganze machen, wenn du jetzt ein Basis UserControl erstellt mit der Titelleiste und buttons, und dann später neue Usercontrol hinzufügest, welche von dem anderen Ableiten und bei denen dann der Clientbereich gefült wird?

    Hoffe du kannst mir folgen;)



  • danke {o;

    ganz einfach - eine neue klasse erstellen (KEIN UserControl erstellen da sonst eine xaml generiert wird, es wird nur die *.cs gebraucht)
    und diese einfach von SubWindow ableiten

    anhand meines vorherigen beispiels:

    namespace MDI_Test.Controls
    {
        class SubWindow2 : SubWindow
        {
        }
    }
    
    <StackPanel>
        <controls:SubWindow>
            <controls:SubWindow.ChildContent>
                <StackPanel>
                    <Button Content="SubButton1" />
                </StackPanel>
            </controls:SubWindow.ChildContent>
        </controls:SubWindow>
        <controls:SubWindow2>
            <controls:SubWindow2.ChildContent>
                <StackPanel>
                    <Button Content="SubButton2" />
                </StackPanel>
            </controls:SubWindow2.ChildContent>
        </controls:SubWindow2>
    </StackPanel>
    

    also man erstellt das UserControl als "MDIDialogTemplate" und alle "MDI fenster" leitet man einfach davon ab und erstellt den content



  • das mit der klasse hab ich schon hinbekommen, bin gut gell;) hat auch funktioniert, allerding hab ich da nen button im code angelegt

    namespace RenaProtoype.MyControls
    {
        class Class1 : SubWindow
        {
            public Class1()  {
                this.ChildContent = new Button();
    
            }
    
        }
    }
    

    und in deinem beispiel machst du den content ja mit xaml. Aber eine "normale" Klasse hat keinen XAML Teil. Verstehste?
    Cool wäre es, wenn jede klasse einen eigen XAML teil hätte wie andere Controls auch, so das ich den content nicht jeweils im hauptfenster definieren müsste.



  • Wegen verschiebbar und so...
    vielleicht hilft dir zusätzlich einer der folgenden Links aus meiner Linksammlung noch weiter, ich beschäftige mich aber selbst gerade nicht damit, so das ich sie nicht bewerten kann:

    WPF Docking Library
    DotNetBar for WPF (kommerzielle Bibliothek)
    SandDock for WPF (kommerzielle Bibliothek)

    cu André



  • also davon erben mit eigener xaml - da wuesste ich grad nix - wuerden wenn dann die anderen elemente der base xaml ueberdeckt werden - glaub nicht das das geht

    also entweder stets den ganzen boarder zeug kopieren oder den content per code erstellen oder den content in der main window erstellen - diese drei optionen wuesste ich nu



  • achso eine idee haette ich noch
    was haellst du davon den content in einer page zu definieren
    und dann in der mainwindow des in dem usercontrol packen ?

    <controls:SubWindow>
        <controls:SubWindow2.ChildContent>
            <controls:SubWindow2Page />
        </controls:SubWindow2.ChildContent>
    </controls:SubWindow>
    

    // hmm - scheint nicht zu funktionieren /=



  • hmm ist ne blöde sache.. hab mir grad überlegt, ob es nich gehen würde, wenn ich einfach normale WPF Windows als Child in einem Haupt WPF Window benutze.. oder gehts das nich gut? ich müsste es halt so machen, das die Child Windows nur in einem Bereich "Childarea" des Haupfenster sichtbar sind und ich sie nicht aus dem hauptfenster ziehen kann.

    Oder ist das ne schlechte Idee? ich denke schon



  • habs hinbekommen

    aaaaaaaaaaalso
    du hast dein UserControl welches nur den rahmen und das "ChildContent" property bereit stellt
    nun definierst du ein subwindow indem du
    eine Page erstellst mit deinen inhalt

    in in dem fenster wo es angezeigt werden soll dann nur noch:

    <controls:SubWindow2>
        <controls:SubWindow2.ChildContent>
            <Frame Source="Controls/SubWindow2Content.xaml" /> <!-- in dieser page hast du dein content des sub windows definiert -->
        </controls:SubWindow2.ChildContent>
    </controls:SubWindow2>
    

    deine idee geht nicht - ein "Window" muss in nem root sein, dh du kannst es nicht einbinden - darum ja der umweg {o;



  • ja danke werde deine Idee, mal testen . du hast es halt drauf;) Zu der Window geschichte.. ja ich binde die Fenster (Subwindo) nich in die Parentfenster ein, sonder ich übergeb den Subwindow den clientBereich. Wenn ich nun dne Subwindow verschiebe vergrößere etc. pürfe ich ob die größe nicht über das hauptfenster hinaus geht. Naja, alles andere als elegant;)

    deine idee ist super, allerding wird es ein krampf die Verschiebe/Vergrößere/Minimiere logik zu programmieren,



  • aber das brauchst du ja nur einmal in den SubWindowBorder element #gg (Die Page musste sich automatisch anpassen)
    der nachteil ist da nu nur, das du den content nicht live beim entwickeln in der mainwindow siehst, da wird nur "Frame" angezeigt

    waere dieses topic nix fuer die FAQ wenn ichs n bissl zusammenfasse? also "MDI in WPF" #gg



  • ok ich checks mal ab. Spiel grad bischen mit WPF Window rum, wie bekomm ich da Origin Postion des Fenster?

    bzw. wie finde ich die Pixel postion eine canvas in einem fenster aufm aufm bildschirm heraus?



  • ich vermute man muss das GetWindowRect von Win32 kapseln



  • oh man, das ganze ist aber auch ne eierlegende wollmilch sau



  • wie meinst du das ?
    falls es dir hilft - ich hatte mal SHGetFileInfo gekapselt - mit GetWindowRect muesste es simultan laufen

    namespace Helper
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public IntPtr iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };
    
        class Win32
        {
            public const uint SHGFI_ICON = 0x100;
            public const uint SHGFI_LARGEICON = 0x0;    // 'Large icon
            public const uint SHGFI_SMALLICON = 0x1;    // 'Small icon
    
            [DllImport("shell32.dll")]
            public static extern IntPtr SHGetFileInfo(string pszPath,
    	        			uint dwFileAttributes,
    		        		ref SHFILEINFO psfi,
    			        	uint cbSizeFileInfo,
    				        uint uFlags);
        }
    }
    
    IntPtr hImgSmall = Helper.Win32.SHGetFileInfo(fullName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON|Win32.SHGFI_SMALLICON);
    


  • ich meine das mhier weider direkt wieder mal WinAPI funktionen einbinden muss.

    Hey wie findest du den der artikel:

    http://www.codeproject.com/KB/WPF/mwiwpf.aspx



  • er hat im prinzip genau das selbe gemacht

    Since I could not add a window to a control in WPF (at least not the way I wanted to), I created a custom control which was styled to look like a window

    er hat nur statt ein UserControl ein Custom Control genommen - nur so wie es auschaut muss er den rahmen usw auch in jedem custom control neu zeichnen - durch die page brauchst du das nicht
    und die ganzen propertys wie transparent - draggable usw ist entweder ind er usercontrol bereits vorhanden oder man kann es leicht implementieren

    // er halt also ein eigenes control gemacht was ein "Window" simuliert und "SubWindows" als children annimmt - da find ich unsere loesung schoener #gg



  • bei seiner lösung muss ich aber die verschieben/größer/minimieren gedöns nicht mehr implementieren



  • schaus dir doch ab q: #gg

    wenn cih mit den code so anschau - er hat den gesammten client bereich mit einem MwiWindow ueberdeckt - und dieser beinhaltet als Children dann die fenster "MwiChild"

    wenn ich so mit dem code rumspiel - so richtig gefaellts mir nicht q: #gg
    zudem mag ich diese buttons fuer minimieren und schliessen nicht - diese variieren doch je nach system
    ich dacht das man sich diese auch vom system holt und dann anzeigt



  • ja hab mir den code angescahut, aber so richtig involviert bin ich in c# wpf noch net, hab zwar einiges gemacht.. aber das ist schon ein gutes stück stoff. Das Problem ist halt, das ich nun neue UserControl abgeleitet von MwiChild erstellen will.. aber das ist wohl net so einfach möglich



  • so wie ich das sehe basiert sein code darauf das du das content der ChildWindow fenster im hauptfenster definierst - so wie unsere erste loesung das schon konnte

    daher ist es bestimmt einfach das du dir das drag&drop&resize abschaust wie das implementiert wurde


Anmelden zum Antworten