C# UserControl、Dockpanel和DockContent、Cursor、

一、UserControl类

UserControl 是 .NET 中的一个基类,用于创建自定义控件,主要用于 Windows Forms 和 WPF。通过继承 UserControl,你可以设计和实现具有特定界面和功能的控件组件。UserControl 允许你将多个标准控件组合在一起,并添加自定义行为和事件处理。它支持设计时和运行时的自定义,并且可以像其他控件一样拖放到窗体或页面中。

创建 UserControl 的步骤

  1. 定义控件

    • 创建一个新类,继承自 UserControl
    • 在设计器中添加所需的控件和布局,或在代码中手动添加控件。
  2. 添加自定义功能

    • 编写方法和事件处理程序来定义控件的行为。
    • 添加属性和方法,以便在其他控件或窗体中使用。
  3. 使用控件

    • 在窗体或其他容器控件中实例化并添加 UserControl
    • 设置控件的属性,并处理其事件。

使用案例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestMain
{

    public class PrintPanel2 : UserControl
    {
        private Button _Button;
        private Label _Label;
        public PrintPanel2()
        {
            _Button = new Button();
            _Label = new Label();

            _Button.Text = "点击我吧";
            _Button.Click += Button_Click;
            // 配置标签
            _Label.Text = "Hello, World";
            _Label.Location=new System.Drawing.Point(0,30);

            Controls.Add(_Button);
            Controls.Add(_Label);

            // 配置 UserControl
            this.Size = new System.Drawing.Size(200, 100);
        }

        private void Button_Click(object sender, EventArgs e)
        {
            _Label.Text = "1111";
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // PrintPanel2
            // 
            this.Name = "PrintPanel2";
            this.Size = new System.Drawing.Size(523, 298);
            this.ResumeLayout(false);

        }
    }
    public partial class MainFrom : Form
    {
        private TestMain.PrintPanel2 _PrintPanel;
        public MainFrom()
        {
            _PrintPanel = new TestMain.PrintPanel2();
            _PrintPanel.Dock = DockStyle.Fill;
              this.Controls.Add(_PrintPanel);
        }
    }
}

 

二、Dockpanel和DockContent

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

  • DockContent:代表一个可以被停靠的窗体。
  • DockPanel:用于管理和显示多个 DockContent 实例。

添加库

 添加引用:

using WeifenLuo.WinFormsUI.Docking;

Dockpanel

 public class MyDockPanel : DockPanel
 {
     public MyDockPanel()
     {
         Label _a = new Label();
         _a.Text= "我是MyDockPanel   ";
         Controls.Add( _a );
         this.Size = new System.Drawing.Size(200, 200);

     }
 }

DockContent

  public  class MyDockContent : DockContent
  {
      public MyDockContent()
      {
          this.Text = "Dockable Window!!!!!!!!!!!!!!!!!!!";
      }

      private void InitializeComponent()
      {
          this.SuspendLayout();
          // 
          // MyDockContent
          // 
          this.ClientSize = new System.Drawing.Size(284, 261);
          this.Name = "MyDockContent";
          this.ResumeLayout(false);

      }
  }

 案例1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace TestMain
{
    public  class MyDockContent : DockContent
    {
        public MyDockContent()
        {
            this.Text = "Dockable Window!!!!!!!!!!!!!!!!!!!";
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // MyDockContent
            // 
            this.ClientSize = new System.Drawing.Size(284, 261);
            this.Name = "MyDockContent";
            this.ResumeLayout(false);

        }
    }
    public class MyDockPanel : DockPanel
    {
        public MyDockPanel()
        {
            Label _a = new Label();
            _a.Text= "我是MyDockPanel   ";
            Controls.Add( _a );
            this.Size = new System.Drawing.Size(200, 200);

        }
    }


   public partial class Form2 : Form
    {
        private MyDockPanel _DockPanel;
        public Form2()
        {
            InitializeComponent();
            _DockPanel = new MyDockPanel();
            this.Controls.Add(_DockPanel);
            _DockPanel.Dock =DockStyle.Fill; 

           var _dockContent=new MyDockContent();
            _dockContent.Show(_DockPanel,DockState.DockLeft);

        }
    }
}

案例2: 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace TestMain
{
    public partial class Form3 : DockContent
    {
        public class MyDockContent2 : DockContent
        {
            public MyDockContent2()
            {
                this.Text = "abc!!";
            }
        }
            public class MyDockPanel1 : DockPanel
        {
            public MyDockPanel1()
            {

            }
        }

        private MyDockPanel1 _DockPanel1;
        public Form3()
        {
            InitializeComponent();
            // 初始化 DockPanel
            _DockPanel1 = new MyDockPanel1();
            _DockPanel1.Dock = DockStyle.Fill;
            this.Controls.Add(_DockPanel1);

            // 创建并显示 DockContent
            CreateAndShowDockContents();
        }
        private void CreateAndShowDockContents()
        {
            // 创建不同的 DockContent 实例
            var dockContent1 = new MyDockContent2();
            dockContent1.Text = "Content 1";

            var dockContent2 = new MyDockContent2();
            dockContent2.Text = "Content 2";

            var dockContent3 = new MyDockContent2();
            dockContent3.Text = "Content 3";

            var dockContent4= new MyDockContent2();
            dockContent4.Text = "Content 4";
            // 显示 DockContent 并停靠到不同的位置
            dockContent1.Show(_DockPanel1, DockState.DockLeft);
            dockContent2.Show(_DockPanel1, DockState.DockLeft);
            dockContent3.Show(_DockPanel1, DockState.DockLeft);
            dockContent4.Show(_DockPanel1, DockState.DockLeft);
        }
    }
}

 案例3

添加控件工具

设置停靠

设计子界面:

 

 

 结果:

Code:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;

namespace TestMain
{
    public partial class MainFrm : Form
    {
        Form4 wid1 = new Form4();
        Form4 wid2 = new Form4();
        FromA wid3 = new FromA();
        Form4 wid4 = new Form4();
        FromA wid5 = new FromA();
        Form4 wid6 = new Form4();
        Mav wid7 = new Mav();

        public MainFrm()
        {
            InitializeComponent();
        }

        private void MainFrm_Load(object sender, EventArgs e)
        {
            this.IsMdiContainer = true;

            //改变主题
            //VS2022LightTheme vs2015 = new VS2022LightTheme();
            //dockPanel1.Theme = vs2015;

            //以各种方式停靠
            wid1.Show(dockPanel1, DockState.DockLeft);
            wid2.Show(dockPanel1, DockState.DockRight);
            wid3.Show(dockPanel1, DockState.DockRight);
            wid4.Show(dockPanel1, DockState.Document);
            wid5.Show(dockPanel1, DockState.Document);
            wid6.Show(dockPanel1, DockState.DockBottom);
            wid7.Show(dockPanel1, DockState.Float);

        }
    }
}

三、 Drag&Drop事件

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值