синхронизированное обновление графического интерфейса в WPF

У меня есть холст WPF, в котором я хочу отображать разные цвета Rectangles (хранящиеся в многомерном массиве) каждые x миллисекунд.

Random rnd = new Random();

foreach (var i in Enumerable.Repeat(1, 100))
{
    _rectGrid[rnd.Next(0, 30), rnd.Next(0, 30)].Fill = new SolidColorBrush(Colors.Blue);
    Thread.Sleep( 100 );
    // refresh somehow here?
}

Это работает, но я не вижу, чтобы оно обновлялось в реальном времени, так как оно находится в конструкторе MainWindow.

Очевидно, что прямоугольники должны быть созданы в потоке графического интерфейса, но если я создам Timer для изменения цветов, он будет в другом потоке.

Могу ли я создать многомерный массив значений и привязать значения к цветам в массиве Rectangle, чтобы иметь доступ к ним из другого потока? И если я это сделаю, как я скажу потоку GUI перерисовать?

Может быть, было бы проще иметь кнопку, которую пользователь нажимает первой, чтобы этого не происходило в конструкторе?

EDIT:

DispatcherTimer работал отлично. Почему у MS есть отдельный класс для этого, мне не понятно.

введите здесь описание изображения

Вот источник, для которого я использовал его.


person micahhoover    schedule 12.01.2013    source источник
comment
Я бы настроил DispatchTimer для выполнения этого на msdn.microsoft .com/en-us/library/   -  person kenny    schedule 12.01.2013
comment
Связанная полезная ссылка способ запускать событие каждую минуту"> stackoverflow.com/questions/479376/   -  person kenny    schedule 12.01.2013


Ответы (2)


Вы можете использовать DispatcherTimer следующим образом:

    public MainWindow()
    {
        InitializeComponent();

        DispatcherTimer t = new DispatcherTimer();
        t.Tick += t_Tick;
        t.Interval = new TimeSpan(0, 0, 0, 0, 300);
        t.Start();
    }
    Random r = new Random();
    void t_Tick(object sender, EventArgs e)
    {
        byte[] rnd = new byte[4];
        r.NextBytes(rnd);
        this.Background = new SolidColorBrush(Color.FromArgb(rnd[0], rnd[1], rnd[2], rnd[3]));
    }
person John Koerner    schedule 12.01.2013

вы можете попробовать использовать событие ContentRendered окна.

person Deepak    schedule 12.01.2013