在ShowDialog和Add_ContentRendered期间将文本添加到TextBox

时间:2019-04-14 16:00:13

标签: wpf powershell

在加载PowerShell WPF脚本时,我希望向用户显示一些信息,该脚本正在从Active Directory加载多个内容。 就像我现在的脚本一样,Window在加载过程中无响应(大约需要20秒),然后在完成所有操作后,将TextBox更新为四行,从而将文本添加到TextBox中。我希望它执行任务1,更新TextBox,然后任务2,更新TextBox,依此类推。我该怎么做?

在Add_ContentRendered块中,我有四个$ WPFlogTxtBox.AddText(“ Some text”),但是它们在Add_ContentRendered块完成时一次显示在$ WPFlogTxtBox中,而不是在脚本中显示时全部显示。

XAML包含:

<TextBox x:Name="logTxtBox" HorizontalAlignment="Left" Height="112" Margin="10,290,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="496" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"/>

脚本的其余部分浓缩了:

$Form.Add_ContentRendered({

$WPFlogTxtBox.AddText("Getting OUs")
$OUs = Get-ADOrganizationalUnit -Filter '*' | sort Name

$WPFlogTxtBox.AddText("Getting users")
$users = Get-ADUser -Filter * | sort Name

$WPFlogTxtBox.AddText("Getting groups")
$groups = Get-ADGroup -Filter '*' | sort Name

})

$Form.ShowDialog()

除了在完成Add-ContentRendered中的所有内容后将文本添加到TextBox中之外,这还行得通。

我希望AddText方法在运行命令时添加文本,而不是在整个调用块(Add_ContentRendered)完成时添加文本。

1 个答案:

答案 0 :(得分:0)

基本上,您需要产生线程以让窗口重新绘制...

$WPFlogTxtBox.Dispatcher.Yield("ApplicationIdle");

更好的解决方案是在另一个线程上完成工作,然后调用控件的调度程序进行更新。 Show-UI可以为您做这种事情,但是您可以自己旋转另一个PowerShell运行空间来完成它-有点麻烦了。查看github上的ShowUI代码,或来自Boe ProxStephen Owen

的博客文章
相关问题