c#可以创建任意控件的拖动方法

  1. 标准的拖放流程
    首先,需要在窗体上放置一个容器控件,比如Panel或者GroupBox,在这个容器控件上,就可以进行拖放了,具体的代码流程如下:
private void panel1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(Button)))
        e.Effect = DragDropEffects.Move;
    else
        e.Effect = DragDropEffects.None;
}

private void panel1_DragDrop(object sender, DragEventArgs e)
{
    Button btn = e.Data.GetData(typeof(Button)) as Button;
    if (btn != null)
    {
        this.panel1.Controls.Add(btn);
        btn.Location = this.panel1.PointToClient(new Point(e.X, e.Y));
    }
}

这里我们使用Panel作为容器控件,可以看到,当鼠标进入控件区域时,会触发DragEnter事件,我们可以在这个事件中判断拖入的数据类型是否为Button类型,如果是,则设置拖放效果为Move,否则为None;当鼠标放开时,会触发DragDrop事件,我们可以从数据中获取被拖动的控件,然后将其添加到容器中,设置其位置为鼠标放开的位置。

  1. 动态创建控件并实现拖放
    除了容器控件,我们也可以动态创建控件,然后实现拖放,代码如下:
private void button1_MouseDown(object sender, MouseEventArgs e)
{
    Button btn = new Button();
    btn.Text = "New Button";
    btn.Size = new System.Drawing.Size(80, 30);
    btn.BackColor = Color.LightBlue;
    btn.MouseDown += new MouseEventHandler(Button_MouseDown);
    this.Controls.Add(btn);
    btn.DoDragDrop(btn, DragDropEffects.Move);
}

private void Button_MouseDown(object sender, MouseEventArgs e)
{
    Button btn = sender as Button;
    if (e.Button == MouseButtons.Left)
        btn.DoDragDrop(btn, DragDropEffects.Move);
}

private void panel1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(Button)))
        e.Effect = DragDropEffects.Move;
    else
        e.Effect = DragDropEffects.None;
}

private void panel1_DragDrop(object sender, DragEventArgs e)
{
    Button btn = e.Data.GetData(typeof(Button)) as Button;
    if (btn != null)
    {
        btn.Parent.Controls.Remove(btn);
        this.panel1.Controls.Add(btn);
        btn.Location = this.panel1.PointToClient(new Point(e.X, e.Y));
    }
}

这里,我们在Button的MouseDown事件中添加了拖放事件,当鼠标按下后,会创建一个控件,并将其设置为数据源,然后进行拖放操作。在拖放目标容器的DragDrop事件中,同样可以获取到被拖动的控件,然后将其从原来的容器中移除,添加到拖放目标容器中。这里需要注意的是,添加控件的时候,需要将其Parent设置为目标容器。

以上是c#创建任意控件的拖动方法的核心代码,具体的实现方式可以根据需求进行扩展和变化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#可以创建任意控件的拖动方法 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Android 自定义星评空间示例代码

    Android 自定义星评空间示例代码攻略 本文将详细讲解自定义星评空间示例代码的实现过程。星评空间可以用于用户评分等场景,采用自定义控件实现,较为灵活。具体步骤如下: 1.设计界面和布局 首先,需要在Android Studio中新建一个布局文件,设计星级评分控件的UI界面。依据需求,可以添加TextView、ImageView等视图。其中,TextVie…

    other 2023年6月25日
    00
  • iis中为每个应用程序池单独设置aspnet.config配置文件

    为每个应用程序池单独设置aspnet.config配置文件可以为我们提供更大的灵活性,以满足特定应用程序池的需求。下面是设置aspnet.config配置文件的完整攻略,包括两条示例说明。 一、创建aspnet.config文件 将Web应用程序池分配给您想要创建aspnet.config文件的应用程序。 在Web应用程序根目录中创建aspnet.confi…

    other 2023年6月25日
    00
  • swift调用oc方法

    当然,我可以为您提供有关“Swift调用OC方法”的完整攻略,以下是详细说明: Swift调用OC方法 在Swift中,可以通过桥接文件(Bridging Header)来调用OC方法。桥接文件是一个,用于将Swift代码和OC代码连接起来。以下是详细步骤: 创建桥文件 在Swift项目中,创建一个名“项目名]-Bridging-Header.h”的头文件,…

    other 2023年5月7日
    00
  • Python通过递归获取目录下指定文件代码实例

    针对如何通过递归获取目录下指定文件,使用Python实现的攻略,我将从以下几个方面进行详细讲解: 概述递归获取目录下指定文件的原理 讲解代码实现过程,包括递归函数的构建和文件匹配逻辑 提供2个具体的代码示例说明 1. 概述递归获取目录下指定文件的原理 递归获取目录下指定文件的原理是通过对目标文件夹进行递归遍历,将遍历到的每个子文件夹都作为目标文件夹递归处理,…

    other 2023年6月27日
    00
  • C sharp #001# hello world

    C Sharp #001# Hello World 在学习C#(C Sharp)编程语言时,第一个练习通常就是使用控制台打印出“Hello World”这个经典的字符串。本文将介绍如何使用C#实现这个简单的程序。 准备工作 在开始编写程序之前,需要先安装并配置好C#编程环境。我们推荐使用Visual Studio IDE(集成开发环境),它可以为你提供基本的…

    其他 2023年3月28日
    00
  • 浅谈mysql中concat函数,mysql在字段前/后增加字符串

    下面我将详细讲解“浅谈mysql中concat函数,mysql在字段前/后增加字符串”的完整攻略。 一、concat函数简介 concat函数是MySQL中常用的字符串函数之一,用于将多个字符串拼接为一个字符串。其语法如下: concat(str1,str2,…) 其中,str1、str2等表示要拼接的字符串,可以是常量,也可以是表中的字段。 示例1: …

    other 2023年6月25日
    00
  • pushgateway介绍

    以下是关于Pushgateway的介绍的完整攻略: 什么是Pushgateway? Pushgateway是一个开源的Prometheus生态系统组件,用于接收来自短期作业的指标数据。它允许您将指标数据推送到Prometheus服务器,而不是等待Prometheus服务器拉取数据。这对于短期作业(如批处理作业或临时服务)非常有用,因为它们可能不会一直运行,因…

    other 2023年5月6日
    00
  • Android自定义日历效果

    Android自定义日历效果攻略 在Android中,自定义日历效果可以通过自定义控件实现,主要包括以下几个步骤: 步骤一:选择实现方式 实现方式主要有两种: 自定义View,继承View或ViewGroup类,通过手动绘制日历视图来达到自定义效果; 使用第三方控件库,例如CalendarView、SmartCalendar等。 选择实现方式的时候需要考虑具…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部