在winforms中,我可以将一个包含一堆控件(如列表框)的控件拖动到另一个控件中,然后从那里调整它们的大小/移动它们吗
本文关键字:控件 然后 另一个 调整 从那里 移动 列表 我可以 winforms 一个 包含一 | 更新日期: 2023-09-27 17:58:44
我遇到了一些情况,制作一个包含按钮、列表框、数据网格视图等一堆东西的控件(控件a)很好,这样我就可以随时将其拖动到其他控件(控件B)中,这样我不必一遍又一遍地为控件a中的东西编写逻辑。
这种方法唯一令人讨厌的是,我似乎无法在设计器中找到一种方法来从控件B的设计器中移动/调整控件a的按钮、列表框、数据网格视图等。它似乎只让我调整整个控件a的大小。
有人知道如何使这些包含多个控件的自定义控件支持设计时调整大小/移动吗?
感谢
Isaac
没有内置的方法可以做到这一点。为了处理控件中各个组件的大小调整,您基本上必须实现事件处理程序。您可以选择将每个单独组件的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; }
}
并对控件的每个组件执行此操作。我认为这将是你最好的选择,即使用户无法物理地点击/拖动组件来移动和调整它们的大小。
是的,你可以,我的朋友,你需要创建一个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);
}
}