2013-10-23 68 views
0

我试图在特定的蓝牙消息到达时在我的应用程序中显示一个菜单元素。通过定时器方法收集和解释消息,并且如果正确的消息到达,则该元素应该呈现为可见。我不断收到一个异常,告诉我该对象是由另一个线程拥有的,无法访问。从不同的线程访问GUI线程抛出异常

// Shows a TangibleMenu element 
private void Show(TangibleMenu TangibleMenuElement) 
{ 
    if (TangibleMenuElement.Shape.CheckAccess()) 
    { 
     Debug.WriteLine("normal show"); 
     TangibleMenuElement.Shape.Opacity = 1; 
     TangibleMenuElement.Shape.Visibility = System.Windows.Visibility.Visible; 
     this.ParentContainer.Activate(TangibleMenuElement.Shape); 
    } 
    else 
    { 
     Dispatcher.CurrentDispatcher.Invoke(new Action(() => 
     { 
      Debug.WriteLine("dispatcher show"); 
      TangibleMenuElement.Shape.Opacity = 1; // EXCEPTION HERE 
      TangibleMenuElement.Shape.Visibility = System.Windows.Visibility.Visible; 
      this.ParentContainer.Activate(TangibleMenuElement.Shape); 
     })); 
    } 
} 

我认为这个确切的问题可以通过使用调度器来解决,但在这种情况下,它似乎并没有工作。 TangibleMenuElement.Shape是Microsoft Surface SDK中的ScatterViewItem。有没有人有什么建议?

+0

是'Dispatcher'线程创建'TangibleMenuElement'的那个线程。 –

+0

不,我想改变已经和另一个线程创建的对象的一些属性。我怎么做? – xmashallax

回答

0

解决我的问题:我访问了错误的调度......

我没注意Dispatcher.CurrentDispatcher和Application.Current.Dispatcher之间的差异。第一个返回当前线程的调度器,第二个返回我的情况下的UI线程(应用程序的第一个线程)。

所以我的计时器线程得到了消息,称为Show(),要求一个分派器,并得到一个......但它是计时器线程的调度程序,而不是UI线程。当我将代码更改为Application.Current.Dispatcher时,它按预期工作。

更详细的解释可参见here

0

TangibleMenuElement需要在上创建在UI线程上,而不是只添加到UI线程上的容器上。这意味着您需要在UI线程上完全构建FrameworkElement

+0

它已经创建,我只想改变属性。那可能吗? – xmashallax

+0

@xmashallax你得到异常的事实表明它是在错误的线程上创建的。它需要在UI线程上构建和修改。 –

+0

如何指示UI线程更改不同线程的属性?我以为我在做这件事,但显然我没有。 – xmashallax

0

试试这个

// Shows a TangibleMenu element 
private void Show(TangibleMenu TangibleMenuElement) 
{ 
    App.Current.Dispatcher.Invoke(new Action(() => 
    { 
     if (TangibleMenuElement.Shape.CheckAccess()) 
     { 
      Debug.WriteLine("normal show"); 
      TangibleMenuElement.Shape.Opacity = 1; 
      TangibleMenuElement.Shape.Visibility = System.Windows.Visibility.Visible; 
      this.ParentContainer.Activate(TangibleMenuElement.Shape); 
     } 
     else 
     { 
      Debug.WriteLine("dispatcher show"); 
      TangibleMenuElement.Shape.Opacity = 1; // EXCEPTION HERE 
      TangibleMenuElement.Shape.Visibility = System.Windows.Visibility.Visible; 
      this.ParentContainer.Activate(TangibleMenuElement.Shape); 
     } 
    })); 
} 
+0

同样的例外,同一行出现...... :( – xmashallax