Я пытаюсь изменить размер панелей, которые я создал динамически. При изменении размеров границы панелей привязывают сетку. Но его ширина / высота не меняется в идеале. Пока указатель мыши находится на привязке, ширина / высота постоянно меняется. Вот мой код. Как мне решить эту проблему?
Tile.cs (Это пользовательский элемент управления.)
namespace WindowsFormsApp6
{
public partial class Tile : UserControl
{
bool mouseClicked = false;
int pixels = 16;
public Tile()
{
InitializeComponent();
ShowHideAnchorPoints(true);
}
private void ShowHideAnchorPoints(bool flag)
{
rightAnchor.Visible =
leftAnchor.Visible =
topAnchor.Visible =
bottomAnchor.Visible = flag;
}
private void Anchor_MouseDown(object sender, MouseEventArgs e)
{
mouseClicked = true;
ShowHideAnchorPoints(false);
}
private void Anchor_MouseUp(object sender, MouseEventArgs e)
{
mouseClicked = false;
ShowHideAnchorPoints(true);
}
private void topAnchor_MouseMove(object sender, MouseEventArgs e)
{
if (mouseClicked)
{
Location = GridSnapY(Location, e.Y);
Height -= e.Y;
}
}
private void rightAnchor_MouseMove(object sender, MouseEventArgs e)
{
if (mouseClicked)
{
int width = (sender as Panel).Right + e.X;
Width = SnapWidth(width);
}
}
private void bottomAnchor_MouseMove(object sender, MouseEventArgs e)
{
if (mouseClicked)
{
int height = (sender as Panel).Bottom + e.Y;
Height = height;
Height = SnapHeight(height);
}
}
private void leftAnchor_MouseMove(object sender, MouseEventArgs e)
{
if (mouseClicked)
{
Location = GridSnapX(Location, e.X);
Width -= e.X;
}
}
private Point GridSnapX(Point location, int x)
{
Point p = new Point(location.X + x, location.Y);
if (p.X % pixels > pixels/2)
{
p.X += pixels - (p.X % pixels);
}
else
{
p.X -= (p.X % pixels);
}
return p;
}
private Point GridSnapY(Point location, int y)
{
Point p = new Point(location.X, location.Y + y);
if (p.Y % pixels > pixels/2)
{
p.Y += pixels - (p.Y % pixels);
}
else
{
p.Y -= (p.Y % pixels);
}
return p;
}
private int SnapHeight(int height)
{
if (height % pixels > pixels/2)
{
height += pixels - (height % pixels);
}
else
{
height -= (height % pixels);
}
return height;
}
private int SnapWidth(int width)
{
if (width % pixels > pixels/2)
{
width += pixels - (width % pixels);
}
else
{
width -= (width % pixels);
}
return width;
}
Form1.cs (Здесь холст создается с точками сетки, где пользователь может рисовать плитку и изменить его размер)
namespace WindowsFormsApp6
{
public partial class Form1 : Form
{
Tile t;
Point locationXY;
Point locationX1Y1;
bool isMouseDown;
public Form1()
{
InitializeComponent();
canvas.BackgroundImage = CreatePixelGrid();
}
private Image CreatePixelGrid()
{
int width = canvas.Width;
int height = canvas.Height;
int pixels = 16;
Bitmap image = new Bitmap(width, height);
for (int y = 0; y < height; y += pixels)
{
for (int x = 0; x < width; x += pixels)
{
image.SetPixel(x, y, Color.Black);
}
}
return image;
}
private void DrawTile()
{
t = new Tile();
locationXY.X = Math.Min(locationXY.X, locationX1Y1.X);
locationXY.Y = Math.Min(locationXY.Y, locationX1Y1.Y);
t.Location = locationXY;
t.Height = Math.Abs(locationX1Y1.Y - locationXY.Y);
t.Width = Math.Abs(locationX1Y1.X - locationXY.X);
t.BorderStyle = BorderStyle.None;
canvas.Controls.Add(t);
t.BringToFront();
}
private void canvas_MouseDown(object sender, MouseEventArgs e)
{
isMouseDown = true;
locationXY = e.Location;
}
private void canvas_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
locationX1Y1 = e.Location;
Refresh();
}
}
private void canvas_MouseUp(object sender, MouseEventArgs e)
{
isMouseDown = false;
DrawTile();
}
}
}
Вот как выглядит форма после рисования плитки. В настоящее время я работаю только с верхним, нижним, правым и левым якорями.
