コード例 #1
0
            public bool Combine(ViewModelBase vm)
            {
                if (IsCompleted)
                {
                    return(false);
                }
                object oldMessage;
                bool   oldBusy;

                lock (_ref)
                {
                    if (IsCompleted)
                    {
                        return(false);
                    }
                    if (vm._busyTail != null)
                    {
                        _prev = vm._busyTail;
                        vm._busyTail._next = this;
                    }
                    oldMessage   = vm.BusyMessage;
                    oldBusy      = vm.IsBusy;
                    vm._busyTail = this;
                }
                if (oldMessage != vm.BusyMessage)
                {
                    vm.OnPropertyChanged(Empty.BusyMessageChangedArgs);
                }
                if (oldBusy != vm.IsBusy)
                {
                    vm.OnPropertyChanged(Empty.IsBusyChangedArgs);
                }
                vm.OnPropertyChanged(Empty.BusyInfoChangedArgs);
                return(true);
            }
コード例 #2
0
        internal virtual void HandleInternal(object sender, object message)
        {
            var busyToken = message as IBusyToken;

            if (busyToken != null)
            {
                HandleMode messageMode = Settings.HandleBusyMessageMode;
                if (messageMode.HasFlagEx(HandleMode.Handle))
                {
                    var token = new BusyToken(this, busyToken);
                    if (token.Combine(this))
                    {
                        OnBeginBusy(token);
                    }
                }
                if (messageMode.HasFlagEx(HandleMode.NotifySubscribers))
                {
                    PublishInternal(sender, message);
                }
                return;
            }
            if (Settings.BroadcastAllMessages || message is IBroadcastMessage)
            {
                PublishInternal(sender, message);
            }
        }
コード例 #3
0
        public virtual IBusyToken BeginBusy(object message = null)
        {
            var token = new BusyToken(this, message ?? Settings.DefaultBusyMessage);

            token.Combine(this);
            Publish(token);
            OnBeginBusy(token);
            return(token);
        }
コード例 #4
0
 private static bool TryGetMessage <TType>(BusyToken token, Func <TType, bool> filter, out TType result)
 {
     if (token.Message is TType)
     {
         result = (TType)token.Message;
         if (filter == null || filter(result))
         {
             return(true);
         }
     }
     result = default(TType);
     return(false);
 }
コード例 #5
0
        /// <summary> Creates a busy context
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <returns>BusyToken</returns>
        /// <example><code>using (BusyManager.Instance.Context(this)) { ... } </code></example>
        public BusyToken Context(IObjectVM sender)
        {
            BusyToken token;

            _tokens.TryGetValue(sender, out token);
            if (token == null)
            {
                token = new BusyToken(sender);
                _tokens.Add(sender, token);
                token.Finished += (s, e) => _tokens.Remove(((BusyToken)s).Sender);
                token.Start();
            }
            else
            {
                token.ContinuedAsync();
            }
            return(token);
        }