wpf - 等待窗口关闭并捕获窗口事件

标签 wpf multithreading events mvvm

我有一个窗口,它的数据上下文是一个 View 模型。现在,在 vm 和 window(view) 的范围之外,我有一个将被调用的方法。该方法需要显示窗口并让用户更改一些内容,然后当用户完成时,需要关闭窗口并继续该方法。棘手的是,我在窗口上的按钮绑定(bind)到 View 模型中的命令。这些命令会触发诸如“userCancelled”和“userOked”之类的事件。所以我想捕捉这些事件以知道何时关闭窗口并继续使用该方法。

如果我使用 ShowDialog 在窗口上,则不会捕获事件(我假设因为线程被捆绑等待对话框关闭)。但是,如果我使用 Show,该方法将继续运行。我需要它等待。我已经尝试过 Thread.Sleep,直到打开了某个 bool 值,但这也会占用线程并使窗口不可用(使用 .Show())。

我试过制作一个 backgroundWorker,但我仍然遇到同样的问题。

我知道我可以在按钮上使用代码隐藏,但是对于 OK 按钮,viewModel 必须验证其状态是否有效。让 View 与 View 模型协商违背了 MVVM 松散耦合风格的观点,对吗?

我正在自学 WPF 和 MVVM,我想把它做好,并在可行的情况下坚持良好的设计原则。我该怎么做?我究竟做错了什么?谢谢。

最佳答案

您可以使用 Prism 正确执行此操作和 WindowRegionAdapter .

  • 使用 WindowRegionAdapter 注册要显示/隐藏的 View (用户控件),以便在请求 View 时在新窗口中打开。
  • 为 View 的显示/隐藏/关闭创建 CompositePresentationEvents,并将它们放在一些常见的基础结构组件中。
  • 在包含 View 的模块的 Initialize 方法中,订阅在 2 中创建的事件并将它们链接到 OnShow/OnHide/OnClose 事件处理程序。
  • 在事件处理程序中,您可以使用 Prism 区域管理器从该区域添加/删除 View ,这将依次显示/隐藏/关闭窗口。您可以修改 WindowRegionAdapter 以精确地执行您希望它执行的操作。
  • 然后,每当您想显示/隐藏 View 时,您可以简单地在任何地方(在任何模块/ View 模型中)发布适当的显示/隐藏事件,并且将在订阅事件的模块中调用适当的事件处理程序,窗口将是显示为隐藏。

  • 是的,它有点复杂,但绝对值得投资,特别是如果您还需要打开其他窗口。保持东西非常干净。

    关于wpf - 等待窗口关闭并捕获窗口事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044761/

    相关文章:

    wpf - 从子usercontrol datagrid行动态加载父用户控件表单

    c# - C#有关线程安全的问题

    java - 同时将某些内容放入 map 时发生 NullPointerException

    wpf - 如何使用 xaml 将 WPF 应用程序窗口启动位置设置为右上角?

    c# - 如何从 Gridview 列内的超链接单击事件中获取绑定(bind)数据

    c# - 阻止 TreeView 中的自动水平滚动不起作用。 MVVM、XAML 方法

    javascript - 更新: How to find event listeners on a DOM node in prototype?

    java - 从线程的内部线程启动 android Activity 。

    javascript - 有没有办法使用按键将焦点写入( '| ')从一个输入更改为另一个输入?

    javascript - 主干 View 多次触发事件委托(delegate)