我有一个wpf表单,我想在用户从控件中做出选择时立即显示加载弹出窗口,因为数据加载可能需要很长时间才能看到,因为数据库不是本地的。我把一切都搞定了,直到我为弹出窗口创建线程。
这是我创建线程的地方:
public void Start()
{
if (_parent != null)
_parent.IsEnabled = false;
_thread = new Thread(RunThread);
_thread.IsBackground = true;
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
_threadStarted = true;
SetProgressMaxValue(10);
Thread th = new Thread(UpdateProgressBar);
th.IsBackground = true;
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
线程方法:
private void RunThread()
{
_window = new WindowBusyPopup(IsCancellable);
_window.Closed += new EventHandler(WaitingWindowClosed);
_window.ShowDialog();
}
现在执行的那一刻我得到了这个错误:
不能使用属于与其父Freezable不同的线程的DependencyObject。
任何帮助将不胜感激:)
答案 0 :(得分:0)
尝试使用表单的Dispatcher属性。 Dispatcher.BeginInvoke(...)
或者只使用BackgroundWorker类,因为它有一个名为ReportProgress()的方法来报告进度百分比。这将触发ProgressChanged事件,当您可以刷新进度条的值或其他东西时......
答案 1 :(得分:0)
不能使用属于与其父Freezable不同的线程的DependencyObject。
观察到此错误是因为您正在尝试使用在您的STA线程(用于显示弹出窗口)的其他线程中创建的资源(UIElement类型)。
在你的情况下,它看起来像第二个线程线程th =新线程(UpdateProgressBar); ,正试图操纵 WindowBusyPopup 中的UI。由于弹出窗口由不同的线程拥有,因此您将获得此异常。
可能的解决方案:(因为我看到你没有显示函数UpdateProgressBar的实现)
private void UpdateProgressBar()
{
if(_window != null) /* assuming you declared your window in a scope accesible to this function */
_window.Dispatcher.BeginInvoke(new Action( () => {
// write any code to handle children of window here
}));
}