窗口中的线程

时间:2012-02-07 13:56:50

标签: wpf

这是我的代码

public partial class MainWindow : Window
{
    Thread ProgressThread;
    Window w;
    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        ProgressThread = new Thread(() =>
        {
            w = new Window();
            RoundProgressBar objprogress=new RoundProgressBar();
            w = new Window();
            w.Margin = new Thickness(0, 0, 50, 0);
            w.WindowState = WindowState.Normal;
            w.WindowStartupLocation = WindowStartupLocation.CenterOwner;
            w.Height = 80;
            w.Width = 80;
            w.ResizeMode = ResizeMode.NoResize;
            w.AllowsTransparency = true;
            w.WindowStyle = WindowStyle.None;
            RoundProgressBar Progress = new RoundProgressBar();
            w.Content = objprogress;
            w.ShowInTaskbar = false;
            w.ShowDialog();
            w.Content = Progress;
            w.ShowInTaskbar = false;
            w.ShowDialog();

            w.Closed += (sender2, e2) =>
            w.Dispatcher.InvokeShutdown();

            System.Windows.Threading.Dispatcher.Run();
        });

        ProgressThread.SetApartmentState(ApartmentState.STA);
        ProgressThread.Start();
    }
}

当我点击按钮线程时,启动屏幕中间的进度条。当我更改主屏幕时,不会改变进度条窗口。

我想在该窗口的中间显示该进度条。如果我搬到任何地方。

w.Owner = this;

我知道在这段代码的帮助下,这将是完美的。但我在线程中工作,所以发生了这个错误

“调用线程无法访问此对象,因为其他线程拥有它”

请帮我解决这个问题

1 个答案:

答案 0 :(得分:2)

UI对象位于UI线程上。您希望有一个监视进度的后台线程,但是随后要在UI上更新任何内容,您需要再次发送回UI线程。

这些方面的东西:

private void button1_Click(object sender, RoutedEventArgs e) {
    Task t = Task.Factory.StartNew(UpdateUI);
}

private void UpdateUI() {
   Dispatcher.Invoke(
      new Action(() => { 
          textBox1.Text = "Henk"; 
          // etc etc, this would be your normal code
      })
  );
}

本文解释了它:http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

如果可以使用async,那么您应该查看this示例。对于这些问题,这种痛苦主要是消失的。

此致,Gert-Jan