代码之家  ›  专栏  ›  技术社区  ›  nightcoder

是Form.ShowDialog()还是Form.ShowDialog(this)?

  •  45
  • nightcoder  · 技术社区  · 17 年前

    更新:

    好吧,我做了很多实验,在使用ShowDialog()时没有遇到任何真正意想不到的问题(没有指定所有者)。

    所以我认为这只是谣言,ShowDialog()可能会导致问题。

    10 回复  |  直到 17 年前
        1
  •  24
  •   pushkin Void Star    7 年前

    ShowDialog() ShowDialog(this) .

    newform.ShowDialog()

    运行TestApp,显示 newform.ShowDialog(this)

        2
  •  13
  •   nightcoder    13 年前

    为了更好地理解所有者关系:

    .NET允许一个窗体拥有其他窗体。自有表格对以下方面有用 浮动工具箱和命令窗口。拥有形式的一个例子是 最小化后,拥有的表单也会自动最小化。当A


    如 显示对话框 隐性关系是 确保所拥有的表单是活动表单,并且始终显示在

    这种关系的一个特征是,拥有的形式会影响 显示对话框 ):

    • 所有者表单不能最小化、最大化,甚至不能移动。
    • 当所拥有的表单被最小化时,所有者表单被最小化。
    • 只有拥有的表单才能关闭。
    • 如果所有者和拥有的表单都最小化,并且用户按Alt+Tab切换到拥有的表单,则拥有的表单将被激活。

    然而,与ShowDialog方法不同,对 展示 方法 做 不建立隐性所有者关系 这意味着 任何一种形式都可以是当前活动的形式。

    除主要形式外,最近活跃的形式是

    ShowDialog建立隐式所有者拥有关系 , 拥有的表单没有内置的回调或查询方式 表格的所有者财产,以建立所有者-所有者关系。作为一个 通过IWin32Window访问Win32 HWND属性。处理属性)。

    显式模态所有者所有形式中的形式行为 窗口,位于应用程序中的其他表单之上。第二,如果 用户按Alt+Tab从所有者切换,拥有的表单如下 西装。为了确保用户知道哪个表单是主表单, 最小化所有者隐藏了所有拥有表单的任务栏按钮,

    (c) 《Windows Forms 2.0编程》作者:Chris Sells、Michael Weinhardt。

        3
  •  9
  •   peterchen    17 年前

    “当前活动窗口”通常是指前台窗口,但仅当它属于当前线程时-请参阅 GetActiveWindow 在MSDN上。

    (实际信息在社区内容中,但评论者说得对,没有“每线程活动窗口”,AFAIK)。

    因此,当用户切换到另一个应用程序(或线程)窗口时,您最终会看到一些“默认窗口”。即使。NET在这里做了一些魔术,模态将被破坏:预期的父窗口不会被禁用(例如,您可以切换到主窗口并关闭它,或者修改一些东西,这通常会由于可重入性而破坏您的应用程序)。

    作为一个小麻烦,最初的立场通常是不正确的或误导性的。

    然而,在实践中,这种情况很少发生:如果你打开对话框以响应主窗口上的菜单或按钮点击,用户几乎永远不会切换到另一个窗口。

        4
  •  6
  •   Iralda Mitro    17 年前

        5
  •  2
  •   tjmaher    7 年前

    我的问题是打电话 ShowDialog() 结果是一个隐藏的表单,无法访问它来关闭它。

    读完这个话题后,我试着 ShowDialog(this) Dialogresult.OK

        6
  •  1
  •   PhantomLord    14 年前

        7
  •  1
  •   Clément    14 年前

    举个例子:

    ShowDialog() 在 AfterLabelEdit ).新表单不会显示在任务栏中。

    如果您的用户开始编辑标签,然后单击另一个应用程序,则会显示第二个表单,但当返回到您的应用程序时,用户只会看到您的主表单,由于显示了一个模态对话框,该表单被禁用。然而,通常的闪烁机制(如果您单击调用者,则会将模态对话框变为字体)将无法工作(肯定是因为AfterEdit调用尚未返回),并且您的用户将无法访问第二个表单,除非使用Ctrl+Tab在打开的窗口中循环。

    召唤 ShowDialog(this) 修复了这个问题。

        8
  •  0
  •   Zaher Ahmad Al-Bluwe    13 年前

        9
  •  0
  •   valsidalv    11 年前

    this 造成了严重的问题。

    启动后,我的应用程序会强制自己进入全屏模式,并确保它始终有焦点,即使用户试图退出Alt+Tab,除非您以管理员或开发人员身份登录。

    ShowDialog() 在自定义窗体上出现对话框 后面 由于某种原因,我的应用程序变得没有响应,因为对话框当前处于活动状态。如果我使用 ShowDialog(this)