Я создал простую программу в C#, которая позволяет рисовать прямоугольник и перемещать его мышью. Теперь я хочу нарисовать несколько прямоугольников, я также добавлю их в список, это также работает, но я хочу, чтобы я мог перемещать каждый прямоугольник сам по себе. Это не так. Я могу только перенести первый прямоугольник, который я создал. Если я попытаюсь переместить другой прямоугольник, первый прямоугольник телепортируется к моей мыши, но только если я нажму на второй прямоугольник, если я щелкнул где-нибудь еще, он сработает с помощью nullpointer (я знаю, как это исправить, но это не проблема). Что я не могу понять, почему не могу я переместить второй прямоугольникПеретаскивание прямоугольников в списке
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace TekenTest
{
public partial class Form1 : Form
{
bool isMouseDown;
List<Item> _Items;
Item i;
public Form1()
{
InitializeComponent();
_Items = new List<Item>();
isMouseDown = false;
}
private void tekenVel_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
foreach (Item i in this._Items)
{
i.drawItem(g);
}
}
private void tekenVel_MouseDown(object sender, MouseEventArgs e)
{
this.i = _Items.Find(Item => ((i.X <= e.X && (i.WIDTH + i.X) >= e.X) &&
(i.Y <= e.Y && (i.HEIGTH + i.Y) >= e.Y)));
i.note = Color.Azure;
isMouseDown = true;
}
private void tekenVel_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown == true)
{
i.X = e.X;
i.Y = e.Y;
Refresh();
}
}
private void tekenVel_MouseUp(object sender, MouseEventArgs e)
{
isMouseDown = false;
}
private void itemToolStripMenuItem_Click(object sender, EventArgs e)
{
this.i = new Item();
this._Items.Add(i);
this.Refresh();
}
}
}
Object
класс
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TekenTest
{
class Object
{
public int X
{
get;
set;
}
public int Y
{
get;
set;
}
public int HEIGTH
{
get;
set;
}
public int WIDTH
{
get;
set;
}
public Object()
{
}
}
}
Item
класса
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TekenTest
{
class Item : Object
{
public Rectangle rect;
public String text;
public Font font;
public Brush textb;
public Color note;
public Item()
{
this.X = 200;
this.Y = 200;
this.WIDTH = 200;
this.HEIGTH = 200;
font = new Font("Arial", 12, FontStyle.Bold, GraphicsUnit.Point);
text = "Ik ben tekst";
note = Color.Yellow;
textb = Brushes.Black;
}
public void drawItem(Graphics g)
{
this.rect = new Rectangle(X, Y, WIDTH, HEIGTH);
// g.DrawRectangle(new)
g.FillRectangle(new SolidBrush(note), rect);
g.DrawString(text, font, textb, rect);
}
}
}
Ваше заявление поиска в tekenVel_MouseDown проблематично. Вы используете i (очень плохое имя, на мой взгляд), которое является переменной класса, как если бы это была временная локальная переменная, созданная выражением лямбда. Вы должны написать что-то вроде: '_Items.Find ( temp => ( (temp.X <= e.X && (temp.WIDTH + temp.X)> = e.X) && (temp.Y <= eY && (temp.HEIGTH + temp.Y)> = eY) ' –