Sé que hay algunas respuestas sobre este tema en SO, pero no puedo conseguir ninguna de las soluciones que funcionen para mí. Estoy intentando abrir una nueva ventana, desde un ICommand disparado desde dentro de una plantilla de datos. Ambos de los siguientes dará el error antes mencionado cuando la nueva ventana se crea una instancia (dentro de "nueva MessageWindowP"):"El hilo de llamada debe ser STA" solución
El uso de TPL/FromCurrentSynchronizationContextActualización: trabaja
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();
}
}
Usando ThreadStart:Actualización: no recomendado, consulte la respuesta de 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();
}
}
Gracias
EDITAR. En base a las respuestas hasta ahora, me gustaría señalar que también he probado BeginInvoke en el despachador actual, así como también he ejecutado el código en el método original (así es como comenzó el código). Vea a continuación:
BeginInvokeUpdate: No se recomienda ver la respuesta de 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();
}
}
En mismo hiloActualización: funciona si usted está en hilo de interfaz de usuario ya
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, haciendo referencia al despachador de first/main wi NDOWActualización: trabaja
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
GeneralManager.MainDispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(() => this.CreateMessageWindow(user)));
}
}
donde GeneralManager.MainDispatcher es una referencia al despachador de la primera ventana creo:
[somewhere far far away]
mainP = new MainP();
MainDispatcher = mainP.View.Dispatcher;
Estoy en una pérdida.
¿Y cuál era el problema de llamar en el mismo hilo y 'BeginInvoke'? ¿En qué hilo se ejecuta el 'Execute'? – Vlad
No puede usar 'Dispatcher.CurrentDispatcher' como lo hace aquí. Ver la actualización de mi respuesta. – Jon
Chicos. Todavía no hay suerte ... :(ver actualización de nuevo –