c# - 使用 Caliburn.Micro 4.0.x 和 WPF 的对话框
问题描述
我正在使用 Caliburn.Micro 4.0.136-rc 并希望显示一个对话框,要求用户输入。
我找到的只是几年前的答案,使用的是 CM 中不再提供的类。其他人链接到死网站上的解决方案。
我正在使用从 Screen 继承的 ViewModel。如何使用 CM 和 MVVM 创建和显示对话框?
解决方案
我发现了两种使用 Caliburn.Micro 显示对话框的可能方式
窗口管理器
我正在使用 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 已在该项目中使用。
推荐阅读
- sql-server - 如何在 MVC 中计算百分比
- python - Python Boto3 错误 - 删除 Amazon S3 对象时出现“预期的字符串或类似字节的对象”
- django - django.core.exceptions.ImproperlyConfigured:不支持 Django 3.0.1
- c# - Dotnet Core - 查找与您所在文件夹相关的文件夹中的所有文件,然后查找最后添加的 csv 文件
- javascript - 如何在超链接点击时用 JavaScript 打开 PDF 文件?
- javascript - 角度 8 和sailsJs 的套接字io 请求错误
- firebase - 如何限制对特定 Firebase 节点的读写
- uiscrollview - 故事板自由形式模式下的视图控制器最大高度
- angular - Twitter 的 Fabric 密钥
- javascript - 在 reactjs 和 nextjs 构造函数中获取参考错误:未定义本地存储