我的应用程序使用 UI 线程和另一个线程在后台执行操作,并使用这些操作的结果更新 UI。
这一切都很好。但是,在一项操作中,我需要要求用户输入一些值。顺序:
- UI线程运行
- 命令-> 启动的第二个线程(我们称之为工作线程)在后台工作
- 工作线程在按顺序执行操作时向 UI 发送状态信息
- 在一个特定操作期间,工作线程被停止
- 发送一条消息,必须显示视图,以便用户选择一个选项
- UI 线程订阅了这种类型的消息,所以它显示了一个视图
- 用户完成选择,并关闭视图
- 工作线程接收用户选择,并继续执行
- 工作线程完成
开始新主题的代码:
Thread thread = new Thread(Convert);
thread.SetApartmentState(ApartmentState.STA); // avoid "The calling thread must be STA" exception
thread.Start();
将状态信息从工作线程发送到 UI 线程的代码:
Application.Current.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Normal,
(Action<OperationStatus>)delegate(OperationStatus operation)
{
OperationList.Add(operation);
}, status);
要求用户确认的代码:
在 MainViewModel 中,工作线程执行期间:
// create ViewModel, that will be used as DataContext for dialog view
var vm = new SelectOptionViewModel(OptionList);
// subscribe to Close event, to get user selection
vm.Close += (s, e) =>
{
_option = vm.SelectedOption;
};
AppMessages.DialogScreen.Send(vm);
在 MainView 中,在工作线程执行期间:
AppMessages.DialogScreen.Register(this, vm =>
{
SelectOptionView view = new SelectOptionView();
view.DataContext = vm;
// view.Owner = this; // raises exeption about cross-threading
view.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
view.ShowDialog();
});
问题是如何将对话框视图设置为在父视图(MainView)中居中显示?无法将 view.Owner 设置为“this”,因为“this”是在 UI 线程上创建的。
我应该在此处更改什么以在我的应用程序中居中对话框视图,同时保留定义的序列顺序?