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。
如何在我的 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。