我在启动时打开对话框时收到此错误:Cannot perform this operation while dispatcher processing is suspended.
在应用程序开始时,将在具有可切换内容的窗口顶部打开“登录对话框”窗口。我的意思是我有一个窗口,通过在主窗口上设置ViewModel属性来切换内容。
如果我没有设置主窗口视图模型,我不会收到错误,因为它不需要在视图中更改任何内容。
这是MainView,带有可切换的viewmodel:
<Window x:Class="WpfProject.Views.Main.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModels="clr-namespace:WpfProject.ViewModels.Main"
Title="WpfProject" Height="700" Width="1000"
Content="{Binding ViewModel}"
Visibility="{Binding MainWindowVisiblility}"
xmlns:MvvmDialogs="clr-namespace:MvvmDialogs.Behaviors;assembly=MvvmDialogs"
MvvmDialogs:DialogBehavior.DialogViewModels="{Binding Dialogs}"
xmlns:Behaviors="clr-namespace:WpfProject.Behaviors"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
>
<i:Interaction.Behaviors>
<Behaviors:CancelCloseWindowBehavior CloseAction="{Binding CloseAction}"></Behaviors:CancelCloseWindowBehavior>
</i:Interaction.Behaviors>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding StartUpProcedureCommand}"></i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
<Window.DataContext>
<ViewModels:MainViewModel ></ViewModels:MainViewModel>
</Window.DataContext>
交互触发器是执行对话窗口的操作。
对于对话框窗口我使用Mark J Feldman处理对话框的方式,可以找到here
现在正如标题中所建议的那样,我想等到MainViewModel被更改并更新视图,然后再打开对话框窗口。
启动程序命令:
private ICommand _StartUpProcedureCommand;
public ICommand StartUpProcedureCommand
{
get
{
return _StartUpProcedureCommand ?? (_StartUpProcedureCommand = new Command(StartUpProcedure));
}
}
private void StartUpProcedure()
{
UserLoginDialog();
}
private void UserLoginDialog(IUser user = null)
{
MainWindowVisiblility = Visibility.Hidden;
LoginViewModel lvm=new LoginViewModel(user);
this.Dialogs.Add(lvm);
if (lvm.Result == null)
Application.Current.MainWindow.Close();
}
答案 0 :(得分:0)
您在UI线程上遇到了一种死锁,需要在Dispatcher.BeginInvoke
中包装新窗口的显示,以便异步执行并允许调度程序线程继续处理。
这样的事情:
Dispatcher.BeginInvoke(new Action(() => new CustomDialogWindow {DataContext = parent.DataContext}.ShowDialog());