Ваш Draw()
метод добавляет vorm
типа Shape
к холсту, указанному в canvas
.И я предполагаю, что ваш sm.maakEllips()
возвращает эллипс.
Поэтому, когда вы запустите следующий код:
Shape shape = sm.maakEllips();
if (!canvas.Children.Contains(shape))
{
cm.Draw(shape, canvas, locatie);
}
Вы попадете внутрь оператора if
only если холст содержит точный shape
объект, который вы создали в строке выше, используя метод sm.maakEllips()
.Это не может быть любая форма, которая имеет те же свойства объекта shape
выше.Потому что каждый раз, когда вы создаете новый объект, даже с точно такими же свойствами, включая его имя, они все еще являются двумя разными объектами в мире .NET
.
Чтобы проиллюстрировать эту точку, см. Пример кода ниже.
Ваш неизменный метод Draw()
:
public void Draw(Shape vorm, Canvas canvas, Point locatie)
{
if (vorm.Height <= canvas.Height && vorm.Width <= canvas.Width)
{
Canvas.SetTop(vorm, locatie.Y);
Canvas.SetLeft(vorm, locatie.X);
canvas.Children.Add(vorm);
}
}
Метод makeEllipse()
, который создает эллипс шириной и высотой 100 и 80 соответственно и назначает name
, переданный в параметре.
public Shape makeEllipse(string name)
{
Shape sh = new Ellipse
{
Name = name,
Width = 100,
Height = 80,
};
return sh;
}
Теперь посмотрите следующий код, выполненный по нажатию кнопки.
private void btnGO_Click(object sender, RoutedEventArgs e)
{
// Creates an ellipse with name "Shape1", and assigns to sh1.
Shape sh1 = makeEllipse("Shape1");
// Adds the said sh1 to the canvas using `Draw()` method.
Draw(sh1, myCanvas, new Point(5, 5));
// See if sh1 exists as a child of `myCanvas`.
// Since sh1 is now a child of canvas, code does NOT go inside the if-clause.
if (!myCanvas.Children.Contains(sh1))
{
Draw(sh1, myCanvas, new Point(5, 5));
}
// Creates an ellipse with the same name "Shape1", and assigns to sh2.
Shape sh2 = makeEllipse("Shape1");
// It is NOT added to the canvas using `Draw()` method.
// Now, here, code DOES go inside the if-clause, because the said object does not exist as a child of `myCanvas`.
if (!myCanvas.Children.Contains(sh2))
{
Draw(sh2, myCanvas, new Point(5, 5));
}
}
Комментарии выше должны быть достаточно хороши, но, чтобы объяснить еще раз,
- Когда вы создаете
sh1
и добавляете его к myCanvas
с использованием метода Draw()
, он становится дочерним элементом myCanvas.Children
. - Затем, когда вы проверяете, является ли он дочерним, используя
if (!myCanvas.Children.Contains(sh1))
, поскольку к тому времени он является дочерним элементом, условие становится false
, и мы не идем внутрь предложения if
. - Далее мы создаем
sh2
, который имеет точно такие же измеренияи имя как sh1
.Однако, и это ключ, .NET
рассматривает его как другой объект, даже если он имеет те же свойства, что и предыдущий объект.Причина в том, что всякий раз, когда мы используем ключевое слово new
, .NET
создает реальный новый объект. - После этого мы НЕ добавляем его на холст, используя метод
Draw()
. - Теперь, во втором
if
, когда мы проверяем, содержит ли myCanvas
объект, он обнаруживает, что sh2
НЕ является потомком myCanvas
, поэтому он входит в предложение if
.