2009-04-27 23 views
0

有没有办法开始以模态方式显示对话框,但不是隐藏它,而是将其更改为非模式对话框时将其保持可见状态?如何制作“部分”模式对话框?

我想显示一个对话框,阻止显示对话框的方法。然后,当用户单击我想要的对话框上的'完成'按钮时:

  • 对话框保持可见状态。
  • 控制返回到显示对话框的方法。

我已经通过在一个单独的STA线程上运行对话框并使用一个事件来阻止主UI线程直到按下'Finish'来实现这个结果,但是这个方法有一个问题:你可以点击在“主”窗口的关闭按钮上,而对话框可见时,隐藏对话框时主窗口关闭。

更新

感谢您的回应。对不起 - 它看起来像我在平衡了太多的背景和不足之间的错误。

该窗体实际上是一个模式化的“向导”对话框 - 它看起来,以模态方式位于主应用程序的前面,然后隐藏起来。因此,就用户而言,不存在不规范的怪异现象。唯一的区别是对话是由UI线程中的一系列回调驱动的,所以我不认为在它的生命周期中使它成为真正的模态(通过调用ShowDialog)是可行的。第一个回调必须显示对话框,然后在用户通过对话框UI设置其偏好时阻止。之后,对话框保持可见状态,并显示进度条页面,同时通过UI线程进行各种其他回调。最终形式是隐藏的。表单启动时,用户没有与主窗口进行交互。就他们而言,它看起来应该是主UI线程的100%模态。

(该表单是Visual Studio向导的对话框 - 这些由UI线程中的一系列回调驱动)。另一种方法是显示对话框,隐藏它,立即显示最顶层的“进度”表单,然后隐藏该对话框,但我认为展示单个对话框对用户而言更加无缝。

再次 - 抱歉混淆!

回答

0

我发现,在展示互动的阻塞阶段的主UI线程在一个看不见的模式对话框的伟大工程。隐藏模态对话框设置(所以它不可见):ShowInTaskBar = false,FormBorderStyle = None,size = {0,0},不透明度= 0%,StartupPosition = CenterParent。

隐藏的对话框使用ShowDialog显示在UI线程上。可见对话框显示在单独的STA线程中。在主UI线程上调用hiddenDialog.ShowDialog之前,线程被启动。

可见对话框隐藏hiddenDialog,当它想要完成初始阻塞状态时。这会阻止主UI线程阻塞。

代码的重要的位:

void LaunchWizardForm(s) 
{ 
    // Show the wizard on its own thread. 
    ThreadStart t =() => 
    { 
    _wizard = new WizardForm(s); 
    Application.Run(new ApplicationContext(_wizard)); 
    }; 
    var thread = new Thread(t); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 

    // Block this (main UI) thread 
    _hiddenForm.ShowDialog(); 
} 

void EndModalEpisode() 
{ 
    _hiddenForm.Invoke((Action) (() => _hiddenForm.Hide())); 
} 
6

也许你想重新考虑你的交互模型?你如何解释这个给你的用户?他们有一个计算机程序如何工作的内在模型,你最好有一个很好的理由来打破它。他们知道模态对话,他们知道非模态对话,他们知道检查员。选择一个,并应用它。

模态对话框用于短时间交互。他们不应该阻止退出应用程序。用户在控制交互,该程序只提供了所需的最小限制。

[解释后,替换] 显示模态对话框中的进度条有什么问题?单击开始处理,单击 ,禁用所有按钮,只保持取消按钮处于活动状态?如果需要很长时间,用户可能想中止操作。只有在完成处理后关闭对话框。

+0

希望的进一步的解释有助于澄清的用户交互。 – mackenir 2009-04-28 10:25:38

+0

这绝对是一种模态对话框 - 它在创建新项目时从用户那里获取设置,然后在生成项目时显示进度条。 – mackenir 2009-04-28 17:08:47

1

您可以使用无模式对话框,然后让您的主UI检查用户是否点击了完成按钮。如果无模式对话框打开但Finished未被点击,则不要对主窗体中的任何用户操作做出响应...

1

这只是一个可怕的想法 - 这是完全不规范的行为,你会通过各种箍跳得到的东西的工作,这只是要可怕的迷惑用户。

0

我会让它从猛推其他事情闪开你的应用的侧面或底部的弹出窗口。如果它是用户可能需要查看或与之交互的其他内容的顶部,那么它只会让他们烦恼。

1

最喜欢在这里说,你实现,这将是混乱大多数用户非标准UI元素其他的答案。

如果对话框保持可见,只提供只读数据访问,那么为什么不能有对话窗口正常关闭,并与从对话框窗口中的数据的应用程序中打开侧边栏窗口?

如果对话框仍然可见,以允许用户继续在它进行更新,那么也许,它不应该是有模式的开始。

要点是,有几种不同的方式可以完成您的任务,而不会破坏标准的UI隐喻。