2015-11-27 31 views
2

当我试图打电话MahApps地铁对话框,同时将价值如何调用MahApps地铁对话框,用户控件在WPF

同时呼吁对话框控件传递我需要通过Metrowindow参数

参数时,我收到错误

但我需要调用它的用户控制

下面是方法,我会打电话的时候,我需要对话框控件

public async void ShowMessageDialog(object sender, RoutedEventArgs e) 
     { 
      // This demo runs on .Net 4.0, but we're using the Microsoft.Bcl.Async package so we have async/await support 
      // The package is only used by the demo and not a dependency of the library! 
      var mySettings = new MetroDialogSettings() 
      { 
       AffirmativeButtonText = "Hi", 
       NegativeButtonText = "Go away!", 
       FirstAuxiliaryButtonText = "Cancel", 
       // ColorScheme = MetroDialogOptions.ColorScheme 
      }; 

      MessageDialogResult result = await this.ShowMessageAsync("Hello!", "Welcome to the world of metro!", 
       MessageDialogStyle.AffirmativeAndNegativeAndSingleAuxiliary, mySettings); 

      if (result != MessageDialogResult.FirstAuxiliary) 
       await this.ShowMessageAsync("Result", "You said: " + (result == MessageDialogResult.Affirmative ? mySettings.AffirmativeButtonText : mySettings.NegativeButtonText + 
        Environment.NewLine + Environment.NewLine + "This dialog will follow the Use Accent setting.")); 
     } 

public static Task<MessageDialogResult> ShowMessageAsync(this MetroWindow window, string title, string message, MessageDialogStyle style = MessageDialogStyle.Affirmative, MetroDialogSettings settings = null) 
     { 
      window.Dispatcher.VerifyAccess(); 
      return HandleOverlayOnShow(settings, window).ContinueWith(z => 
      { 
       return (Task<MessageDialogResult>)window.Dispatcher.Invoke(new Func<Task<MessageDialogResult>>(() => 
       { 
        if (settings == null) 
        { 
         settings = window.MetroDialogOptions; 
        } 

        //create the dialog control 
        var dialog = new MessageDialog(window, settings) 
        { 
         Message = message, 
         Title = title, 
         ButtonStyle = style 
        }; 

        SizeChangedEventHandler sizeHandler = SetupAndOpenDialog(window, dialog); 
        dialog.SizeChangedHandler = sizeHandler; 

        return dialog.WaitForLoadAsync().ContinueWith(x => 
        { 
         if (DialogOpened != null) 
         { 
          window.Dispatcher.BeginInvoke(new Action(() => DialogOpened(window, new DialogStateChangedEventArgs()))); 
         } 

         return dialog.WaitForButtonPressAsync().ContinueWith(y => 
         { 
          //once a button as been clicked, begin removing the dialog. 

          dialog.OnClose(); 

          if (DialogClosed != null) 
          { 
           window.Dispatcher.BeginInvoke(new Action(() => DialogClosed(window, new DialogStateChangedEventArgs()))); 
          } 

          Task closingTask = (Task)window.Dispatcher.Invoke(new Func<Task>(() => dialog._WaitForCloseAsync())); 
          return closingTask.ContinueWith(a => 
          { 
           return ((Task)window.Dispatcher.Invoke(new Func<Task>(() => 
           { 
            window.SizeChanged -= sizeHandler; 

            window.RemoveDialog(dialog); 

            return HandleOverlayOnHide(settings, window); 
           }))).ContinueWith(y3 => y).Unwrap(); 
          }); 
         }).Unwrap(); 
        }).Unwrap().Unwrap(); 
       })); 
      }).Unwrap(); 
     } 
+0

使用命令而不是事件,并传递CommandArgument。 – AnjumSKhan

回答

3

小号howMessageAsync是MetroWindow扩展方法,所以这个代码应工作:

var metroWindow = (Application.Current.MainWindow as MetroWindow); 
await metroWindow.ShowMessageAsync(title, message); 
+0

你是天才,男人! –

0

让我给你基于拉杰什回答一个现实生活中的例子。

async void LoadData() 
     { 
      var metroWindow = (Application.Current.MainWindow as MetroWindow); 
      var controller = await metroWindow.ShowProgressAsync("Procesando", "Obtener datos de la base de datos", 
       false, new MetroDialogSettings() { AnimateShow = true, ColorScheme = MetroDialogColorScheme.Theme}); 
      controller.SetIndeterminate(); 

      await viewModel.LoadData(); 

      await Dispatcher.BeginInvoke((Action)(async() => 
      { 
       DataGrid1.ItemsSource = viewModel.AModels; 

       await controller.CloseAsync(); 
      })); 
     } 
0

@Rajesh代码在用户控件中对我做空异常。即使我的MainWindow是MetroWindow类。但是,下面的工作适用于我的配置;

 #region try show Message 
     try 
     { 

      #region ok, lets show message 
      foreach (System.Windows.Window window in System.Windows.Application.Current.Windows) 
      { 
       if (window.GetType() == typeof(MainWindow)) 
       { 

        var controller = await (window as MainWindow).ShowProgressAsync("My Title", "My long message content text.", 
        false, new MetroDialogSettings() { AnimateShow = true, ColorScheme = MetroDialogColorScheme.Theme }); 

       } 
      } 
      #endregion ok, lets show message 

     } 
     catch (Exception ex) 
     { 

      #region error block 


      #endregion error block 

     } 
     #endregion try show Message 
0

这是另一种选择,因为我试着用Rajesh Akshith的答案,但它不适合我。

在用户控件,

using MahApps.Metro.Controls.Dialogs; 

private IDialogCoordinator dialogCoordinator; 
public async Task ShowMessageAsync() 
     { 
      dialogCoordinator = DialogCoordinator.Instance; 
      await dialogCoordinator.ShowMessageAsync(this,"Header","Body"); 
     } 

我是从Mahapps Dialog参考。我觉得这是比较有用,它也可以在辅助类写,你可以从任何地方调用它。