Die Implementierung eines multidock-window-system (wie blend, visual studio) in WPF
Wie würden Sie gehen zu implementieren, eine docking-toolbox windowing-system wie in Expression Blend, wo Sie andocken können toolbox-windows in eine Menge von Möglichkeiten, beneat einander überlappenden, als tabs oder als schwebende top-level-Fenster. Mein system sich Verhalten soll, so ziemlich das gleiche wie in Expression Blend. Auch bekomm ich die Weg visuellen Hinweise, wo Sie das toolbox-Fenster andocken beim ziehen ist genau das, was ich brauche.
Es ist nur eine exeception: In Mischung beim ziehen auf eine "toolbox" Fenster, das ist schon oberste Ebene (abgerissen) kann ich nur die dock es als Registerkarte Füllung das ganze Fenster. Ich allerdings brauche ein system, wo es keinen Unterschied zwischen einem toolbox-Fenster und dem Hauptfenster. Ich muss in der Lage sein, dock, die windows unter einander in einem toolbox-Fenster als das Hauptfenster.
Beachten Sie auch, dass aufgrund einer internen Politik, die ich nicht verwenden können, einer open-source-oder 3rd-party-Bibliothek für diese.
Würde mich interessieren, wie würden Sie das setup der Allgemeinen Klasse design für so etwas? Ich würde gerne noch bleiben, so generisch wie möglich sein, damit es verwendet werden kann für viele verschiedene Szenarien.
Den dockeing Verhalten ist, wie in der folgenden Abbildung. Das mittlere Bild zeigt die sensetive drag-docking-region. Und die äußeren Bilder, wo das Fenster snap:
alt-text http://img196.imageshack.us/img196/2450/dockingregions.png
Generell bin ich mit Bürgermeister Probleme hier: Wie entwerfe ich die Programmier-Modell (wie sind die docking-Konfigurationen werden beibehalten, in XAML) und wie mache ich das konkret umsetzen der zugrunde liegenden Funktionalität. Meine ersten Gedanken wären, dass ich gern habe, eine Symbiose von einem DockPanel und ein TabControl. Etwas in der Art von diesem:
<DockTabControl>
<DockTabItem Dock="FirstLeft">
<DockTabItem.Header>
<TextBlock>Tab 1</TextBlock>
</DockTabItem.Header>
<!-- Tab 1 content -->
</DockTabItem>
<DockTabItem Header="Tab 2" Dock="SecondLeft" DockMode="MergeWithPreviousToTabgroup">
<!-- Tab 2 content -->
</DockTabItem>
<DockTabItem Header="Tab 3" Dock="FirstMiddle">
<!-- Tab 3 content -->
</DockTabItem>
</DockTabControl>
Natürlich nicht noch Sinn machen. Docking kann nicht definiert werden, und die Fenster-problem nicht angesprochen, hier noch. Aber ich mag die Idee, die Definition der docking und der tabgroups nur durch die Festlegung einiger Eigenschaften auf die DockTabItem. Ich möchte wirklich nicht mehr vorstellen, extra Kontrollen wie TabGroups oder ähnliches. Ich mag, wie die docking-Verhalten im DockPanel nur durch die Festlegung der Reihenfolge der Kinder und der Dock angefügte Eigenschaft. Natürlich meine docking wird ein bisschen komplexer und verhält sich mehr wie das, was der Startaufstellung ist.
- Würde ich dringend empfehlen, nicht die Umsetzung selbst. Der Aufwand ist ziemlich groß. Sie sparen sich eine Menge Zeit-und somit eine Menge Geld -- durch den Kauf eines off-the-shelf Produkt, wie SandDock (divelements.com/net/controls/sanddockwpf/screenshots.aspx). Sollte reduzieren auch das Risiko, dass die third-party-Komponente wird abgehärtet worden aus Verwendung von vielen Kunden in verschiedenen Szenarien! (Ich bin nicht im Zusammenhang mit DivElements und haben keine persönliche Erfahrung mit SandDock -- nur geben Sie es als ein Beispiel.)
- Wie viele manmonths kann es vielleicht sein, implementieren Sie es selbst? Es sieht nicht so hart auf den ersten Blick.
- Meine Herren, Sie haben viel mehr Vertrauen als mir *grins* - es klingt ziemlich hart zu mir! Nachdem alle, die Sie unterstützen möchten, eine "Menge verschiedene Szenarien" und "dock toolbox windows in einer Vielzahl von Möglichkeiten." Klingt für mich wie ein multi-Wochen-Projekt an der minimum, aber natürlich weiß ich nicht Ihren Anforderungen oder Ihre team-Fähigkeiten!
- Multiweeks klingt ok für mich. 🙂
- Haben Sie ausgecheckt haben AvalonDock? Es ist kostenlos 🙂 codeplex.com/AvalonDock
- Guter Tipp für AvalonDock! 🙂
- Ich verstehe die Notwendigkeit, vorsichtig zu sein in Bezug auf Lizenzen, aber ich muss Zustimmen, die anderen hier. Wenn es open source ist und die Lizenz nicht zu restriktiv, dann sollten Sie wirklich über etwas, was bereits geschrieben und getestet, anstatt Ihre Zeit verschwenden es umschreiben. AvalonDock Führerschein nicht zwingen, Sie zu öffnen Sie Ihren code wie einige Lizenzen zu tun, und ermöglicht es Ihnen, alle änderungen, die Sie wollen. Das EINZIGE, was Sie tun müssen ist, geben Sie den copyright-Hinweis zusammen mit Ihnen, wenn Sie Ihr Produkt versenden. Was hindert Sie, es zu benutzen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unterstützen Sie die Szenarien illustrieren, die in Ihrer Frage ein Einzelzimmer
DockPanel
genügen würde, also alles, was Sie schreiben müssen, ist der Handler für OnDragEnter, OnDragOver, OnDragLeave, und OnDragDrop. Ich verwende in der Regel von einem einzigen Ereignis-handler, da der Umgang mit diesen vier Veranstaltungen ist so ähnlich:OnDragEnter & OnDragOver:
OnDragLeave:
OnDragDrop:
Haben Sie natürlich auch zum Griff ziehen auf die Titelleiste und rufen DoDragDrop auf das source-Objekt.
Den zwei Schwierigkeiten sind hier:
Für einen einfachen Algorithmus, den ich würde schätzen, es würde eine Woche dauern, um alle Falten ausgebügelt. Wenn du eine wirklich komplexe Daten-Struktur, und die Struktur selbst ist nicht offensichtlich, es könnte ernster Abbildung, dass ein Teil aus.
Adorner
s).Gibt es einen großen WPF-Docking-Bibliothek hat jemand veröffentlicht codeproject.com,, die Funktionalität, die Sie suchen.
Ich habe es myslef einmal, und ich bekam es klappt ziemlich reibungslos.
Check it out hier : http://www.codeproject.com/KB/WPF/WPFdockinglib.aspx
AvalonDock ist gut.
http://avalondock.codeplex.com/
Es ist schade, dass Sie nicht benutzen können 😉
WPF hat bereits Kontrollen, die support-docking (oder ähnlich). Überprüfen Sie, Adam Nathan, der WPF-Buch WPF Unleashed, deckt er es in Teil 2.