В настоящее время я работаю над WPF на ядре. net. Мое приложение должно запустить ядро Cef для запуска пользовательского интерфейса (вместо использования формы WPF). Перед этим я хочу отобразить простое окно WPF с надписью «Загрузка ...». Поэтому при запуске приложения я должен запустить поток, подобный этому
Thread thread = new Thread(() =>
{
try
{
DisplayLoader = true;
var f = new Loading();
f.Loaded += (a, b) =>
{
Task.Run(() =>
{
while (DisplayLoader)
Thread.Sleep(250);
f.Dispatcher.BeginInvoke(() =>
{
f.Close();
});
f.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate ()
{
f.Close();
}));
});
};
f.Show();
Dispatcher.Run();
}
catch
{
Loader.Close();
}
});
Дело в том, когда DisplayLoader становясь ложным, я видел, что Dispatcher также вызывает функцию Close, однако ничего не произошло. Я уже слежу за большим количеством ответов на stackOverflow, но ни один из них не работает.
Ниже этой функции запускается поток, он вызывает Cef и отображает окно Cef
thread.Start();
var assembly = Assembly.GetExecutingAssembly();
CefApp
.Run(assembly)
Когда CefApp Загружен, DisplayLoader будет установлен в false.
protected override void OnLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode)
{
base.OnLoadEnd(browser, frame, httpStatusCode);
if (frame.IsValid)
{
if (App.DisplayLoader)
{
App.DisplayLoader = false;
}
}
}
РЕДАКТИРОВАТЬ: Проблема на самом деле исходит от CefAppBuilder, он встроил код C ++ из CefGlue, а затем может вызвать некоторые проблемы с C# функция. Только не изменяйте никакую переменную C# в функции вызова C, тогда все в порядке.