我发现了两种使用 Caliburn.Micro 显示对话框的可能方式
IWindowManager
基于此页面https://csharp.hotexamples.com/examples/Caliburn.Micro/WindowManager/ShowDialog/php-windowmanager-showdialog-method-examples.html
我使用的是 IoC,所以我通过构造函数将 IWindowManager 注入到 ViewModel。
有了这个引用,就可以调用 ShowDialogAsync() 并从对话框中指向 ViewModel。这是重要的部分:
private readonly IWindowManager _windowManager;
public ShellViewModel(IWindowManager windowManager)
{
_windowManager = windowManager;
}
protected override async void OnViewLoaded(object view)
{
await Task.Delay(1500);
await _windowManager.ShowDialogAsync(new UsrControlViewModel());
}
MaterialDesignInXAML
在我的项目中已经使用了 MaterialDesignInXAML 包,所以这可能不是每个人都可以接受的。
这是对话框的文档部分:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/wiki/Dialogs
我发现了一个问题,该问题描述了如何使用 MaterialDesignInXAML 显示对话框,并且该绑定在 Caliburn.Micro 中失败。虽然这似乎是 Caliburn.Micro 的问题,但 Keboo 提供了一个解决方案和变通方法。
线程:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/issues/1085
从那个线程来看,重要的一点是:
视图模型
public async Task OpenDialog()
{
var viewModel = new UsrControlViewModel();
UIElement uiElement = ViewLocator.LocateForModel(viewModel, null, null);
ViewModelBinder.Bind(viewModel, uiElement, null);
await DialogHost.Show(uiElement,
new DialogOpenedEventHandler((sender, args) => viewModel.WithDialogSession(args.Session)));
var result = viewModel.Text;
}
查看
<materialDesign:DialogHost>
<materialDesign:DialogHost.DialogContent>
<ContentControl />
</materialDesign:DialogHost.DialogContent>
<!-- rest of my view -->
</materialDesign:DialogHost>
我将采用第二种方法,因为 MaterialDesignInXAML 已在此项目中使用。