mvvmcross WPF 显示用户对话框

mvvmcross WPF show user dialog

如何在我的 MvvmCross 应用程序中显示加载对话框?

一开始我是这样的(MvvmCross standard);

[MvxWindowPresentation(Modal = true)]
public partial class LoadingView : MvxWindow
{
    public LoadingView () => InitializeComponent();
}

每当我需要 LoadingDialog 时;

_navigationService.Navigate<LoadingView>());

这看起来很奇怪,因为模态视图是一个新的 window,但我想在我的主应用程序中实现覆盖。

其次,尝试使用普通用户控件和 MaterialDesignThemes nugget;

public partial class LoadingView : UserControl
{
    public LoadingView () => InitializeComponent();
}

每当我需要 LoadingDialog 时;

var result = await MaterialDesignThemes.Wpf.DialogHost.Show(new LoadingView ());

这行不通,因为我认为必须在 Mvx.IoCprovider 之前注册 MaterialDesignThemes.Wpf.DialogHost

DialogHost不需要注册。当您像下面这样在 XAML 中放置一个对话框宿主实例时,该对话框实例将被自动注册。

<materialDesign:DialogHost>
   <materialDesign:DialogHost.DialogContent>
      <!-- ...dialog content -->
   <materialDesign:DialogHost.DialogContent>
   <!-- ...content -->
</materialDesign:DialogHost>

在内部,对话主机在静态 HashSet 中进行跟踪。 DialogHost 实例在 XAML 中的 Loaded 事件被触发时被注册,而在 Unloaded 事件发生时被注销,正如您从下面的参考源中看到的那样。 InvalidOperationException (No loaded DialogHost instances.) 异常仅在没有 DialogHost.

的加载实例时抛出
private static readonly HashSet<DialogHost> LoadedInstances = new HashSet<DialogHost>();

public DialogHost()
{
   this.Loaded += new RoutedEventHandler(this.OnLoaded);
   this.Unloaded += new RoutedEventHandler(this.OnUnloaded);
   // ...
}

private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
   DialogHost.LoadedInstances.Add(this);
}

private void OnUnloaded(object sender, RoutedEventArgs routedEventArgs)
{
   DialogHost.LoadedInstances.Remove(this);
}

换句话说,Show 方法抛出一个异常,因为你在一些地方调用它,XAML 标记中的 DialogHost 控件还没有加载并且没有加载触发 Loaded 事件,或者它已经是 Unloaded 了。因此,您必须确保在调用 Show 之前加载对话框,请参阅类似的问题 here