JoeSmith3100
@JoeSmith3100
Начинающий программист C#

Каким образом можно заставить программу отрисовывать объекты по порядку через определённый интервал времени?

Допустим мы имеем в первом файле такое определение:
using System.Windows.Media;
using System.Windows.Shapes;

namespace Visual
{
    public class TPoint
    {

        // Coords of all objects in this project will be indicated by the upper left edge
        private Rectangle rectangle;
        private Brush pointColor;
        private int regardingPointSize;
        private int pointCoordX;
        private int pointCoordY;

        public TPoint(int _x, int _y, int _size, Brush _color)
        {
            pointColor = _color;
            pointCoordX = _x * TBasicConstants.getBasicSizeOfBlock();
            pointCoordY = _y * TBasicConstants.getBasicSizeOfBlock();
            regardingPointSize = _size * TBasicConstants.getBasicSizeOfBlock();

            rectangle = new Rectangle
            {

                Fill = pointColor,
                Width = regardingPointSize,
                Height = regardingPointSize
            };
        }

        public int getXCoord ()
        {
            return pointCoordX;
        }
        public int getYCoord ()
        {
            return pointCoordY;
        }
        public Rectangle getPoint()
        {
            return rectangle;
        }

    }
}


Во втором, где описана мельчайшая константа :
namespace Visual
{
    class TBasicConstants
    {
        private const int basicSizeOfBlock = 15;

        public static int getBasicSizeOfBlock()
        {
            return basicSizeOfBlock;
        }
    }
}


И в третьем где отрисовываются элементы:
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace Visual
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();

            for (int i = 0; i <=5; i++)
            {
                TPoint point = new TPoint(5, i, 1, Brushes.Red);
                drawTPointElement(point);
            }
        }

        public void drawTPointElement(TPoint _rectangle)
        {
            Canvas.SetLeft(_rectangle.getPoint(), _rectangle.getXCoord());
            Canvas.SetTop(_rectangle.getPoint(), _rectangle.getYCoord());
            Thread.Sleep(1000);
            mainCanvas.Children.Add(_rectangle.getPoint());
        }

    }
}


Так вот, какие есть способы сделать так, чтобы элементы в цикле выводились по порядку через определённый интервал времени?
А не так как получилось: программа "спит" одну секунду после инициализации каждого объекта, а потом показывает все сразу (то есть программа перед запуском из за Thread.sleep висит 'количество итераций в цикле for * число указанное в thread.sleep' секунд)
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
gdt
@gdt
Программист
У вас проблема из-за того, что вы всё время замораживаете основной поток (который и должен всё отрисовывать). И делаете всё в конструкторе, когда форму ещё никто не показал даже.
Попробуйте переделать ваш drawTPointElement так:
public async Task drawTPointElement(TPoint _rectangle)
{
    Canvas.SetLeft(_rectangle.getPoint(), _rectangle.getXCoord());
    Canvas.SetTop(_rectangle.getPoint(), _rectangle.getYCoord());
    await Task.Delay(1000);
    mainCanvas.Children.Add(_rectangle.getPoint());
}


А в Main завернуть цикл в Task.Run вот так:
Task.Run(async () =>
{
    for (int i = 0; i <=5; i++)
    {
        TPoint point = new TPoint(5, i, 1, Brushes.Red);
        await drawTPointElement(point);
    }
});


Единственное что у вас скорее всего с таким подходом будут ошибки из-за того, что добавление в Children может происходить из другого потока, для этого можно обернуть mainCanvas.Children.Add(_rectangle.getPoint()); в что-то по типу Dispatcher.Invoke
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman Куратор тега C#
C# the best
По таймеру,
https://docs.microsoft.com/ru-ru/dotnet/api/system...
При старте создаём все объекты для отрисовки, помещаем в список или массив, а в таймере отрисовываем по порядку
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы