【问题标题】:Moving a control by dragging it with the mouse in C#在 C# 中通过鼠标拖动来移动控件
【发布时间】:2013-04-29 09:23:33
【问题描述】:

我试图通过拖动来移动名为pictureBox1 的控件。问题是,当它移动时,它会不断从鼠标周围的一个位置移动到另一个位置,但它确实跟随它...... 这是我的代码。如果您能帮助我,我将不胜感激

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    bool selected = false;
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        selected = true;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (selected == true)
        {
            pictureBox1.Location = e.Location;
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        selected = false;
    }

}

【问题讨论】:

    标签: c# location picturebox mousedown movable


    【解决方案1】:

    所有你需要的:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
    
        private Point MouseDownLocation;
    
    
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                MouseDownLocation = e.Location;
            }
        }
    
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                pictureBox1.Left = e.X + pictureBox1.Left - MouseDownLocation.X;
                pictureBox1.Top = e.Y + pictureBox1.Top - MouseDownLocation.Y;
            }
        }
    
    }
    

    【讨论】:

    • @TurmDrummer 你应该在这个网站上使用英语(至少尝试)让其他用户理解你。相关讨论:meta.stackexchange.com/questions/118678/…
    • 对不起,我没有意识到我用德语写了我的评论。有时我不知道我在用哪种语言交流。我的问题是,既然您似乎对这种 UI 代码有很好的了解,您是否知道如何使拖动控件的移动稍微平滑一点?如果这种实现方式没有实际的解决方案,我宁愿坚持你的方法,因为我发现的其他解决方案通常写得不好、有缺陷或不切实际,而你的解决方案现在运行良好。
    • @TurmDrummer 即使我对此很了解(我没有),即使我知道你在问什么(我没有),为什么不您创建了一个新问题?
    • pictureBox1.Left = (-1 * e.X) + pictureBox1.Left + MouseDownLocation.X;如果有人需要反向滚动。
    • 非常感谢astef,喜欢这个答案,为我节省了很多时间。我通过强制转换发送方使控件的 MouseMove 通用,因此我可以对多个控件使用相同的代码,MouseDown 已经适用于多个控件。控制控制=(控制)发送者; control.Left = e.X + control.Left - MouseDownLocation.X; control.Top = e.Y + control.Top - MouseDownLocation.Y;
    【解决方案2】:

    你也可以使用扩展:

    public static class CmponentsExtensions
    {
      //Management of mouse drag and drop
        #region Menu and Mouse
        private static bool mouseDown;
        private static Point lastLocation;
    
        /// <summary>
        /// To enable control to be moved around with mouse
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="control"></param>
        public static void moveItselfWithMouse<T>(this T control) where T: Control
        { 
            control.MouseDown += (o, e)=> { mouseDown = true; lastLocation = e.Location; };
            control.MouseMove += (o, e) => 
            {
                if (mouseDown)
                {
                    control.Location = new Point((control.Location.X - lastLocation.X) + e.X, (control.Location.Y - lastLocation.Y) + e.Y);
                    control.Update();
                }
            };
            control.MouseUp += (o, e) => { mouseDown = false; } ;
        }
    
    
        public static void moveOtherWithMouse<T>(this T control, Control movedObject) where T : Control
        {
            control.MouseDown += (o, e) => { mouseDown = true; lastLocation = e.Location; };
            control.MouseMove += (o, e) =>
            {
                if (mouseDown)
                { 
                    movedObject.Location = new Point((movedObject.Location.X - lastLocation.X) + e.X, (movedObject.Location.Y - lastLocation.Y) + e.Y);
                    movedObject.Update();
                }
            };
            control.MouseUp += (o, e) => { mouseDown = false; };
        }
    
        #endregion
    }
    

    那么你需要通过一些控制来使用它:

    在这种情况下,pictureBox1 移动了整个表单

    pictureBox1.moveOtherWithMouse(this);
    

    在这种情况下,您只移动图片框:

    pictureBox1.moveItselfWithMouse();
    

    【讨论】:

    • @PawwlWojda e 和 control 都没有 Location 作为属性。
    • SezMe 你使用的是 Windows 窗体还是 WPF??
    【解决方案3】:

    尝试在运行时使用鼠标移动图片框控件

     private void pictureBox7_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    xPos = e.X;
                    yPos = e.Y;
                }
            }
    
            private void pictureBox7_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                PictureBox p = sender as PictureBox;
    
                if (p != null)
                {
                    if (e.Button == MouseButtons.Left)
                    {
                        p.Top += (e.Y - yPos);
                        p.Left += (e.X - xPos);
                    }
                }
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多