Advertisement
Graf_Spee

MahApps Metro DialogHelper Updated

Sep 19th, 2016
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.87 KB | None | 0 0
  1. using MahApps.Metro.Controls;
  2. using MahApps.Metro.Controls.Dialogs;
  3. using System.ComponentModel;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6.  
  7. namespace MetroUtils.Helpers
  8. {
  9.     public static class DialogHelper
  10.     {
  11.         public static Task HideAllVisibleDialogs(this MetroWindow window)
  12.         {
  13.             return Task.Run(async () =>
  14.             {
  15.                 await window.Dispatcher.Invoke(async () =>
  16.                 {
  17.                     BaseMetroDialog dialogBeingShown;
  18.  
  19.                     while((dialogBeingShown = await window.GetCurrentDialogAsync<BaseMetroDialog>()) != null)
  20.                     {
  21.                         await window.HideMetroDialogAsync(dialogBeingShown);
  22.                     }
  23.                 });
  24.             });
  25.         }
  26.  
  27.         public static Task<MessageDialogResult> ShowMessageAsync(this MetroWindow window, string title, string message, int timeout, MessageDialogResult defaultResult = MessageDialogResult.Affirmative, string displayFormat = "{0} ({1})", MessageDialogStyle style = MessageDialogStyle.Affirmative, MetroDialogSettings settings = null)
  28.         {
  29.             Task<MessageDialogResult> task = new Task<MessageDialogResult>(() => ShowMessage(window, title, message, timeout, defaultResult, displayFormat, style, settings));
  30.             task.Start();
  31.             return task;
  32.         }
  33.  
  34.         private static MessageDialogResult ShowMessage(MetroWindow window, string title, string message, int timeout, MessageDialogResult defaultResult = MessageDialogResult.Affirmative, string displayFormat = "{0} ({1})", MessageDialogStyle style = MessageDialogStyle.Affirmative, MetroDialogSettings settings = null)
  35.         {
  36.             window.HideAllVisibleDialogs();
  37.  
  38.             AutoResetEvent autoResetEvent = new AutoResetEvent(false);
  39.             Task<MessageDialogResult> dialogTask = null;
  40.             MessageDialog dialog = null;
  41.             bool timeouted = false;
  42.             string defaultMessage = GetDefaultMessage(defaultResult, settings);
  43.  
  44.             ChangeDefaultMessage(defaultResult, string.Format(displayFormat, defaultMessage, timeout), ref settings);
  45.  
  46.             window.Dispatcher.Invoke(() =>
  47.             {
  48.                 dialogTask = window.ShowMessageAsync(title, message, style, settings);
  49.                 dialogTask.ContinueWith((s) => { autoResetEvent.Set(); });
  50.             });
  51.  
  52.             System.Timers.Timer timer = new System.Timers.Timer(1000) { AutoReset = false };
  53.  
  54.             BackgroundWorker worker = new BackgroundWorker();
  55.  
  56.             timer.Elapsed += async (s, e) =>
  57.             {
  58.                 if (--timeout <= 0)
  59.                 {
  60.                     timeouted = true;
  61.  
  62.                     if (dialog != null && dialog.IsVisible)
  63.                     {
  64.                         await System.Windows.Application.Current.Dispatcher.Invoke(async () =>
  65.                         {
  66.                             await window.HideMetroDialogAsync(dialog);
  67.                         });
  68.                     }
  69.                     autoResetEvent.Set();
  70.                 }
  71.                 else
  72.                 {
  73.                     if (dialog.IsVisible)
  74.                     {
  75.                         window.Dispatcher.Invoke(() => ChangeDefaultMessage(defaultResult, string.Format(displayFormat, defaultMessage, timeout), dialog));
  76.                         timer.Start();
  77.                     }
  78.                 }
  79.             };
  80.  
  81.             worker.DoWork += (s, e) =>
  82.             {
  83.                 while (dialog == null)
  84.                 {
  85.                     window.Dispatcher.Invoke(async () =>
  86.                     {
  87.                         dialog = await window.GetCurrentDialogAsync<MessageDialog>();
  88.                     });
  89.  
  90.                     if (dialog == null)
  91.                     {
  92.                         /*
  93.                          * There where some cases where the dialog hasn't been shown yet, so it's best to
  94.                          * hold the thread a little, so it gives a little time for the dialog to be shown
  95.                          * before it checks again.
  96.                          */
  97.                         Thread.Sleep(250);
  98.                     }
  99.                 }
  100.             };
  101.  
  102.             worker.RunWorkerCompleted += (s, e) =>
  103.             {
  104.                 timer.Start();
  105.             };
  106.  
  107.             worker.RunWorkerAsync();
  108.  
  109.             autoResetEvent.WaitOne();
  110.  
  111.             return timeouted ? defaultResult : dialogTask.Result;
  112.         }
  113.  
  114.         private static string GetDefaultMessage(MessageDialogResult defaultResult, MetroDialogSettings settings)
  115.         {
  116.             settings = settings ?? new MetroDialogSettings();
  117.  
  118.             switch(defaultResult)
  119.             {
  120.                 case MessageDialogResult.Affirmative:
  121.                     return settings.AffirmativeButtonText;
  122.  
  123.                 case MessageDialogResult.Negative:
  124.                     return settings.NegativeButtonText;
  125.  
  126.                 case MessageDialogResult.FirstAuxiliary:
  127.                     return settings.FirstAuxiliaryButtonText;
  128.  
  129.                 case MessageDialogResult.SecondAuxiliary:
  130.                     return settings.SecondAuxiliaryButtonText;
  131.             }
  132.  
  133.             return string.Empty;
  134.         }
  135.  
  136.         private static void ChangeDefaultMessage(MessageDialogResult defaultResult, string message, ref MetroDialogSettings settings)
  137.         {
  138.             settings = settings ?? new MetroDialogSettings();
  139.  
  140.             switch (defaultResult)
  141.             {
  142.                 case MessageDialogResult.Affirmative:
  143.                     settings.AffirmativeButtonText = message;
  144.                     break;
  145.                 case MessageDialogResult.Negative:
  146.                     settings.NegativeButtonText = message;
  147.                     break;
  148.                 case MessageDialogResult.FirstAuxiliary:
  149.                     settings.FirstAuxiliaryButtonText = message;
  150.                     break;
  151.                 case MessageDialogResult.SecondAuxiliary:
  152.                     settings.SecondAuxiliaryButtonText = message;
  153.                     break;
  154.             }
  155.         }
  156.  
  157.         private static void ChangeDefaultMessage(MessageDialogResult defaultResult, string message, MessageDialog dialog)
  158.         {
  159.             switch (defaultResult)
  160.             {
  161.                 case MessageDialogResult.Affirmative:
  162.                     dialog.AffirmativeButtonText = message;
  163.                     break;
  164.                 case MessageDialogResult.Negative:
  165.                     dialog.NegativeButtonText = message;
  166.                     break;
  167.                 case MessageDialogResult.FirstAuxiliary:
  168.                     dialog.FirstAuxiliaryButtonText = message;
  169.                     break;
  170.                 case MessageDialogResult.SecondAuxiliary:
  171.                     dialog.SecondAuxiliaryButtonText = message;
  172.                     break;
  173.             }
  174.         }
  175.     }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement