Avalondock 技巧之如何隐藏浮动面板停靠器

article/2025/9/24 21:54:41

avalondock 技巧之如何隐藏浮动面板停靠器

之前开发的一个项目需要实现窗口的浮出,拖拽,停靠等功能,于是想到了神器Avalondock,这个框架功能相当强大,而且能实现多种主题样式的控件,特别是窗口的浮动停靠等功能。目前该框架有收费版本和开源版本,我之前的项目使用的是avalondock v2.0的,目前最新的是v4.0。

官方链接: https://archive.codeplex.com/?p=avalondock.
Git链接: https://github.com/xceedsoftware/wpftoolkit.

在使用过程中需要用到窗口的浮出,停靠功能,每当拖拽窗口时会显示类似Visual Studio的窗口停靠器,这个功能默认就可以使用,但实际使用中却并不是处处都需要这个功能,有的时候因为用户的随意拖动会导致原始窗口发生较大变化,而且这个窗口停靠器官方并没有给出隐藏显示设置入口。
在这里插入图片描述
经过一翻stackoverflow查询,发现外国人也有这个困扰,回复里也给出了一些方式,比如说每次保存当前窗口,当发生停靠后可以一键恢复原来的窗口等,都是从接口入手解决的。我将git上的源码拉下来研究了一番,发现只要控制拖拽事件就能阻止触发这个停靠管理器的显示,于是找到了DragService.cs文件,里面实现了对拖拽功能的实现,在窗口布局控制文件LayoutFloatingWindowControl.cs找到了对鼠标右键的按下事件:

protected virtual IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled){handled = false;switch (msg){case Win32Helper.NCCALCSIZE:if (wParam != IntPtr.Zero){handled = true;var client = (RECT)Marshal.PtrToStructure(lParam, typeof(RECT));client.Bottom -= 1;Marshal.StructureToPtr(client, lParam, false);}break;//case Win32Helper.WM_NCHITTEST://  {//    handled = true;//    //var htLocation = DefWindowProc( hwnd, msg, wParam, lParam ).ToInt32();//    //switch( htLocation )//    //{//    //  case (int)HitTestResult.HTBOTTOM://    //  case (int)HitTestResult.HTBOTTOMLEFT://    //  case (int)HitTestResult.HTBOTTOMRIGHT://    //  case (int)HitTestResult.HTLEFT://    //  case (int)HitTestResult.HTRIGHT://    //  case (int)HitTestResult.HTTOP://    //  case (int)HitTestResult.HTTOPLEFT://    //  case (int)HitTestResult.HTTOPRIGHT://    //    htLocation = (int)HitTestResult.HTBORDER;//  }//  break;case Win32Helper.WM_ACTIVATE:if (((int)wParam & 0xFFFF) == Win32Helper.WA_INACTIVE){if (lParam == this.GetParentWindowHandle()){Win32Helper.SetActiveWindow(_hwndSrc.Handle);handled = true;}}break;case Win32Helper.WM_EXITSIZEMOVE:UpdatePositionAndSizeOfPanes();if (_dragService != null){bool dropFlag;var mousePosition = this.TransformToDeviceDPI(Win32Helper.GetMousePosition());_dragService.Drop(mousePosition, out dropFlag);_dragService = null;SetIsDragging(false);if (dropFlag)InternalClose();}break;case Win32Helper.WM_MOVING:{UpdateDragPosition();if (this.IsMaximized){this.UpdateMaximizedState(false);}}break;case Win32Helper.WM_LBUTTONUP: //set as handled right button click on title area (after showing context menu)if (_dragService != null && Mouse.LeftButton == MouseButtonState.Released){_dragService.Abort();_dragService = null;SetIsDragging(false);}break;case Win32Helper.WM_SYSCOMMAND:int command = (int)wParam & 0xFFF0;if (command == Win32Helper.SC_MAXIMIZE || command == Win32Helper.SC_RESTORE){UpdateMaximizedState(command == Win32Helper.SC_MAXIMIZE);}break;}return IntPtr.Zero;}

其中:UpdateDragPosition() 就是实现对移动过程中触发窗口停靠器

case Win32Helper.WM_MOVING:{UpdateDragPosition();if (this.IsMaximized){this.UpdateMaximizedState(false);}}break;
private void UpdateDragPosition(){if (_dragService == null){_dragService = new DragService( this );SetIsDragging(true);}var mousePosition = this.TransformToDeviceDPI(Win32Helper.GetMousePosition());_dragService.UpdateMouseLocation(mousePosition);}

改造一下,不实现DragService即可。

private void UpdateDragPosition(){if (_dragService == null){//不初始化拖拽事件//_dragService = new DragService( this );SetIsDragging(true);}var mousePosition = this.TransformToDeviceDPI(Win32Helper.GetMousePosition());if (_dragService != null){_dragService.UpdateMouseLocation(mousePosition);}}

重新生成一下,运行自己的程序,再也没有窗口停靠器的出现了。这下界面就不会被用户搞乱了,但想要实现的浮动停靠功能就没有了,于是自己手动通过按钮来触发浮出,停靠功能,而拖拽窗口并不会触发停靠事件。

private void btnFloatVideo_Click(object sender, RoutedEventArgs e){if (anchorable.IsFloating){this.btnFloatVideo.Content = "浮出窗口";anchorable.Dock();teleCenter.DockWidth = new GridLength(720);telerecord.DockWidth = new GridLength(700);}else{this.btnFloatVideo.Content = "停靠窗口";anchorable.Float();}}

这下窗口的所有控制都在你的可控之下了。


http://chatgpt.dhexx.cn/article/OY8NEXxK.shtml

相关文章

[转]AVALONDOCK 2.0入门指南第一部分

AvalonDock 2.0可以用来为WPF创建一个类似Visual Studio的界面,深入理解如何使用AvalonDock进行开发是很重要的。 在这个入门指南里,我将演示如何开始使用AvalonDock,下面的文章都是基于2.0版本的。并且不能用于早期的版本。 AvalonDock是一个…

WPF AvalonDock拖拽布局学习整理

AvalonDock提供了一个系统,允许开发人员使用类似于许多流行的集成开发环境(IDE)中的窗口对接系统来创建可自定义的布局。 AvalonDock遵循MVVM设计。Model由Xceed.Wpf.AvalonDock.Layout命名空间中包含的类表示。此命名空间中的类是布局模型中…

WPFAvalonDock基本用法

本文简单介绍AvalonDock2.0基本用法,下载AvalonDock 2.0dll及主题http://avalondock.codeplex.com/ AvalonDock基本类介绍 DockingManager:停靠管理类,xaml中AvalonDock的根节点 LayoutRoot:布局根节点,有四个属性LeftSide,RightSide,TopS…

AvalonDock的基本用法

AvalonDock是优秀的开源项目,用于创建可停靠式布局,能够在WPF中方便开发出类似VS2010的软件界面。对于复杂的软件系统,大量控件的使用会使的界面变得难以管理。AvalonDock帮我们解决了这一问题。想要在WPF项目中使用AvalonDock的功能&#xf…

WPF随笔(十)--使用AvalonDock实现可停靠式布局

我们每天使用的许多软件都使用了可停靠式布局,可以方便的打开、关闭、收起、展开、移动选项卡。今天就来说明如何使用AvalonDock实现这种可停靠式布局。 AvalonDock安装 最新版本的AvalonDock类库包含在程序包Extended.Wpf.Toolkit中,属于Xceed旗下的一…

WPF AvalonDock 常用功能使用

AvalonDock是什么? AvalonDock是一个开源项目【GitHub - Dirkster99/AvalonDock: Our own development branch of the well known WPF document docking libraryGitHub - Dirkster99/AvalonDock: Our own development branch of the well known WPF docume…

WPF 第三方控件学习使用——可停靠布局控件(AvalonDock)

需求 近期在做公司上位机产品规划与实验,参考了Blender软件的布局风格,希望能用WPF也做一个类似布局的上位机。于是开始寻找资源,很快就发现了AvalonDock。 AvalonDock简介 AvalonDock是Xceed公司 Wpf.Toolkit 中的一款收费产品&#xff0…

wpf-AvalonDock基础-安装和更换主题

2022/7/29更新:去掉标题行的钉子 在LayoutAnchorable上添加属性: CanAutoHide"False" CanClose"False"如果要去掉X,再添加 CanHide"False"最近对wpf的多窗口排列问题深感头疼,算尺寸、位置太麻烦…

AvalonDock使用(1)-基本用法

AvalonDock的基本用法 介绍AvalonDock库中的基本类DockingManager:停靠管理器类LayoutRoot : 布局根节点类LayoutPanel:布局面板类LayoutAnchorablePane:可停靠窗格类LayoutAnchorable:可停靠内容类 LayoutDocumentPane:文档窗格类LayoutDocu…

十进制-75在计算机中,十进制数75转换成二进制数是多少?

75转换成二进制是:1001011。 75/237......1 37/218......1 18/29.........0 9/24...........1 4/22...........0 2/21...........0 从下往上读余数,就是整数部分的案1001011。拓展资料: 十进制整数转换为二进制整数方法: 十进制整…

二进制数的算术运算

2, 二进制数的算术运算 2.1 二进制数的算术运算 二进制数的算术运算包括加法、减法、乘法和除法。 1)加法运算 加法进位规则:逢二进一。 加法运算法则: 000 01101 1110(向高位进位) 例:(1101)2(1011)2?,解算如下: 从执行加法的过程可知&…

二进制数与十进制数的相互转换、二进制数的乘除运算、移位运算

二进制数与十进制数的转换 聊二进制数的运算前,我们先看看二进制数的值与十进制数的值是如何相互转换的, 十进制转换成二进制 将十进制数除以2,得到的商再除以2,依次类推直到商为1时为止,然后在旁边标出各步的余数&am…

计算机组成原理 二进制数的运算

1、算数运算 (1)加法运算 二进制加法法则为: 000 10011 110(向邻近高位有进位) 1111(向邻近高位有进位) (2)减法运算 二进制减法法则为: 0-00 1-10 1-01 0-1…

将输入的十进制数转换成二进制数

软件:DEV,语言:C语言。 声明:本案例只考虑了整数(即int型),故无法进行小数之间的转换(例如float型,double型)。 十进制整数转换为二进制整数采用"除2取…

二进制数表示法

二进制数表示法 二进制数是数字电路中应用最广泛的一种数值表示方法,在逻辑代数中也经常使用。 1、十进制数 在这种计数进位制中,每一位用0~9十个数字来表示,所以计数基数是十。超过9的数则需用多位数表示,其中低位数和相邻高位…

c语言程序10进制转2进制,C语言十进制数转换为二进制数

这是一个C语言 do while 循环示例:统计十进制正整数 n 转换为二进制数后,其二进制序列中包含的 1 和 0 的个数。 问题分析 输入:一个正整数。 输出:两个整数:1 的个数和 0 的个数。 将十进制数 n 转换成二进制数,一般采用“除 2 取余,倒序输出”的方法。 本题只是统计转…

二进制转十进制c++语言数组,C++实现读入二进制数并转换为十进制输出

C++实现读入二进制数并转换为十进制输出 题目描述 已知一个只包含0和1的二进制数,长度不大于10,将其转换为十进制并输出。 输入描述 输入一个二进制整数n,其长度不大于10 输出描述 输出转换后的十进制数,占一行 样例输入 110 样例输出 6 solution: 很多学过C初学C++的人可…

二进制数的加法步骤解析

文章目录 位运算二进制数加法步骤例子代码演示 二进制的加法需要用到位运算,所以先来复习下位运算。 位运算 运算符号(java)描述位与&都为1,结果为1,否则为0。位或|有一个为1或两个位都为1,则结果为1,否则为0。换…

二进制数及其运算

计算机的底层都是使用二进制数据进行数据流传输的,那么为什么会使用二进制表示计算机呢?什么是二进制数呢?如何使用二进制进行加减乘除?二进制数如何表示负数呢?本文将为你揭晓。 为什么用二进制表示 计算机内部是由I…

二进制数的运算

文章目录 前言一、加法运算规则二、减法运算规则三、乘法运算规则四、除法运算规则五、逻辑或运算规则六、逻辑与运算规则七、逻辑非运算规则八、逻辑异或运算规则 前言 此篇文章仅介绍二进制数的运算,不涉及其他进制的运算 一、加法运算规则 000 011 101 110 &…