haoxiaobo

从C到C++又到.net, 有一些心得, 和大家交流下...
随笔 - 64, 文章 - 6, 评论 - 635, 阅读 - 18万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

抽空看了一下 dockpanel suite, 知道如何用了, 立此存照

Posted on   HAL9000  阅读(15528)  评论(24编辑  收藏  举报

这个控件不错, 可以很方便地实现如vs 2003里那种窗口定位, 浮动, dock, tab化等界面效果, 今天有空下载来看了一下, 用起来还是很容易的, 大概讲一下, 省得以后忘记了.

dockpanel中提供了几个可用的类, 重要的有两个, 一是DockPanel, 一是DockContent,

DockPanel是从panel继承出来的, 用于提供可浮动的dock的子窗口进行浮动和dock的场所,
DockContent是从form类中继承出来的, 用于提供可浮动的窗口基类. 就是说: DockContent对象可以在DockPanel对象中任意贴边, 浮动, TAB化等.

建立一个docpanel风格的程序的过程是:

1.  建立一个winform程序, 引用WinFormsUI.dll;
2.  程序主窗口比如说是FrmMain; 把FrmMain.IsMdiContainer 设置为true;
3.  在FrmMain中放一个DockPanel, 比如说名称是Panel1, 把Panel1.Dock设为Fill, 或是者是你规划的地方.
4.  新建你的子文档窗口类, 就是新建一个windows FORM, 在窗口设计器里面随便你添上什么愿意要的控件. 这将是你的程序里的子窗口,  我弄了两个:
    一个叫FrmChild, 里面放了一个dock fill的editbox,
    另一个叫FrmProperty, 放了一个dock fill的PropertyGrid, 名叫propertyGrid1,
    设这两个是有用的. 后面说.
5.  打开FrmChild和FrmProperty的代码, 把class的继承类由Form改为DockContent;
如:

public class FrmChild : WeifenLuo.WinFormsUI.DockContent // 注意这里改了!
{

}


6.  为FrmMain加上两个私有成员:  
  FrmChild fc;
  FrmProperty fp;
这两个成员用来保存待会儿新建的两个窗口的指针.
7. 为FrmMain的Load写些代码, 如下:

            fc = new FrmChild();
            fp 
= new FrmProperty();
            fc.Show(
this.dockPanel1);
            fp.Show(
this.dockPanel1);
            fp.propertyGrid1.SelectedObject 
= fc;
            fp.propertyGrid1.PropertyValueChanged 
+=new PropertyValueChangedEventHandler(propertyGrid1_PropertyValueChanged);

            fc.MouseDown 
+=new MouseEventHandler(fc_MouseDown);
            fc.MouseUp 
+=new MouseEventHandler(fc_MouseUp);

就是建立两个窗口, 这两个窗口都是从DockContent中继承的, 都有贴边, tab化, 自动hide的能力, 很有意思的.
注意DockContent有新的Show()方法, 可以指定要Show的DockPanel, 当然要写上你准备的那个dockPanel1;
两个都Show了, 然后为fp的propertyGrid1指定要显示的对象, 就是fc;
之后再注册事件处理程序, 这几句是为了可以实现属性变了窗口变, 窗口变了属性变的效果, 可以动态地看到这些对象的属性对于其外观和形为的影响, 对于只想建个多窗口程序的人来说, Show完了就可了.
8. 由于上面注册的事件, 下面加几个事件处理程序:

        private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
        
{
            
            
this.dockPanel1.Invalidate();
            
this.fc.Invalidate();
            
//this.fc.Refresh();

        }


        
private void fc_MouseDown(object sender, MouseEventArgs e)
        
{
            
this.fp.propertyGrid1.Refresh();
        }


        
private void fc_MouseUp(object sender, MouseEventArgs e)
        
{
            
this.fp.propertyGrid1.Refresh();
        }


运行吧, 看看效果? 你把这两个窗口放到边上, 这里哪里都试试, 挺有意思的.
你也可以借这个程序试试DockContent的各个属性的效果.

差点忘记, 这里有这东西的下载地址, 有源码的, 很不错!  就是从我这里连速度太慢了.

http://sourceforge.net/projects/dockpanelsuite/

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示