【问题标题】:Exception when change Border property from other thread从其他线程更改边框属性时出现异常
【发布时间】:2011-01-25 17:07:47
【问题描述】:

我在 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);

更改标签字体颜色,一切正常。

感谢和问候

【问题讨论】:

    标签: .net wpf multithreading wpf-controls


    【解决方案1】:

    确保您也在 UI 线程上为 myBrush 创建和设置值。

    mainBorder,作为边框,具有线程亲和性。但是,Brush 也具有线程亲和性,因为它是从 DispatcherObject 派生的。

    (您的第二个示例有效,因为您在 UI 线程中创建了一个新画笔,而不是使用在其他地方创建的画笔......)

    【讨论】:

    • 当然了!!你是对的。谢谢帮助我只是在 UI 线程上创建 myBrush。
    • @sixlettervariables:如果 OP 没有尝试更改画笔值,那当然可以。
    【解决方案2】:

    另一种方法是将画笔/动画定义为资源并在需要时启动动画或分配画笔。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多