C#WinForms:通过拖动子PictureBox控件拖放父控件

时间:2018-03-14 00:41:53

标签: c# winforms user-controls mouseevent parent-child

注意:问题标题和文字已更改。我意识到我已经为我的需求提出了错误的问题。

我遇到了一个无法解决的问题。我在用户控件上有一个picturebox:

PictureBox (pbxMoveIt) on a User Control

单击父级允许我拖动整个控件(我可以单击并将其拖动到WinForm上的任何位置)。

我需要能够通过单击并拖动图片框(子控件)来拖动父控件。

永远不应在父控件中移动图片框。单击子控件并拖动需要移动父控件和子控件,而不更改它们在父控件中的位置。

我试过把我在网上看到的东西放在一起,但我错过了一些东西。 下面的代码在WinForm中有单独的事件,用于处理用户控件和用户控件的子项。

public partial class frmMain : Form {

    private Point m_MouseDownLocation;
    private bool m_IsDragging;
    public frmMain ( ) {
        InitializeComponent ( );

        suc1.MouseDown += SimpleUserControl_MouseDown;
        suc1.MouseMove += SimpleUserControl_MouseMove;
        suc1.MouseUp += SimpleUserControl_MouseUp;
        suc1.PbxMoveIt.MouseDown += SimpleUserChildControl_MouseDown;
        suc1.PbxMoveIt.MouseMove += SimpleUserChildControl_MouseMove;
        suc1.PbxMoveIt.MouseUp += SimpleUserChildControl_MouseUp;
    }

    #region SimpleUserControl Related
    private void SimpleUserControl_MouseDown ( object sender, MouseEventArgs e ) {
        if ( e.Button == MouseButtons.Left ) {
            m_MouseDownLocation = e.Location;
            m_IsDragging = true;
            suc1.DisableButton ( );
        }
    }
    private void SimpleUserControl_MouseMove ( object sender, MouseEventArgs e ) {
        int newX;
        int newY;
        int minX = 10;
        int minY = 10;
        int maxX = this.Width - (25 + suc1.Width);
        int maxY = this.Height - (45 + suc1.Height);
        if ( e.Button == MouseButtons.Left ) {
            newX = e.X + suc1.Left - m_MouseDownLocation.X;
            newY = e.Y + suc1.Top - m_MouseDownLocation.Y;
            if ( m_IsDragging ) {
                if ( ( newX >= minX ) && ( newX <= maxX ) ) {
                    suc1.Left = newX;
                }
                if ( ( newY >= minY ) && ( newY <= maxY ) ) {
                    suc1.Top = newY;
                }
            }
        }
    }

    private void SimpleUserControl_MouseUp ( object sender, MouseEventArgs e ) {
        if ( e.Button == MouseButtons.Left ) {
            m_IsDragging = false;
            suc1.EnableButton ( );
        }
    }
    #endregion

    #region Simple User Child Control Related
    private void SimpleUserChildControl_MouseDown ( object sender, MouseEventArgs e ) {
        SimpleUserControl useThis = (SimpleUserControl)((Control)sender).Parent;
        if ( e.Button == MouseButtons.Left ) {
            m_MouseDownLocation = e.Location;
            m_IsDragging = true;
            useThis.DisableButton ( );
        }
    }
    private void SimpleUserChildControl_MouseMove ( object sender, MouseEventArgs e ) {
        SimpleUserControl useThis = (SimpleUserControl)((Control)sender).Parent;
        int newX;
        int newY;
        int minX = 10;
        int minY = 10;
        int maxX = useThis.Width - (25 + useThis.Width);
        int maxY = useThis.Height - (45 + useThis.Height);
        if ( e.Button == MouseButtons.Left ) {
            newX = e.X + useThis.Left - m_MouseDownLocation.X;
            newY = e.Y + useThis.Top - m_MouseDownLocation.Y;
            if ( m_IsDragging ) {
                if ( ( newX >= minX ) && ( newX <= maxX ) ) {
                    useThis.Left = newX;
                }
                if ( ( newY >= minY ) && ( newY <= maxY ) ) {
                    useThis.Top = newY;
                }
            }
        }
        if ( e.Button == MouseButtons.Right ) {
            MessageBox.Show ( "Right Button Clicked!" );
        }
    }
    private void SimpleUserChildControl_MouseUp ( object sender, MouseEventArgs e ) {
        SimpleUserControl useThis = (SimpleUserControl)((Control)sender).Parent;
        if ( e.Button == MouseButtons.Left ) {
            m_IsDragging = false;
            useThis.EnableButton ( );
        }
    }
    #endregion
}

1 个答案:

答案 0 :(得分:1)

进行一些挖掘,我发现了答案。由于我在互联网上看到的答案没有解释这些概念,我将其包括在答案中。希望这有助于下一个提问的人。

回答概念:

问题是Child Control的行为(即事件)在事件影响父控制之前“捕获”事件。

Child Control的行为需要将Parent Control的行为链接到它。这意味着使用Child Control中的相关事件来调用Parent中的相同事件。

但是,由于事件需要影响父控件,因此子控件的代码必须存在于父控件中(请参阅下面的代码示例)。

想到这一点的最好方法是代码必须驻留在效果的上下文中。换句话说,如果要使用子控件代码影响父控件,则所述代码应驻留在父控件代码中。

编码细节:

相关事件是MouseDown,MouseMove和MouseUp。 要将Child中的事件链接到Parent:

  1. 在父代码中为子事件创建代码。
  2. 将子事件的代码分配给父
  3. 中的子控件

    以下是父代码中定义的子事件的示例代码(注意this.MouseX将Child事件MouseX链接到父事件MouseX:

        public void ChildControl_MouseDown ( object sender, MouseEventArgs e ) {
            if ( e.Button == MouseButtons.Right ) {
                MessageBox.Show ( "Huzzah!" );
            }
            if ( e.Button == MouseButtons.Left ) {
                //MessageBox.Show ( "Booyah!" );
                this.OnMouseDown ( e );
            }
        }
        public void ChildControl_MouseMove ( object sender, MouseEventArgs e ) {
            if ( e.Button == MouseButtons.Left ) {
                this.OnMouseMove ( e );
            }
        }
        public void ChildControl_MouseUp ( object sender, MouseEventArgs e ) {
            if ( e.Button == MouseButtons.Left ) {
                this.OnMouseUp ( e );
            }
        }