有没有像 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 线程的主要内容,如果未能解决你的问题,请参考以下文章
有没有像 websocket 但不需要像 node 这样的框架的东西?