这是我的代码
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;
我知道在这段代码的帮助下,这将是完美的。但我在线程中工作,所以发生了这个错误
“调用线程无法访问此对象,因为其他线程拥有它”
请帮我解决这个问题
答案 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