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事件

基本原理

1,DragDrop:在完成拖放到目标操作时发生。(接收方)
2,DragEnter:在将对象拖入目标控件的边界时发生。(接收方)
3,DragLeave:在将对象拖出目标控件的边界时或鼠标抬起事件发生。(接收方)
4,DragOver拖动到目标控件的边界里面就发生(接收方)
5,DoDragDrop开始拖放操作。(拖动方)
6,GiveFeedback在执行拖动操作期间发生-鼠标按下并拖动的时候发生(拖动方)
7,QueryContinueDrag:在拖放操作期间发生,并且允许拖动源确定是否应取消拖放操作。(拖动方)

鼠标拖动原始控件

鼠标拖动到目标控件

 

 

 

 案例一

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 static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskbarClock;namespace TestMain
{public partial class BaseFrm : Form{private Rectangle dragBox;public BaseFrm(){InitializeComponent();}/// <summary>/// /// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label1_GiveFeedback(object sender, GiveFeedbackEventArgs e){DateTime time = DateTime.Now;// listBox1.Items.Add(time.ToString() +"    拖动方  -    label1_GiveFeedback 发生");}/// <summary>///   鼠标按下功能/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label1_MouseDown(object sender, MouseEventArgs e){// DateTime time = DateTime.Now;//  listBox1.Items.Add(time.ToString() + "    abel1_MouseDown   鼠标按下功能  发生");dragBox = new Rectangle(new Point(e.X - (SystemInformation.DragSize.Width / 2),e.Y - (SystemInformation.DragSize.Height / 2)), SystemInformation.DragSize);}/// <summary>/// 鼠标移动事件发生/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label1_MouseMove(object sender, MouseEventArgs e){//listBox1.Items.Add("label1_MouseMove   鼠标移动事件发生 发生");if ((e.Button & MouseButtons.Left) == MouseButtons.Left)   // 左键{if (dragBox != Rectangle.Empty && !dragBox.Contains(e.X, e.Y)){var effect = label1.DoDragDrop(label1.Text, DragDropEffects.All | DragDropEffects.Link);if (effect == DragDropEffects.Move)label1.Text = "";}}}/// <summary>///  鼠标抬起事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label1_MouseUp(object sender, MouseEventArgs e){// listBox1.Items.Add("label1_MouseUp   鼠标抬起事件  发生");dragBox = Rectangle.Empty;}/// <summary>///    点击/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label3_Click(object sender, EventArgs e){DateTime time = DateTime.Now;listBox1.Items.Add(time.ToString() + "    接收方  -    label3_Click   发生");}/// <summary>/// /// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label3_DragDrop(object sender, DragEventArgs e){DateTime time = DateTime.Now;//复杂label3.Text = time.ToString()+ " :          "+$"{e.Effect}:{(string)e.Data.GetData(typeof(string))}";listBox1.Items.Add(time.ToString() + "    接收方  -    label3_DragDrop   发生-----已经完成了拖动11111111111111");  }/// <summary>/// /// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label3_DragEnter(object sender, DragEventArgs e){DateTime time = DateTime.Now;listBox1.Items.Add(time.ToString() + "    接收方  -    label3_DragEnter   发生   已经进入接受方界面了");}/// <summary>/// /// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void label3_DragOver(object sender, DragEventArgs e){DateTime time = DateTime.Now;if ((e.AllowedEffect & DragDropEffects.None) == DragDropEffects.None    && (e.KeyState & (8 + 32)) == (8 + 32)){//CTRL+ALTe.Effect = DragDropEffects.None;label2.Text = $"按键状态:CTRL+ALT\r\n效果:None";listBox1.Items.Add(time.ToString() + "    接收方  -  label3_DragOver发生  2222222 ");}else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link&& (e.KeyState & (32)) == (32)){//ALTe.Effect = DragDropEffects.Link;label2.Text = $"按键状态:ALT\r\n效果:Link";listBox1.Items.Add(time.ToString() + "    接收方  -  label3_DragOver发生  333333333 ");}else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy && (e.KeyState & (8)) == (8)){//CTRLe.Effect = DragDropEffects.Copy;label2.Text = $"按键状态:CTRL+ALT\r\n效果:Copy";listBox1.Items.Add(time.ToString() + "    接收方  -  label3_DragOver发生  44444444 ");}else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move   && (e.KeyState & (4)) == (4)){//SHIFTe.Effect = DragDropEffects.Move;label2.Text = $"按键状态:SHIFT\r\n效果:Move";}else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy){listBox1.Items.Add(time.ToString() + "    接收方  -  label3_DragOver发生  ###### ");//无e.Effect = DragDropEffects.Copy;label2.Text = $"按键状态:无\r\n效果:Copy";}else{e.Effect = DragDropEffects.None;label2.Text = $"按键状态:无\r\n效果:None";listBox1.Items.Add(time.ToString() + "    接收方  -  label3_DragOver发生  5555 ");}}private void label1_MouseLeave(object sender, EventArgs e){DateTime time = DateTime.Now;listBox1.Items.Add(time.ToString() + "    拖动方  - 鼠标已经   label1_MouseLeave   发生   已经出了拖出方界面了");}private void label3_DragLeave(object sender, EventArgs e){DateTime time = DateTime.Now;listBox1.Items.Add(time.ToString() + "    接收方  - 鼠标已经   label3_DragLeave   发生   已经出了接收方界面了或者鼠标抬起了");}}
}

案例二

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设备共享租赁小程序系统开发制作方案

设备共享租赁小程序系统让用户方便地租赁或出租各类设备&#xff0c;包括但不限于工具、电子产品、运动器材等&#xff0c;以满足临时使用需求&#xff0c;同时为设备所有者创造额外收益。 目标用户 个人用户&#xff1a;需要临时使用工具、车辆等设备的个人。 企业用户&#…

73 OSPF图解LSA(华三)

71 OSPF多区域实验(华三)-CSDN博客文章浏览阅读166次,点赞8次,收藏3次。实操https://blog.csdn.net/qq_56248592/article/details/141563010?spm=1001.2014.3001.5501 一 基础配置省略 上次的原图基础上扩展

C++ JAVA源码 HMAC计算 openssl 消息认证码计算 https消息防篡改 通信安全

签名和验签 把所有消息按顺序合并成一条信息&#xff0c;对这个信息用密钥进行签名。 签名信息通过 HTTP 头 Sign 传递&#xff0c;没有携带签名或者签名验证不通过的请求&#xff0c;将会被认为异常请求&#xff0c;并返回相应 code 码。 校验方法&#xff1a;根据 http请求…

重塑视频监控体验:WebRTC技术如何赋能智慧工厂视频高效管理场景

视频汇聚EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。 EasyCVR平台不仅兼容多种主流标准协议及私有协议/SDK的接入&#xff08;如&…

mysql高可用之组复制 (MGR)

目录 1 MySQL的主从复制介绍 2 组复制流程 3 组复制单主和多主模式 3.1 single-primary mode(单写或单主模式) 3.2 multi-primary mode(多写或多主模式) 4 实现mysql组复制 4.1 MASTER 1 4.2 MASTER 2 4.3 MASTER 3 4.4 MASTER 1 检验 1 MySQL的主从复制介绍 MySQL Group Rep…

【Linux】初步识操作系统

linux专栏&#xff1a;《Linux入门系列》 系列文章&#xff1a;gdb-调试器初入门&#xff08;简单版使用&#xff09; 编辑器vim入门&#xff08;概念模式转换技巧&#xff09; 目录 1. 概念 2. 设计操作系统的目的 3. 定位&#xff1a;操作系统负责管理 4. 如何理解管理 …

使用IntelliJ IDEA将本地项目推送到远程Git

1&#xff0c;安装Git 打开 下载地址&#xff0c;下载Git安装包。根据引导程序&#xff0c;完成安装。 2&#xff0c;IntelliJ IDEA配置Git 打开IntelliJ IDEA&#xff0c;依次点击File>>Settings…>>Git&#xff0c;然后配置自己的Git的路径&#xff0c;然后点…

mysql 死锁 锁表的解决方法

查看那个表锁了 SHOW OPEN TABLES where In_use > 0; show processlist SELECT * FROM information_schema.INNODB_TRX; 查看锁的进程 kill 掉进程id (trx_mysql_thread_id)

PCIE-Precode

Transmitter Precode Request: Precoding可以有效的降低Burst errors&#xff08;突发连续&#xff09;的影响&#xff0c;但是Bit Error Rate&#xff08;BER&#xff09;将上升为之前的两倍. ​​​​​​[FPGA 实现及PCIe IP 核知识点] PCIe为什么要增加Precoding&#xff…

趣味算法------拯救阿拉德大陆

目录 ​编辑 题目描述&#xff1a; 思路解析&#xff1a; 具体代码&#xff1a; 总结&#xff1a; 题目描述&#xff1a; 此时一批勇士也随之而来&#xff0c;但其能力也是参差不齐&#xff0c;我们需要挑选出最优秀的勇士来守护这片大陆。每位勇士都有属于自己的编号&am…

网络安全售前入门04——审计类产品了解

目录 1.前言 2.数据库审计介绍 2.1产品架构功能 2.2应用场景 2.3部署形式 2.4产品价值 2.5选型依据 1.前言 为方便初接触网络安全售前工作的小伙伴了解网安行业情况,我制作一系统售前入门(安全产品,安全服务,法律法规等)文章介绍,希望能给初进网安职场的小伙伴提供…

上书房信息咨询:医疗满意度调研

随着人们生活水平的不断提高&#xff0c;医疗服务的需求日益增长。近期&#xff0c;上书房信息咨询受托完成了某市医疗市场的满意度调研&#xff0c;旨在深入了解市民对医疗服务的评价和需求&#xff0c;为提升医疗服务质量提供有力支持。 近年来&#xff0c;某市致力于推进医…

国产游戏技术能否引领全球

目录 1.概述 1.1.面临的挑战 1.2.机遇 1.3.IT技术创新如何推动行业发展 2.技术解析 2.1.图形渲染技术 2.2.物理引擎 2.3.人工智能 (AI) 3.行业影响 3.1.对国内游戏开发行业的影响 3.2.IT人才需求变化 3.3.技术发展方向 4.未来展望 4.1. 发展前景 4.2. IT技术人员…

分布式基础理论——CAP理论和BASE理论

文章目录 CAP 理论BASE 理论参考资料 CAP 理论 CAP定理&#xff08;CAP theorem&#xff09;指出&#xff0c;在分布式系统中&#xff0c;设计读写操作时只能同时满足以下三个特性中的两个&#xff1a; 一致性&#xff08;Consistency&#xff09; : 所有节点访问同一份最新的…

用于目标说话人提取的统一视听线索

第二章 目标说话人提取之《Unified Audio Visual Cues for Target Speaker Extraction 》 文章目录 前言一、任务二、动机三、挑战四、方法1.总体架构2.tes网络3. 融合网络4.损失函数 五、实验评价1.数据集2.消融实验3.客观评价4.主观评价 六、结论七、知识小结 前言 语音新手…

93.WEB渗透测试-信息收集-Google语法(7)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;92.WEB渗透测试-信息收集-Google语法&#xff08;6&#xff09; • intext • intext 的作…

[数据集][目标检测]电力场景输电线导线散股检测数据集VOC+YOLO格式3890张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3890 标注数量(xml文件个数)&#xff1a;3890 标注数量(txt文件个数)&#xff1a;3890 标注…

亲测好用,吐血整理 ChatGPT 3.5/4.0 新手使用手册~ 【2024年9月 更新】

废话不多说&#xff0c;直接分享正文~ 以下是小编为大家搜集到的最新的ChatGPT国内站&#xff0c;各有优缺点。 1、AI Plus&#xff08;稳定使用&#xff09; 推荐指数&#xff1a;⭐⭐⭐⭐⭐ yixiaai.com 该网站已经稳定运营了1年多了。2023年3月份第一批上线的网…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册&#xff1a;•一旦使用 signal 函数注册了信号处理函数&#xff0c;该函数就会一直有效&#xff0c;直到程序结束或者显式地取消注册。2. 注册多次的影响&#xff1a;•如果多次注册同一信号的处理函数&#xff0c;最后一次注册的…

PHP软件下载-安装-环境配置

.1.下载 下载地址如下 windows.php.net - /downloads/releases/ 安装包如下. .2.安装 可以在D盘或者E盘的根目录创建一个自定义目录。注意文件夹目录中不能包含中文&#xff0c;不能包含空格等特殊字符。 版本说明&#xff1a; (1)ts表示非线程安全版本。这个安装包还指明了…