使用 Caliburn.Micro 4.0.x 和 WPF 的对话框

问题描述

我正在使用 Caliburn.Micro 4.0.136-rc 并且想要显示一个对话框,要求用户输入。

我找到的所有答案都是几年前的,使用 CM 中不再提供的类。其他链接到死网站上的解决方案。

我使用的是从 Screen 继承的 viewmodel。如何使用 CM 和 MVVM 创建和显示对话框?

解决方法

我发现了 2 种使用 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 已在该项目中使用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...