в winforms я могу перетащить элемент управления с кучей элементов управления (например, списки) в него в другой элемент управления и изменить их размер / переместить оттуда? - PullRequest
2 голосов
/ 10 июня 2011

Я сталкиваюсь с некоторыми ситуациями, когда было бы неплохо создать элемент управления (Control A) со множеством вещей, таких как кнопки, списки, представления данных и т. Д., Чтобы я мог перетаскивать его в другие элементы управления (Control B) всякий раз, когда Мне нравится, поэтому мне не нужно снова и снова писать логику для вещей в Control A.

Единственное, что раздражает в этом подходе, - это то, что я не могу найти способ в конструкторе перемещать / изменять размеры кнопок, списков, представлений сетки данных и т. Д. Control A вокруг дизайнера Control B. Все, что кажется позвольте мне сделать это изменить размер всего элемента управления A.

Кто-нибудь знает, как сделать эти пользовательские элементы управления, содержащие несколько элементов управления, таким образом, чтобы они поддерживали изменение размера / перемещение во время разработки?

Спасибо

Isaac

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Да, вы можете, мой друг, вам нужно создать панель SizeAble и DragAndDrop, в которую вы можете вставлять элементы управления, и перемещая эту панель, вы можете достичь этого. А для изменения размера вы можете поиграть с уже добавленными привязками элемента управления.

using System;
using System.Drawing;
using System.Windows.Forms;

public class SizeablePanel : Panel {
  private const int cGripSize = 20;
  private bool mDragging;
  private Point mDragPos;

  public SizeablePanel() {
    this.DoubleBuffered = true;
    this.SetStyle(ControlStyles.ResizeRedraw, true);
    this.BackColor = Color.White;
  }

  protected override void OnPaint(PaintEventArgs e) {
    ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor,
      new Rectangle(this.ClientSize.Width - cGripSize, this.ClientSize.Height - cGripSize, cGripSize, cGripSize));
    base.OnPaint(e);
  }

  private bool IsOnGrip(Point pos) {
    return pos.X >= this.ClientSize.Width - cGripSize &&
           pos.Y >= this.ClientSize.Height - cGripSize;
  }

  protected override void OnMouseDown(MouseEventArgs e) {
    mDragging = IsOnGrip(e.Location);
    mDragPos = e.Location;
    base.OnMouseDown(e);
  }

  protected override void OnMouseUp(MouseEventArgs e) {
    mDragging = false;
    base.OnMouseUp(e);
  }

  protected override void OnMouseMove(MouseEventArgs e) {
    if (mDragging) {
      this.Size = new Size(this.Width + e.X - mDragPos.X,
        this.Height + e.Y - mDragPos.Y);
      mDragPos = e.Location;
    }
    else if (IsOnGrip(e.Location)) this.Cursor = Cursors.SizeNWSE;
    else this.Cursor = Cursors.Default;
    base.OnMouseMove(e);
  }
}
1 голос
/ 10 июня 2011

Нет встроенного способа сделать это.По сути, вам придется реализовать обработчики событий для обработки изменения размеров отдельных компонентов в вашем элементе управления.Одна из альтернатив для вас - предоставить клиентам свойства элемента управления Size и Location каждого отдельного компонента.Например, в классе Control вы можете сделать что-то вроде этого:

public Size Component1Size
{
     get { return component1.Size; }
     set { component1.Size = value; }
}

public Point Component1Location
{
    get { return component1.Location; }
    set { component1.Location = value; }
}

и сделать это для каждого компонента вашего элемента управления.Я думаю, что это будет вашим лучшим вариантом, даже если пользователь не сможет физически щелкнуть / перетащить компоненты, чтобы переместить и изменить их размер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...