WPF - AvalonDock仅需一点点代码实现Visual studio 拖拽停靠浮动功能
AvalonDock的一些简单实用方法,与官方AvalonDocPanelMemoryLeaks一模一样
首先需要去NuGet包管理器下载

而后给他添加命名空间xmlns:avalon="https://github.com/Dirkster99/AvalonDock" 另外两个红色免费期限只有45天后续会收费,我选的这个是在github开源的Dirkster99/AvalonDock GitHub地址:https://github.com/Dirkster99/AvalonDock
而后就可以在Xaml里面操作
1 <Grid> 2 <Grid.ColumnDefinitions> 3 <ColumnDefinition Width="0.2*"/> 4 <ColumnDefinition Width="0.8*"/> 5 </Grid.ColumnDefinitions> 6 <StackPanel> 7 <Button Width="100" Height="50" Margin="10" Content="button" Click="Button_Click"/> 8 </StackPanel> 9 <DockingManager Name="dockM" Grid.Column="1"> 10 <LayoutRoot> 11 <LayoutPanel> 12 <LayoutDocumentPaneGroup> 13 <LayoutDocumentPane x:Name="docGrup" /> 14 </LayoutDocumentPaneGroup> 15 </LayoutPanel> 16 </LayoutRoot> 17 </DockingManager> 18 </Grid>
C#代码因为只是个DEMO没有放项目内代码只需要简单的用法实列而已
1 public HeavyLoad HeavyLoad { get; private set; } 2 3 private void Button_Click(object sender, RoutedEventArgs e) 4 { 5 UserControl content = new UserControl(); 6 HeavyLoad = new HeavyLoad(); 7 content.DataContext = HeavyLoad; 8 LayoutDocument docDocument = new LayoutDocument 9 { 10 Title ="窗体", 11 Content = content 12 }; 13 docGrup.Children.Add(docDocument); 14 docDocument.Closed += DocClosed; 15 } 16 17 private void DocClosed(object sender, EventArgs e) 18 { 19 HeavyLoad.Load = null; 20 GC.Collect(); 21 } 22 } 23 public class HeavyLoad : HeavyLoadBase, INotifyPropertyChanged 24 { 25 public byte[] Load { get; set; } = new byte[100000000];//100MB 26 }
下面是关于AvalonDock的一些组件用法(内容来自https://archive.codeplex.com/ And https://www.cnblogs.com/happyyftk/p/6904491.html )
DockingManager 这是AvalonDock中的核心控件,它将包含的窗格排序,处理飞出的窗格,还有浮动的窗口。在上面这个图中,DockingManager 对象包含了所有空间(WPF控件),从顶部的工具栏到底部的状态栏都算。同时。DockingManager 也可以处理保存和恢复布局。
LayoutPanel 这个面板用来管理在一个方向上的子窗口(通过Orientation属性来选择方向),并且在它们之间添加了一个大小调节控件,在一个Orientation属性是Horizontal(水平)的LayoutPanel 上,排列了三个窗格。一个LayoutAnchorablePane在左,一个LayoutDocumentPane在中间。一个LayoutDockablePane在右边。
LayoutDockablePane 这个布局元素包含一个LayoutAnchorable对象的集合。通过它用来管理想TabControl这样的控件,在上面的截图中,LayoutDockablePanes是在左边的’Strumenti’ 和 ‘Progetti’ (工具和项目) 和在右边的’Classi’ 和 ‘Proprieta” (类视图和属性视图)的容器,一个LayoutDockablePane可以自动隐藏,就像’Errori’(错误)和’Lista Azioni’(操作列表) and ‘Uscita’(输出)。并且LayoutDockablePane可以被拖动到DockingManager上,成为一个浮动窗口或者附着到它的父控件DockingManager的边缘上。
LayoutDocumentPane 通常包含文档(DocumentContent类型)的一种窗格,但是其实也可以包含像上面提到的工具视图和类视图这样的DockableContents。在一个文档里。LayoutDocumentPane 被放置在ResizingPanel(水平方向)里。ResizingPanel则是上卖弄提到的在两个DockablePane中间的区域。注意。文档窗格是不能被移动的。
LayoutAnchorable 一个停靠内容,是软件控件的容器,总是被包含在一个窗格里(LayoutAnchorablePane或是LayoutDocumentPane),在截图里。LayoutAnchorable是一类对象(包含一个SharpDevelop对象),工具对象,但是错误窗口(它处于自动隐藏状态,被好办在一个自动隐藏窗格里)不是。LayoutAnchorable就像它名字所暗示的那样。可以被从他的容器窗格里拖走。然后重新放置在一个存在的窗格里。或者是放置在父DockingManager的边缘,或者是放置在一个浮动窗口里(LayoutAnchorableFloatingWindow)。
LayoutDocument 是一个仅可以被寄宿到LayoutDocumentPane的内容。它是一个特殊的内容,因为不能被停靠到边缘。仅能被放置到LayoutDocumentPane里。或者浮动在一个LayoutDocumentFloatingWindow窗口里。在途中,DocumentContent对象是program.cs’ 或 ‘MainForm.cs’ 文件视图
LayoutFloatingWindow ,是一个包含内容的窗口,当被拖动到一个DockingManager上面的时候,LayoutFloatingWindow(LayoutAnchorableFloatingWindow和LayoutDocumentFloatingWindow继承自他)集成在Window,总是包含一个窗格(LayoutAnchorablePane或是LayoutDocumentPane),窗格包含更多的内容(LayoutAnchorable或LayoutDocument),当用户对一个内容或是DockablePane执行拖拽,或者直接手工使用代码调用LayoutContent.Float()方法 LayoutFloatingWindow就被直接从DockingManager创建出来了。
LayoutPane 一个基类,LayoutDockablePane和LayoutDocumentPane继承自它。它为他们提供了一些共有的属性和方法。
LayoutContent 是LayoutAnchorable 和LayoutAnchorable类的父类。提供了共有的属性和方法。
理解布局元素是一些属于布局模型的类而不是属于视图是很重要的。因为,他们不是继承自FrameworkElement类,取而代之。AvalonDock包含了另一些类来展示这些组件的视图。这些类通常被命名为相关联的类名+Control字串。举个例子,在布局里创建的LayoutAnchorable创建了一个LayoutAnchorableControl(继承自FrameworkElement的类),并且绑定了LayoutAnchorableControl.Model 到这个LayoutAnchorable对象上。
每一个被创建的视图控件总是有着Model属性的布局元素。因此,重新设计一个相关视图控件的样式是可以的。
为了开始创建一个新的.net 4/.net 4.5的解决方案。并且添加对AvalonDock.dll的引用(可以直接添加也可以使用NuGet),然后添加AD命名空间到MainWindow.xaml中。
在根Grid下放置DockingManager组件和一个简单的布局。
效果图:


浙公网安备 33010602011771号