C# UserControl、Dockpanel和DockContent、Cursor、

news2024/12/28 18:34:58

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

基本原理

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+ALT
                e.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))
            {
                //ALT
                e.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))
            {
                //CTRL
                e.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))
            {
                //SHIFT
                e.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.coloradmin.cn/o/2083380.html

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

相关文章

实验室管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户信息管理&#xff0c;教学实验管理&#xff0c;学生签到管理&#xff0c;设备信息管理&#xff0c;设备预约管理&#xff0c;课程表管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统…

【Python数据结构与算法】队列----滑动窗口

题目&#xff1a;滑动窗口 描述 给定一个长度为n&#xff08;n<100,000&#xff09;的整数序列。有一个大小为k(0 < k < n)的滑动窗口从数组的最左端移动到最右端。你可以看到窗口中的k个数。窗口每次向右滑动一个数的距离。 下面是一个例子&#xff1a; 数组是 [1 3…

差分约束问题

差分约束 概念及解法一些题目 概念及解法 引用自OI Wiki 差分约束系统是一种特殊的 n 元一次不等式组&#xff0c;它包含 n 个变量 x 1 , x 2 , … , x n x_1,x_2,\dots,x_n x1​,x2​,…,xn​ 以及 m 个约束条件&#xff0c;每个约束条件是由两个其中的变量做差构成的&#x…

内网安装GitLab

内网安装GitLab 为什么安装GitLab GitHub&#xff08;国外&#xff09;和Gitee&#xff08;国内&#xff09;都是第三方托管平台&#xff0c;不能本地部署&#xff0c;对公网开放&#xff0c;代码保密性不高。 为代码保密性&#xff0c;需在内网搭建代码管理平台。有web操作…

Java设计模式之建造者模式详细讲解和案例示范

引言 在软件开发中&#xff0c;创建复杂对象常常伴随着众多参数和配置&#xff0c;这种情况容易导致“构造函数爆炸”或参数混乱的问题。为了解决这一问题&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09;应运而生。它通过分步骤地构建对象&#xff0c;提供了更…

C++编程:高阶编程

本阶段主要针对泛型编程和STL技术作详细讲解。 1 模板 1.1 模板的概念 C提供一种泛型编程&#xff0c;主要利用模板的技术&#xff0c;模板的目的是提高代码复用性&#xff0c;将类型参数化。 C提供两种模板机制&#xff1a; 函数模板类模板 模板的特点&#xff1a; 模板…

实习结束总结20240828

长达两个月的实习终于在今天结束了&#xff0c;不知怎的&#xff0c;心如止水&#xff0c;没有高兴&#xff0c;没有伤心&#xff0c;毫无波澜的内心甚至让自己都感觉可怕&#xff0c;也许&#xff0c;这就是成长吧。 硬件上&#xff1a; 1.cadence需要继续深入学习&#xff…

Transformers for One-Shot Visual Imitation

发表时间&#xff1a;(CoRL 2020&#xff09; 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4546337571360890881&noteId2424798489658874880 作者单位&#xff1a;Carnegie Mellon University, USA Motivation&#xff1a;人类能够通过推断他们…

每日OJ_牛客_年会抽奖(错排问题)

牛客_年会抽奖&#xff08;错排问题&#xff09; 年会抽奖__牛客网 解析代码 该题为经典的错排问题 用A、B、C……表示写着&#xff4e;位友人名字的信封&#xff0c;a、b、c……表示&#xff4e;份相应的写好的信纸。把错装的总数为记作 D(n)。假设把&#xff41;错装进&…

【ubuntu使用笔记】Ubuntu Desktop 访问SMB共享文件夹

Ubuntu Desktop 访问SMB共享文件夹 Ubuntu Desktop 访问SMB共享文件夹文件夹打开 file managerother location输入 IP地址&#xff0c;smb://IP点击connect按钮正常进入 命令行安装客户端连接 Ubuntu Desktop 访问SMB共享文件夹 文件夹 打开 file manager other location 输入…

WATCH, TRY, LEARN: META-LEARNING FROM DEMONSTRATIONS AND REWARDS

&#xff08;感觉有点从失败中学习的意思&#xff09; 发表时间&#xff1a;30 Jan 2020 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4545005537963171841&noteId2453371997770644736 作者单位&#xff1a;UC Berkeley Motivation&#xff1a…

2024年高教社杯全国大学生数学建模竞赛

2024年高教社杯全国大学生数学建模竞赛通知 2024数模比赛确定时间为&#xff1a;9月5日18时至9月8日20时 报名截止日期&#xff1a;9月2日&#xff08;周一&#xff09;20时

使用maven 实现版本覆盖案例4【经典版】

一 原理介绍 1.1 原理逻辑 关系图&#xff1a;从使用方xinxiang_demo中引用A_parent的2.13的版本的层级要比B_Module继承A_parent&#xff1a;1.1 版本的层级要短&#xff0c;优先级更高&#xff0c;所以使用2.13&#xff0c;将B_Module继承A_parent 1.1 版本覆盖。 1.2 实操…

约 数个数

对于一个数 其中&#xff1a;是的各个质因数&#xff0c;上式是的质因数乘积式。 约数个数&#xff1a; 约数之和&#xff1a; step1&#xff1a; 采用分解质因数的方法&#xff0c;计算出的每一个质因数的次数 &#xff08;分解质因数的blog&#xff1a;http://t.csdni…

Kali学习(ms17-010、ms08-067漏洞复现)

目录 一、kali网络设置 NAT模式、桥接上网/仅主机 VMnet0、VMnet1、VMnet8 1.NAT模式 VMnet8 &#xff08;1&#xff09;检查服务 &#xff08;2&#xff09;创建虚拟网卡 &#xff08;3&#xff09;创建kali的网卡信息 &#xff08;4&#xff09;验证 2.桥接模式 VMn…

结果一。5.be doing表将来和 表 will的区别

be doing 表⽰近期、眼下就要发⽣的事情; will 表⽰将来的时间,则较远⼀些。如: He is going to write a letter tonight.He will write a book 。 be going to 表⽰根据主观判断将来肯定发⽣的事情。 will+ 动词原形表⽰⼀般将来时。 will ࿰

如何用Java SpringBoot+Vue打造高效产品订单管理系统?

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【C++ Primer Plus习题】6.9

问题: 解答: #include <iostream> #include <string> #include <fstream> using namespace std;typedef struct _Donor {string name;double money; }Donor;int main() {ifstream file;string filename;int count 0;cout << "请输入文件名:&quo…

PDF合并可以如此简单?!这3种方法,简单又实用!

在日常的忙碌与学习中&#xff0c;我们时常需要将散落的PDF文件整合成一份完整的文档&#xff0c;无论是为了整理报告、汇编学习资料&#xff0c;还是为了提升阅读效率&#xff0c;PDF合并都显得尤为重要。 今天&#xff0c;就让我带你解锁三种既简单又高效的PDF合并方法&#…