Установите флажок, чтобы не добавлять несколько элементов на холст в WPF / C # - PullRequest
0 голосов
/ 04 июня 2018
Shape shape = sm.maakEllips();
if (!canvas.Children.Contains(shape))
{
    cm.Draw(shape, canvas, locatie);
}

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);
    }
}

Итак, я добавляю фигуру к холсту в Draw ().Затем, когда я проверяю это в верхнем предложении if, я все еще могу добавить одну и ту же форму на один и тот же холст несколько раз.Я не понимаю, что я делаю не так?

РЕДАКТИРОВАТЬ:

            Shape shape = sm.makeShape(Convert.ToByte(textboxR.Text), Convert.ToByte(textboxG.Text), Convert.ToByte(textboxB.Text), Convert.ToInt32(textboxHoogte.Text), Convert.ToInt32(textboxBreedte.Text));
            foreach (Shape existingShape in canvas.Children.OfType<Shape>())
            {
                if (existingShape.Width != shape.Width && existingShape.Height != shape.Height
                    && existingShape.Fill != shape.Fill)
                {
                    cm.Draw(shape, canvas, locatie);
                }
            }

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

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

maakEllips() всегда создает новый Shape.Если вы хотите сравнить этот элемент с другими Shape элементами в Canvas, вам нужно выполнить их итерацию.Следующий код сравнивает высоту, ширину и положение и добавляет новый Shape к Canvas, если любой из них отличается:

Shape shape = sm.maakEllips();
foreach (Shape existingShape in canvas.Children.OfType<Shape>())
{
    if(existingShape.Width != canvas.Width || existingShape.Height != canvas.Height 
        || Canvas.GetLeft(existingShape) != Canvas.GetLeft(shape)
        || Canvas.GetTop(existingShape) != Canvas.GetTop(shape))
    {
        cm.Draw(shape, canvas, locatie);
    }
}
0 голосов
/ 05 июня 2018

Ваш 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...