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.rhkb.cn/news/412751.html

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

相关文章

网络层 III(划分子网和构造超网)【★★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、网络层转发分组的过程 分组转发都是基于目的主机所在网络的&#xff0c;这是因为互联网上的网络数远小于主机数&#xff0c;这样可以极大地压缩转发表的大小。…

C++和QT

引用 概念 引用是个别名 格式 数据类型 &引用名 同类型的变量名 &#xff08;&引用符号&#xff09; 数据类型 &引用名 同类型的变量名 &#xff08;&引用符号&#xff09;int a 10;int &b a; //给a取个别名叫b, b引用a 数组引用 int a;a10;int &…

【AI绘画】Midjourney前置指令/describe、/shorten详解

文章目录 &#x1f4af;前言&#x1f4af;Midjourney前置指令/describe使用方法1️⃣2️⃣3️⃣4️⃣&#xff08;选择对应提示词生成图片&#xff09;&#x1f504;&#xff08;重新识别生成提示词&#xff09;&#x1f389;Imagine all&#xff08;一次性生成所有&#xff09…

BERT:Pre-training of Deep Bidirectional Transformers forLanguage Understanding

个人觉着BERT是一篇读起来很爽的论文 摘要 我们引入了一种新的语言表示模型BERT&#xff0c;它代表Bidirectional Encoder Representations from Transformers。与最近的语言表示模型不同(Peters et al.&#xff0c; 2018a;Radford et al.&#xff0c; 2018)&#xff0c; BER…

Prometheus+Grafana的安装和入门

概念 什么是Prometheus? Prometheus受启发于Google的Brogmon监控系统&#xff08;相似kubernetes是从Brog系统演变而来&#xff09;&#xff0c; 从2012年开始由google工程师Soundclouds使用Go语言开发的开源监控报警系统和时序列数据库(TSDB)。&#xff0c;并且与2015年早起…

使用LinkedHashMap实现固定大小的LRU缓存

使用LinkedHashMap实现固定大小的LRU缓存 1. 什么是LRU&#xff1f; LRU是"Least Recently Used"的缩写&#xff0c;意为"最近最少使用"。LRU缓存是一种常用的缓存淘汰算法&#xff0c;它的核心思想是&#xff1a;当缓存满时&#xff0c;优先淘汰最近最少…

18959 二叉树的之字形遍历

### 思路 1. **输入读取**&#xff1a; - 读取输入字符串&#xff0c;表示完全二叉树的顺序存储结构。 2. **构建二叉树**&#xff1a; - 使用队列构建二叉树&#xff0c;按层次顺序插入节点。 3. **之字形层序遍历**&#xff1a; - 使用双端队列进行层序遍历&…

【开端】基于nginx部署的具有网关的web日志分析

一、绪论 基于nginx部署的具有网关的web日志分析&#xff0c;我们可以分析的日志有nginx的access.log &#xff0c;网关的日志和应用的日志 二、日志分析 1、nginx日志 参数 说明 示例 $remote_addr 客户端地址 172.17.0.1 $remote_user 客户端用户名称 -- $time_lo…

简化WPF开发:CommunityToolkit.Mvvm在MVVM架构中的实践与优势

文章目录 前言一、CommunityToolkit.Mvvm1.特点2.优点3.缺点 二、WPF项目应用1.引入到 WPF 项目2.使用示例 总结 前言 CommunityToolkit.Mvvm 是 Microsoft 提供的一个社区工具包&#xff0c;专为 MVVM&#xff08;Model-View-ViewModel&#xff09;模式设计&#xff0c;旨在帮…

RabbitMQ练习(Topics)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考&#xff1a;《RabbitMQ练习&#xff08;Hello World&#xff09;》和《RabbitMQ练习&#xff08;Work Queues&#xff09;》。 确保RabbitMQ、Sender、Receiver、Receiver2容器…

“重启就能解决一切问题”,iPhone重启方法大揭秘

随着iPhone不断更新换代&#xff0c;其设计与操作方式也在不断进化。从最初的实体Home键到如今的全面屏设计&#xff0c;iPhone的操作逻辑也随之发生了改变。 对于那些习惯了传统安卓手机操作的用户来说&#xff0c;iPhone的重启方式可能会显得有些不同寻常。下面我们就来一起…

SQL血缘解析

Druid 作为使用率特别高的的数据库连接池工具,在具备完善的连接池管理功能外,同时Druid 的 SQL解析功能可以用来防止 SQL注入等安全风险。通过对 SQL 语句进行解析和检查,Druid 可以识别并阻止潜在的恶意 SQL 语句执行,黑名单(阻止特定的 SQL 语句执行)、白名单(仅允许特…

★ 算法OJ题 ★ 力扣11 - 盛水最多的容器

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--盛水最多的容器~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 解法1&#xff1a;暴力枚举 …

文本数据分析-(TF-IDF)(1)

文章目录 一、TF-IDF简介1.意义2.TF与IDF1).TF&#xff08;Term Frequency&#xff09;2).IDF&#xff08;Inverse Document Frequency&#xff09;3).TF-IDF 二、应用三、代码实现1.文件读取2.数据预处理3.排序和输出4.全部代码 一、TF-IDF简介 1.意义 TF-IDF&#xff08;Te…

28 TreeView组件

Tkinter ttk.Treeview 组件使用指南 ttk.Treeview 是 Tkinter 的一个高级控件&#xff0c;用于显示和管理层次化数据。它类似于电子表格或列表视图&#xff0c;但提供了更丰富的功能&#xff0c;如可展开的节点、多列显示等。ttk 模块是 Tkinter 的一个扩展&#xff0c;提供了…

Golang | Leetcode Golang题解之第382题链表随机节点

题目&#xff1a; 题解&#xff1a; type Solution struct {head *ListNode }func Constructor(head *ListNode) Solution {return Solution{head} }func (s *Solution) GetRandom() (ans int) {for node, i : s.head, 1; node ! nil; node node.Next {if rand.Intn(i) 0 { …

《机器学习》数据分析之关键词提取、TF-IDF、项目实现 <下>

目录 一、内容回顾 1、核心算法 2、算法公式 3、拆分文本 二、再次操作 1、取出每一卷的地址和内容 得到下列结果&#xff1a;&#xff08;此为DF类型&#xff09; 2、对每一篇文章进行分词 3、计算TF-IDF值 得到以下数据&#xff1a; 三、总结 1、关键词提取 1&a…

数据挖掘之分类算法

分类算法是数据挖掘中常用的一类算法&#xff0c;其主要任务是根据已知的训练数据&#xff08;即带有标签的数据&#xff09;构建模型&#xff0c;然后利用该模型对新的数据进行分类。分类算法广泛应用于金融、医疗、市场营销等领域&#xff0c;用于预测、决策支持等任务。以下…

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压&#xff1a;PC0、PA1和PA2。本测试将ADC1_IN6映射到PC0引脚&#xff0c;ADC12_IN2映射到PA1引脚&#xff0c;ADC1_IN3映射到PA2引脚。 1、ADC输入 ADC输入电压范围&#xff1a;Vref– ≤ VIN ≤ Vref ADC支持“单端输入…

Java 集合Collection(List、Set)Map

集合的理解和优点 1)可以动态保存任意多个对象&#xff0c;使用比较方便!2)提供了一系列方便的操作对象的方法: add、remove、 set、 get等3)使用集合添加,删除新元素的示意代码- Java集合的分类 Java的集合类很多&#xff0c;主要分为两大类&#xff0c;如图&#xff1a; 1…