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组件和一个简单的布局。

效果图:

 

posted @ 2021-08-03 22:43  米格29  阅读(3361)  评论(0)    收藏  举报