有没有像 Window.ShowDialog() WPF 这样阻止 UI 线程

Posted

技术标签:

【中文标题】有没有像 Window.ShowDialog() WPF 这样阻止 UI 线程【英文标题】:Is there anyway to block UI Thread like as Window.ShowDialog() WPF 【发布时间】:2016-11-03 15:18:28 【问题描述】:

我正在开发一个不使用 Window.Show() 或 Window.ShowDialog() 的 WPF 应用程序,它只是一个简单的 MainWindow 并加载到指定的 UserControls 到占位符。

但问题是当应用程序在占位符中显示控件时,它不会像 Window.ShowDialog() 那样阻塞线程,我的意思是当用户控件嵌入到 MainWindow 中时,它可以像这样关闭回到主屏幕:

// Invoke foo control into placeholder
if (!ShowFooControl())

// TODO A: if control's result return false 
FooA();


// TODO B:just call after foo control closed
FooB();

return true;

FooB() 仅在 Foo Control 关闭后调用。

FooA() 仅在 Foo Control 关闭且 DialogResult = false 后调用。

我可以做些什么来为我的案例模拟 Window.ShowDialog。

谢谢。

【问题讨论】:

您想阻止除当前用户控件之外的所有内容?该用户控件是否在不同的窗口中? 我在理解你在做什么方面确实存在一些问题,据我所知,你有一个窗口,你可以在其中显示一些我假设用户操作的控件,并且你希望如果一个控件我显示了其余部分窗口被冻结,如何使用带有合适视图模型的控件的 IsEnabled 属性,以便在显示控件时,窗口上的其余控件的 IsEnabled 属性设置为 false? 嗨@Master117 是的,我想要的是:阻止调用 MainWindow 的当前 UserControl 以外的其他用户。谢谢 嗨@Sabrina_cs 我更新了我的问题。问题是我希望 ShowFooControl() 有类似 Window.ShowDialog() 的东西,它可以阻止其他代码,直到它关闭。谢谢 您是否尝试过手动阻止其他内容?但是你这样做的方式是你的所有控件都在同一个线程中运行。大多数元素都有 .disable() 或类似的东西。 【参考方案1】:

好的理解,获得你想要的东西的最好方法是我在第一个答案中所说的。 为了更好地向您解释这意味着什么,我制作了一个小型 WPF 应用程序作为示例。 我的应用程序有一个主窗口和 3 个不同的用户控件,每个控件都有一些功能和一个关闭按钮。 在主窗口中,我放置了三个按钮,用于在窗口内创建和显示控件,并在窗口中设置一个布尔属性,当显示用户控件时锁定任何其他控件,并在用户控件关闭后启用所有控件。您可以使用以下链接下载示例 http://blogs.dotnetwork.it/sabrina/download/SampleCode/DisableControls.zip

【讨论】:

以上是关于有没有像 Window.ShowDialog() WPF 这样阻止 UI 线程的主要内容,如果未能解决你的问题,请参考以下文章

WPF:window设置单一开启

使用模态和非模态形式的区别

有没有像 websocket 但不需要像 node 这样的框架的东西?

Oracle中有没有啥工具 可以像MSSQL的Profiler工具一样实时跟踪被执行的SQL语句

有没有办法以更像咖啡脚本的方式扩展原型?

有没有像“cvHoughCircles()”这样的opencv函数来进行正方形检测?