Advertisement
Graf_Spee

MahApps Metro DialogHelper

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