gpt4 book ai didi

c# - WPF 和 Prism 的通用对话框窗口

转载 作者:太空狗 更新时间:2023-10-29 20:23:09 28 4
gpt4 key购买 nike

我经历了太多痛苦,试图在管理 shell 窗口中各种 View 的 VM 状态与管理大量编辑对话框(模态或非模态)的 VM 状态以及窗口本身的状态之间切换。

现在我想用一个shell窗口重做,希望只有一个对话窗口,这样我的窗口和VM的耦合度就小很多了,我可以借用shell的VM管理模式进入对话的管理。

我看到很多关于直接管理弹出窗口和不太通用的非模态窗口的指南,但是是否有任何既定的模式或指南可以仅使用一个对话来托管各种虚拟机?更好的是,Prism 中是否已经提供了此类功能?

我真的想坚持 DRY 原则, View 和 VM 中的继承增加了复杂性,我无法承受本应快速的首次迭代原型(prototype)。

最佳答案

嗯,我不知道有什么开箱即用的解决方案,但是创建这样一个可重用的对话框实现并不难。实际上,几年前我就实现了类似的东西。好吧,那是在另一份工作中,所以我无法再访问代码了。此外,我记不起所有细节,但我可以尝试为您提供此类实现的基本思路。

您可以创建一个 DialogVm,它提供通用对话框功能。

首先,表现层的对话需要什么?通常,三个按钮,例如...

  • 应用取消关闭(修改对话框)
  • 确定取消(问题对话框)
  • Ok(如果是消息框)

如您所见,您需要三个命令 (ICommand doc )。实际上,我已经创建了一个 DelegateCommand 实现(基于 this )。 ICommand.CanExecute 确定绑定(bind)按钮是禁用还是启用。如果命令为空,则应隐藏该按钮。

(如果您使用的是正确的布局控件,如果未显示按钮,则按钮的位置会适当调整。)

为了支持以上四种情况,我向 DelegateCommand 添加了一个 CommandTitle 属性,以便按钮的内容来自那里。

接下来您需要一个 Title 属性作为对话框的标题。所以将它添加到 DialogVm

如果您希望能够通过执行命令关闭对话框(仅当它是Window 的子项时才有必要),您可以按照this approach 进行操作。 .当然,我已经使用了我在那里描述的版本。但其他人也看起来很有前途。

最后打开的点是一个属性,代表不同的对话框内容。如果我没记错的话,我使用了一小组 View 模型和相应的 DataTemplates(当然还有一个 TemplateSelector,它基于 VM 提供正确的模板类型)。当然,您的对话框中还需要一个 ContentPresenter 控件,它显示 TemplateSelector 提供的 DataTemplate

这是唯一的下站,如果您只有几种不同的对话框类型(例如问题框、消息框...),这只是一个好方法

使用非常简单。简单地,用所需的 ICommand 逻辑初始化一个 DialogVm 实例,DialogContentVm(无论你想如何调用它),将它传递给 DialogWindow(也许,您想使用一些不同的东西,例如弹出窗口)并将其呈现给用户。

嗯,希望对你有帮助。如果您需要更多信息或任何帮助,请告诉我。

关于c# - WPF 和 Prism 的通用对话框窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41463351/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com