6

当我运行以下命令时,PowerShell 挂起等待对话框关闭,即使对话框从未显示:

[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )
$d = New-Object Windows.Forms.OpenFileDialog
$d.ShowDialog( )

调用ShowDialog一个Windows.Forms.Form工作正常。我还尝试创建 aForm并将其作为父级传递给$d.ShowDialog,但结果没有什么不同。

4

3 回答 3

16

我能够复制您的问题并找到解决方法。我不知道为什么会发生这种情况,但它发生在其他人身上。

如果将 ShowHelp 属性设置为 $true,您将正确显示对话框。

例子:

[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )
$d = New-Object Windows.Forms.OpenFileDialog
$d.ShowHelp = $true
$d.ShowDialog( )

祝你好运!

于 2008-10-19T17:57:54.387 回答
2

在我看来,对话框实际上打开得很好,但它位于 powershell 控制台窗口的后面。不幸的是,它没有显示在任务栏中,因此除非您移动 powershell 窗口或 Alt+Tab,否则没有迹象表明它存在。看来 ShowHelp 解决方法对我没有任何影响。

编辑这是一种使用辅助形式想法的方法。基本思想是创建一个新表单,从其 Shown 事件中打开 OpenFileDialog。关键是在打开对话框之前在窗体上调用Activate,使窗体来到最前面并出现对话框。我通过将 Location 设置为屏幕外值将表单移到屏幕外,但您也可以从 Shown 事件内部设置 Form.Visible = $false。

[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )

$ofn = New-Object System.Windows.Forms.OpenFileDialog

$outer = New-Object System.Windows.Forms.Form
$outer.StartPosition = [Windows.Forms.FormStartPosition] "Manual"
$outer.Location = New-Object System.Drawing.Point -100, -100
$outer.Size = New-Object System.Drawing.Size 10, 10
$outer.add_Shown( { 
   $outer.Activate();
   $ofn.ShowDialog( $outer );
   $outer.Close();
 } )
$outer.ShowDialog()
于 2008-10-19T18:22:41.060 回答
1

显然这与多线程单元(MTA)模式有关。它似乎在单线程单元 (-STA) 模式下工作正常。

另请参阅:您能解释一下 STA 和 MTA 吗?

于 2014-06-27T09:30:28.633 回答