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); } } }
public void DynamicMessage(IMechaMessage msg) { msg.Title = "Dynamic Message"; msg.Message = "Done at " + DateTime.Now.ToShortTimeString(); }