В моем приложении у меня есть view
, который открываемого следующим образом:WPF GUI не обновляется при загрузке при ожидании события
ManagerView view = new ManagerView();
view.ShowDialog();
Это View
:
<Window x:Class="WpfUpdateGui.ManagerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:WpfUpdateGui">
<Window.DataContext>
<local:ManagerViewModel />
</Window.DataContext>
<i:Interaction.Triggers>
<i:EventTrigger EventName="ContentRendered">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<TextBox Text="{Binding Messages}" />
и мой ViewModel
:
public class ManagerViewModel : INotifyPropertyChanged
{
/*INPC Members...*/
private string _messages;
private static EventWaitHandle _timerWaiter;
/*Constructor*/
public ManagerViewModel()
{
_timerWaiter = new EventWaitHandle(false, EventResetMode.AutoReset);
LoadedCommand = new RelayCommand(StartProcess);
}
private void StartProcess()
{
Application.Current.Dispatcher.Invoke(
DispatcherPriority.ApplicationIdle,
new Action(() =>
{
AddMessage("Starting");
Worker worker = new Worker();
worker.DidSomethingEvent += Worker_DidSomethingEvent;
worker.DoSomeThing();
_timerWaiter.WaitOne();
AddMessage("Finished");
}));
}
private void AddMessage(string message)
{
Application.Current.Dispatcher.Invoke(() => Messages += $"\r\n{message}");
}
private void Worker_DidSomethingEvent()
{
_timerWaiter.Set();
}
public RelayCommand LoadedCommand { get; set; }
public string Messages
{
get { return _messages; }
set
{
if (value == Messages) return;
_messages = value;
OnPropertyChanged("Messages");
}
}
}
public class Worker
{
public event Action DidSomethingEvent;
public void DoSomeThing()
{
Thread.Sleep(2500);
DidSomethingEvent();
}
}
Моя проблема в том, что первое сообщение, которое я хочу отобразить («Запуск»), отображается только после того, как был установлен EventWaitHandle
, даже жестко он был добавлен до вызова WaitOne()
.
Я полагаю, это из-за Приоритета - ApplicationIdle ... Итак, когда это начинается? Когда вы увидели свое сообщение. – Spawn
Кроме того, вы проверили его на сборке релизов без отладчика? – Spawn
Я тестировал его на своем конце и отлично работал. Но без ссылки xaml на DataContext. Является ли SingleView ManagerViewModel? – tgpdyk