У меня проблема с пользовательским интерфейсом в проекте WPF.
Концепция:
Два клиента в C # общаются через чат с сервером Java в Linux.
С одним из клиентов я могу выкинуть другой из чата с помощью «/ kick [пользователь] [причина]». Для получения сокета от отправителя к удаленному пользователю я нахожусь в асинхронном обратном вызове, поэтому я редко работаю в UI-потоке. Так что для решения проблем метода no-ui я использую Dispatcher. Поэтому для закрытия текущего пользовательского интерфейса я делаю
this.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { this.Close(); });
Он работает хорошо, но теперь Мне нужно вызвать другой пользовательский интерфейс (меню подключения для пользователей), но когда я использую " Show ()"метод, который я получаю
'System.InvalidOperationException' in PresentationCore.dll
at System.Windows.Input.InputManager..ctor()
at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
at System.Windows.Input.KeyboardNavigation..ctor()
at System.Windows.FrameworkElement.FrameworkServices..ctor()
at System.Windows.FrameworkElement.EnsureFrameworkServices()
at System.Windows.FrameworkElement..ctor()
at System.Windows.Controls.Control..ctor()
at System.Windows.Window..ctor()
Поэтому я попытался поместить его в Диспетчер тоже
MainWindow mw = new MainWindow();
mw.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { mw.Show(); });
Но я получаю ту же ошибку (Система. InvalidOperationException) .
Как это сделать ???
Методы:
Получение пакетов: (не очень полезно, но, может быть, я могу сделать это по-другому ...?
private void callBack(IAsyncResult aResult)
{
String message = "";
try
{
int size = sck.EndReceiveFrom(aResult, ref ip);
if (size > 0)
{
byte[] receive = new byte[1024];
receive = (byte[])aResult.AsyncState;
message = Encoding.Default.GetString(receive, 0, 1024);
//class for execute sockets informations that the server sends
new Event(message, this);
}
byte[] buffer = new byte[1024];
//restart async task
sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ip, new AsyncCallback(callBack), buffer);
}
catch (Exception) { }
}
kickUser:
public void kickUser(String sender, String reason)
{
if (!CheckAccess())
{
//working well
this.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { this.Close(); });
//And here the System.InvalidOperationException
MainWindow mw = new MainWindow();
mw.Show();
//this.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { mw.Show(); });
//mw.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { mw.Show(); });
//All do the same OperationException error.
}
MessageBox.Show("You get kicked by \"" + sender + "\" for: " + reason, "Server: /kick");
}