2017-02-20 98 views
0

我试图在Windows窗体应用程序中实现“分步指南”功能。这些指南只是对如何执行常见任务的逐步说明。我打算让用户在阅读指南时阅读说明。因此,在显示模式对话框时,显示它们的窗口必须为如何创建独立于模式窗口(.NET Windows窗体)的弹出窗口

这可能吗?如果是这样,我该怎么做?

+0

你的意思是像工具提示指向各自的控制?是的,这是可能的;只需创建相关窗口所拥有的窗口即可。一个UI模式对话框只是一个对话框,它禁用了它的所有者,而一个代码模式对话框只是运行它自己的消息泵;请阅读Raymond Chen的关于对话的系列文章以获取更多信息。 – andlabs

回答

0

感谢andLabs,Tim和IInspectable给我提供解决问题所需的信息。以下是我所需要的:

Thread myFormThread = new Thread(delegate() 
{ 
    Application.Run(new MyForm()); 
}); 
myFormThread.SetApartmentState(ApartmentState.STA); 
myFormThread.Start(); 

它工作正常。显然,如果需要通过主窗体的事件处理程序访问myForm上的控件,则需要小心使用myForm.BeginInvoke。您还需要帮助用户管理对表单的访问,因为它可能会丢失在其他窗口之后。

0

当显示一个模态时,不能与同一UI线程中的任何其他窗口交互。有可能(但可能不是世界上最好的想法)在C#中的同一个进程中运行两个不同的UI线程 - 但您必须非常小心才能保持稳定。在主线程中,运行常规模态窗体。在辅助线程中,可以同时运行非模态窗体 - 只需在该线程中运行一个专用的Windows消息泵,直到完成UI,然后关闭消息泵并退出线程。

+0

Modality通过禁用所有者窗口来实现。线程可以有任意数量的窗口,只有一个窗口被禁用,拥有模态对话框。系统中没有任何内容,它禁用了线程上的所有窗口。此外,只要不安装任何跨线程窗口层次结构(拥有者/拥有者或子/父),拥有多个UI线程并不具有挑战性。 – IInspectable