当前位置: 首页 > news >正文

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);// 配置 UserControlthis.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);// 创建并显示 DockContentCreateAndShowDockContents();}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事件


http://www.mrgr.cn/news/9034.html

相关文章:

  • How to stream video in a loop via RTP using ffmpeg?
  • docke进阶---镜像迁移、容器的ip地址、端口映射和持久化
  • java socket通讯
  • 下载官方llama
  • UE管理内容 —— FBX Scene Import
  • Java面试题--JVM大厂篇之JVM大厂面试题及答案解析(4)
  • 多人协作开发git merge合并功能出现冲突时解决思路
  • 徐州服务器租用:高防服务器的用途有哪些?
  • MySQL 高阶三 (索引性能分析)
  • centos 服务器之间实现免密登录
  • 数学建模学习(122):基于PPF-AHP的多准则决策分析—以城市交通枢纽选址为例
  • 数据结构的顺序表的学习
  • Ai+若依(系统接口--Swagger):04篇
  • 回零及编码器
  • 斗破C++编程入门系列之十六:C++程序设计必知:类的静态成员(九星斗者)彩蛋
  • 哈希环算法(C语言版本)
  • selenium-java实现自动登录跳转页面
  • 【日记】狗尾巴草与暗恋(1519 字)
  • java调用阿里大模型服务平台百炼
  • 【吊打面试官系列-Memcached面试题】什么是二进制协议,我该关注吗?