[英]mvvmcross WPF show user dialog
如何在我的 MvvmCross 应用程序中显示加载对话框?
起初,我是这样做的( MvvmCross 标准);
[MvxWindowPresentation(Modal = true)]
public partial class LoadingView : MvxWindow
{
public LoadingView () => InitializeComponent();
}
每当我需要LoadingDialog时;
_navigationService.Navigate<LoadingView>());
这看起来很奇怪,因为模态视图是一个新的 window,但我想在我的主应用程序中实现覆盖。
其次,用普通的 User Control 和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>
在内部,对话主机在 static HashSet
中进行跟踪。 DialogHost
实例在其在 XAML 中的Loaded
事件被触发并在Unloaded
事件发生时取消注册时注册,如下面的参考源所示。 只有在没有加载的 DialogHost 实例的情况下才会引发InvalidOperationException
(未加载DialogHost
No loaded DialogHost instances.
)异常。
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
之前已加载对话框,请参阅此处的类似问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.