代码之家  ›  专栏  ›  技术社区  ›  Héctor M.

是否可以在C#Winforms中实现一个将元素重新组织为Android的函数

  •  0
  • Héctor M.  · 技术社区  · 6 年前

    我有这个菜单(Android风格),它位于 FlowLayoutPanel 用于组织元素(Bunifu平铺按钮):

    enter image description here

    嗯,我考虑过实现一个拖动功能,您可以在执行时通过鼠标拖动元素来重新定位元素,就像在Android中一样。

    为此,我使用了 FlowLayoutPanel流程布局面板 要组织元素和此代码,请执行以下操作:

     ...
     Interval = 100, Enabled = true;      
    
     private void Timer_0_Tick(object sender, EventArgs e)
     {
          var cursor = Cursor.Position;
          if(bunifuTileButton1.DisplayRectangle.Contains(cursor))
          {
             if(Hector.Framework.Utils.Peripherals.Mouse.MouseButtonIsDown(Hector.MouseButton.Left))
             {
                  bunifuTileButton1.Location = cursor;
             }
         }
    }
    

    但当我拖动元素时,它们只需通过释放鼠标按钮返回到其原始位置。

    所以,我的问题是:

    是否可以在C#Winforms中使用 FlowLayoutPanel流程布局面板 在执行时自动组织元素?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Héctor M.    6 年前

    首先,您需要实现有助于拖放控件的功能。但在此之前,您需要将控件的当前位置存储在一些类级变量中。请考虑以下代码段:

     int xloc;
     int yloc;
    
     ///other codes in-between
    
     private void btn1_Click()
     {
        xloc = this.btn1.Location.X;
        yloc = this.btn1.Location.Y;
     }
    

    现在,拖放功能:

    private Point setNewLocation;
    
    private void btn1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            setNewLocation= e.Location;
        }
    }
    
    private void btn1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            btn1.Left = e.X + btn1.Left - setNewLocation.X;
            btn1.Top = e.Y + btn1.Top - setNewLocation.Y;
        }
    }
    

    这将帮助您移动控件。。。但是当你控制另一个的时候会发生什么呢?我的意思是,你肯定不希望一个控件与另一个控件重叠。相反,当一个控件放置在另一个控件上时,另一个控件会将其位置更改为与其重叠的控件的上一个位置。所以,在 MouseUP 当前拖动控件的事件,请使用以下选项:

    private void btn1_MouseUP()
    {
       foreach (Control other in FlowlayoutPanel1.Controls)
       {
         ///change control type as required
        if (!other.Equals(btn1) && other is Button && btn1.Bounds.IntersectsWith(other.Bounds))
        {
            other.Location = new Point(xloc, yloc)
        }
    
    }
    

    我尚未调试代码,因此如果遇到任何bug,请务必留下评论:)