2011-02-11 1 views
1

Salut, j'essaie d'afficher l'indicateur occupé dans le shell qui est une fenêtre wpf.Afficher BusyIndicator à partir de WPF.ExtendedToolkit dans Caliburn.Micro

Vu shell J'ai ceci:

<Grid> 
    <extToolkit:BusyIndicator IsBusy="{Binding Path=ShellIsBusy, Mode=OneWay, 
              UpdateSourceTrigger=PropertyChanged}" 
           BusyContent="{Binding Path=BusyMessage,Mode=OneWay, 
               UpdateSourceTrigger=PropertyChanged}"> 
     <ContentControl x:Name="ActiveItem" /> 

    </extToolkit:BusyIndicator> 
</Grid> 

classe modèle Shell est ici:

[Export(typeof(IShellViewModel))] 
public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, 
    IShellViewModel, IPartImportsSatisfiedNotification 
{ 
    [Import] 
    internal IJinglePlayer JinglePlayer { get; set; } 

    private bool _isBusy; 
    private string _busyMessage; 

    public bool ShellIsBusy 
    { 
     get { return _isBusy; } 
     set 
     { 
      _isBusy = value; 
      NotifyOfPropertyChange(()=>ShellIsBusy); 
     } 
    } 

    public string BussyMessage 
    { 
     get { return _busyMessage; } 
     set 
     { 
      _busyMessage = value; 
      NotifyOfPropertyChange(()=>BussyMessage); 
     } 
    } 

    protected override void OnInitialize() 
    { 
     Show1(); 
     base.OnInitialize(); 
     JinglePlayer.PlayStartUp(); 
    } 

    public void Show1() 
    { 
     var vm = IoC.Get<ILogOnViewModel>(); 
     ActivateItem(vm); 
    } 

    public void Show2(IAccount account) 
    { 
     ActiveItem.Deactivate(true); 
     var vm = IoC.Get<IMeViewModel>(); 
     vm.Account = account; 
     ActivateItem(vm);  } 

    public void OnImportsSatisfied() 
    { 

    } 
} 

je lance l'application, de la classe de modèle de vue active J'appelle cela:

  [Import] 
      internal IShellViewModel Shell { get; set; } 

      //... 

      Shell.ShellIsBusy = true; 
      Shell.BusyMessage = "logging"; 

      //long task 

      Shell.Show2(logOnResult.ReturnValue); 

Le problème est que l'indicateur occupé est affiché dans le moment où est active une autre vue.

Répondre

0

Je poste ma solution, peut-être que quelqu'un aura une meilleure idée. Le problème est que la tâche en cours d'exécution maintient le thread UI occupé, donc j'appelle cette tâche et la méthode shell sur la nouvelle vue active dans un autre thread.

Quelque chose comme ceci:

Task.Factory.StartNew(() => { //long task }); 

Task.Factory.StartNew(() => { Shell.Show2(...); }); 

Ce thread d'interface utilisateur et débloquer BusyIndicator peuvent être affichés.

Questions connexes