mvvmcross WPF показывает диалог пользователя - PullRequest
0 голосов
/ 03 августа 2020

Как я могу показать диалог загрузки в моем приложении MvvmCross?

Сначала мне это понравилось ( стандарт MvvmCross );

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

и всякий раз, когда мне нужен LoadingDialog;

_navigationService.Navigate<LoadingView>());

Это выглядит действительно странно, потому что модальное представление - это новое окно, но я хочу добиться наложения в моем основном приложении.

Во-вторых, попробовал его с обычным пользовательским элементом управления и слепком MaterialDesignThemes ;

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

и всякий раз, когда мне нужен был LoadingDialog;

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

Это не работает, потому что я думаю необходимо зарегистрировать MaterialDesignThemes.Wpf.DialogHost в Mvx.IoCprovider раньше.

1 Ответ

1 голос
/ 03 августа 2020

DialogHost регистрировать не нужно. Когда вы помещаете экземпляр хоста диалога в XAML, как показано ниже, экземпляр диалога будет зарегистрирован автоматически.

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

Внутренне хосты диалога отслеживаются в состоянии c HashSet. Экземпляр DialogHost регистрируется, когда его событие Loaded в XAML запускается, и отменяется регистрация при возникновении события 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 генерирует исключение, потому что вы вызываете это в местах, где элемент управления DialogHost в вашей разметке XAML еще не загружен и не вызвал событие Loaded, или это уже снова Unloaded. Следовательно, вы должны убедиться, что диалоговое окно загружено перед вызовом Show, см. Аналогичную проблему здесь .

...