2015-10-27 2 views
0

В моем приложении у меня есть 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().

+0

Я полагаю, это из-за Приоритета - ApplicationIdle ... Итак, когда это начинается? Когда вы увидели свое сообщение. – Spawn

+0

Кроме того, вы проверили его на сборке релизов без отладчика? – Spawn

+0

Я тестировал его на своем конце и отлично работал. Но без ссылки xaml на DataContext. Является ли SingleView ManagerViewModel? – tgpdyk

ответ

0

Просто замените ContentRendered загруженным событием и оно должно работать. (Это со мной работало).

+0

такие же результаты ... – Yoav

 Смежные вопросы

  • Нет связанных вопросов^_^