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
, см. Аналогичную проблему здесь .