【问题标题】:mvvmcross WPF show user dialogmvvmcross WPF 显示用户对话框
【发布时间】:2020-11-23 08:10:02
【问题描述】:

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

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

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

每当我需要 LoadingDialog 时;

_navigationService.Navigate<LoadingView>());

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

其次,用普通的用户控件和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

【问题讨论】:

  • 您是否在 XAML 中添加了 DialogHost
  • 是的,我尝试使用在用户控件中声明的 DialogHost 并在 DialogHost.DialogContent 中设置 ProgressBar,然后我尝试在 UserControl.Content 中编写 ProgressBar,两者都不起作用.它告诉我System.InvalidOperationException: 'No loaded DialogHost instances.' everytime.
  • 你把材料设计资源词典添加到App.xaml了吗?
  • 是的,当然,我使用了很多来自 MaterialDesignInXaml-Toolkit 的控件
  • 你在哪里调用Show方法?在像 Loaded? 这样的窗口事件处理程序中

标签: c# wpf dialog mvvmcross material-design-in-xaml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 2013-09-07
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多