Пример #1
0
        async Task InvokeButtonAction(VM.Button vm)
        {
            var msgAttr  = vm?.ActionAttributes.OfType <MessageAttribute>().SingleOrDefault();
            var progAttr = vm?.ActionAttributes.OfType <ProgressAttribute>().SingleOrDefault();

            var pars = vm.Method.GetParameters();

            var hasProgPar   = pars.SingleOrDefault(x => x.ParameterType == typeof(IMechaProgress)) != null;
            var hasMsgPar    = pars.SingleOrDefault(x => x.ParameterType == typeof(IMechaMessage)) != null;
            var hasActionPar = pars.SingleOrDefault(x => x.ParameterType == typeof(IMechaAction)) != null;

            var hasProg = hasProgPar || progAttr != null;
            var hasMsg  = hasMsgPar || msgAttr != null;

            IMechaMessage msgDial = hasMsgPar ? new MessageDialog() : null;

            async Task InvokeAction(IMechaProgress progDial)
            {
                var argl = new List <Tuple <Type, object> >();

                if (hasProgPar)
                {
                    argl.Add(Tuple.Create(typeof(IMechaProgress), (object)progDial));
                }
                if (hasMsgPar)
                {
                    argl.Add(Tuple.Create(typeof(IMechaMessage), (object)msgDial));
                }
                if (hasActionPar)
                {
                    argl.Add(Tuple.Create(typeof(IMechaAction), (object)new ButtonHandle(vm)));
                }

                var args = argl.Count > 0
                    ? pars.Join(argl,
                                x => x.ParameterType,
                                x => x.Item1,
                                (x, y) => y.Item2).ToArray()
                    : null;

                if (argl.Count > 0 && argl.Count != args.Length)
                {
                    throw new Exception($"The '{vm.Method.Name}' method has unsupported parameters.");
                }

                if (vm.Method.ReturnType == typeof(Task))
                {
                    await(Task) vm.Invoke(args);
                }
                else
                {
                    vm.Invoke(args);
                }
            }

            bool actionError = false;

            if (hasProg)
            {
                var message = progAttr?.Message ?? "Please wait...";
                var title   = progAttr?.Title ?? "processing";

                var progDial = await dialogs.ShowProgress(title, message, false);

                try
                {
                    await InvokeAction(progDial);
                }
                catch (Exception exception)
                {
                    actionError = true;

                    if (progDial.IsOpen)
                    {
                        await progDial.CloseAsync();
                    }

                    await dialogs.ShowError("Error", exception.GetBaseException().Message);
                }

                if (progDial.IsOpen)
                {
                    await progDial.CloseAsync();
                }
            }
            else
            {
                try
                {
                    await InvokeAction(null);
                }
                catch (Exception exception)
                {
                    actionError = true;
                    await dialogs.ShowError("Error", exception.GetBaseException().Message);
                }
            }

            if (hasMsg)
            {
                var message = msgAttr?.Message ?? "Finished.";
                var title   = msgAttr?.Title ?? "done";

                if (!actionError)
                {
                    await dialogs.ShowInfo(msgDial?.Title ?? title, msgDial?.Message ?? message);
                }
            }
        }
Пример #2
0
 public void DynamicMessage(IMechaMessage msg)
 {
     msg.Title   = "Dynamic Message";
     msg.Message = "Done at " + DateTime.Now.ToShortTimeString();
 }