Исключение при изменении свойства границы из другого потока

у меня есть компонент в WPF, этот компонент использует границу, и я использую свойство границы фона, чтобы изменить цвет фона всего компонента.

Проблема в том, что когда я пытаюсь чередовать два разных цвета с помощью таймера, выдается invalidOperationException. «Вызывающий поток не может получить доступ к этому объекту, поскольку им владеет другой поток». В методе таймера я помещаю код для изменения свойств границы в объекте Dispatcher.

            mainBorder.Dispatcher.BeginInvoke((ThreadStart)delegate() 
            {
                mainBorder.BorderBrush = myBrush;
               mainBorder.Background = myBrush;
            }, null);

но выбрасывается исключение, и я не понимаю, что я делаю неправильно! Например, в то же время я делаю код

lbHolderServico.Dispatcher.BeginInvoke((ThreadStart)delegate()
{
    lbHolderServico.Foreground = new SolidColorBrush(HoldLabelsFontColor);
}, null);

изменить цвет шрифта метки, и все работает нормально.

Спасибо и привет


person mastervv    schedule 25.01.2011    source источник


Ответы (2)


Альтернативой может быть определение кистей/анимаций в качестве ресурсов и запуск анимации или назначение кистей при необходимости.

person Emond Erno    schedule 25.01.2011

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

mainBorder, являясь границей, имеет сходство с потоком. Однако Brush также имеет сходство с потоком, т.к. он получен из DispatcherObject.

(Ваш второй пример работает, потому что вы создаете новую кисть в потоке пользовательского интерфейса, а не используете созданную в другом месте...)

person Reed Copsey    schedule 25.01.2011
comment
Конечно!! вы правы .. Спасибо, помогите, я просто создал myBrush в потоке пользовательского интерфейса. - person mastervv; 25.01.2011
comment
@sixlettervariables: Это, конечно, сработает, при условии, что ОП не пытается изменить значения кисти. - person Reed Copsey; 25.01.2011