2013-07-18 4 views
1

У меня возникли проблемы с Adorner of WPF. Мой обожатель в порядке, но я не вижу его в тот момент, когда хочу.Как обновить/обновить окно wpf после того, как adorner был добавлен/включен

Я хотел бы сделать что-то вроде:

public void MyAction() 
    { 
     // property bound to the adorner VisibiltyProperty 
     // I like the happen a refresh now 
     // (code is wired correct, if I finish method here, the adorner is drawn) 
     this.IsAdornerEnabled = true; 

     try 
     { 
      ... doing some long lasting things I cannot do async cause it depends on a lot of objects owned by main thread... 
     } 
     finally 
     { 
      // I like the adorner to be removed from UI now 
      this.IsAdornerEnabled = false; 
     } 
    } 

IsAdornerEnabled недвижимость является правильной привязанной к Adorner и делает уведомление на него. Но в этом коде adorner окрашивается и удаляется на долю секунды, когда метод завершается.

Как это можно получить, если пользовательский интерфейс заблокирован?

Любая помощь очень ценится.

Объяснение: Мне нравится использовать рекламодателя для создания прозрачной прозрачной панели над моей основной вкладкой с текстом, подобным «загрузочному модулю» на нем. В то время как мой MainThread перемещается с помощью magellan, разрешая зависимости с замком, а затем создавая элементы управления DevExpress, мне нравится показывать эту панель. Затем я удаляю его снова. Я могу создать рекламодателя, это не проблема. Адонист работает в моем проекте прототипирования, где я не делаю никаких других вещей.

+0

Это имеет смысл, как ваш прогресс не ASync позволяет Adorner создавать уведомления и так далее, но так как вы блокирование (UI?) Нити, никто не может сделать, следовательно, нет adorner. – Samuel

+0

Вот что я спрашиваю, как я могу заставить свое приложение отобразить adorner перед тем, как заблокировать поток пользовательского интерфейса? –

+0

Этот рекламный блок должен работать как индикатор прогресса? – Tan

ответ

0

Я нашел решение для своего ответа. Это не может быть ультра чистым способом, но он работает для меня.

ViewModel:

private void LoadUi() 
    { 
     try 
     { 
      this.IsAdornerVisible = true; 
      RefreshCallback(); 

      ... some long going view initialization... 
     } 
     finally 
     { 
      this.IsAdornerVisible = false; 
     } 
} 

RefreshCallback является свойством типа действия, устанавливается с помощью метода в коде позади от XAML. Метод установлен на RefreshCallback это одна:

private void Refresh() 
    { 
     this.Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle, null); 
    } 

ВЫЗОВ на диспетчеру с ContextIdle делает, что рендеринг выполняется до того, как пустое действие выполняется. С ContextIdle это работает хорошо. Прежде чем я попробовал другие значения DispatcherPriority, например, Render. Не работал. Теперь я счастлив, что это работает, и выходные могут начаться.

Решение, которое я нашел здесь: Source of my solution: Update the WPF UI now: how to wait for the rendering to finish

0

Попробуйте это.

public void MyAction() 
{ 
    // property bound to the adorner VisibiltyProperty 
    // I like the happen a refresh now 
    // (code is wired correct, if I finish method here, the adorner is drawn) 
    this.IsAdornerEnabled = true; 

    try 
    { 
     this.Dispatcher.Invoke((Action)(() => 
     { 
      // Do your work here, 





      this.IsAdornerEnabled = false; 
     })); 
    }catch { 
    } 

} 
+0

К сожалению, этот код должен быть в классе ViewModel, где не существует диспетчера. То, что я уже пробовал, - это вызвать Диспетчер на этом.AdornedElement и вызвать Диспетчер в xaml .cs путем обратного вызова. Но живопись еще не закончена. –

+0

Итак, вы используете MVVM? – Tan

+0

Тогда вам действительно нужно использовать Async calls.http: //blog.mycupof.net/2012/08/23/mvvm-asyncdelegatecommand-what-asyncawait-can-do-for-uidevelopment/ посмотреть на это – Tan