TextBox自定义ContextMenu中的Style,多线程错误

时间:2010-10-29 05:08:52

标签: c# wpf multithreading textbox

在WPF应用程序中,我使用自定义样式的Textbox,其中ContextMenu被覆盖如下:

  <Style TargetType="{x:Type TextBox}">
    <Setter Property="ContextMenu">
      <ContextMenu>
        <MenuItem Header="Copy"/>
      </ContextMenu>
    </Setter>
  </Style>

这完全有效,直到我在不同的线程中使用TextBox运行窗口,如下所示:

Thread thread = new Thread(()=>
                                {
                                TestWindow wnd = new TestWindow();
                                wnd.ShowDialog();
                                });
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();

但这导致InvalidOperationException“调用线程无法访问此对象,因为另一个线程拥有它。”。

如何避免这个问题?

2 个答案:

答案 0 :(得分:5)

问题是你的样式被重用为优化,所以ContextMenu被重用 - 这是标准的,适用于单线程,但不适用于多线程。

我会尝试将样式移动到resourcedictionary并将其作为StaticResource引用,然后我会标记: X:共享= “假” 这将在每次访问资源时创建一个新实例 - 我不确定它是否适用于“catch all”密钥更少的样式。 然后你可以将contextmenu作为一个资源并将其作为StaticResource引用 - 应该这样做。

答案 1 :(得分:0)

在您的代码中,您希望在非UI线程中修改UI,这是不允许的。

在应用UI更新时,您必须确保自己处于UI线程中。您可以通过检查object.InvokeRequired的值来检查是否需要这样做。如果需要,您可以通过调用object.Invoke([delegate])来调用该方法。

除此之外,您还可以使用调度员,请参阅MSDNthis blog。快乐阅读