我知道关于这个主题有一些关于 SO 的答案,但我无法获得任何适合我的解决方案。我正在尝试从数据模板中触发的 ICommand 打开一个新窗口。当实例化新窗口时(在“new MessageWindowP”内),以下两个都给出了上述错误:
使用 TPL/FromCurrentSynchronizationContext 更新:有效
public class ChatUserCommand : ICommand
{
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(new Action<object>(CreateMessageWindow), user,CancellationToken.None, TaskCreationOptions.None,scheduler);
}
}
private void CreateMessageWindow(object o)
{
var user = (UserC)o;
var messageP = new MessageWindowP();
messageP.ViewModel.Participants.Add(user);
messageP.View.Show();
}
}
使用 ThreadStart: 更新:不推荐,请参阅 Jon 的回答
public class ChatUserCommand : ICommand
{
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
var t = new ParameterizedThreadStart(CreateMessageWindow);
var thread = new Thread(t);
thread.SetApartmentState(ApartmentState.STA);
thread.Start(sender);
}
}
private void CreateMessageWindow(object o)
{
var user = (UserC)o;
var messageP = new MessageWindowP();
messageP.ViewModel.Participants.Add(user);
messageP.View.Show();
}
}
谢谢
编辑。根据到目前为止的响应,我想指出我还在当前调度程序上尝试了 BeginInvoke,以及在原始方法中执行代码(这就是代码开始的方式)。见下文:
BeginInvoke 更新:不推荐查看 Jon 的回答
public class ChatUserCommand : ICommand
{
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
Dispatcher.CurrentDispatcher.BeginInvoke(new Action<object>(CreateMessageWindow), sender);
}
}
private void CreateMessageWindow(object o)
{
var user = (UserC)o;
var messageP = new MessageWindowP();
messageP.ViewModel.Participants.Add(user);
messageP.View.Show();
}
}
在同一个线程 更新:如果你已经在 UI 线程上工作
public class ChatUserCommand : ICommand
{
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
var messageP = new MessageWindowP();
messageP.ViewModel.Participants.Add(user);
messageP.View.Show();
}
}
}
BeginInvoke,使用对第一个/主窗口 更新的调度程序的引用:有效
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
GeneralManager.MainDispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(() => this.CreateMessageWindow(user)));
}
}
其中 GeneralManager.MainDispatcher 是对我创建的第一个窗口的 Dispatcher 的引用:
[somewhere far far away]
mainP = new MainP();
MainDispatcher = mainP.View.Dispatcher;
我不知所措。