[英]How do I make a Powershell WPF form run a function when loaded (and display itself)?
我在 Powershell 中有一個登錄腳本,我使用的是 WPF 表單。 我希望它加載一個表單,然后使用腳本進度更新表單。
我在用:
$Window.Add_Loaded({
DoStuff
})
但是,發生的情況是腳本運行,然后在完成后加載表單。
如果我在表單上放一個按鈕來觸發腳本函數,表單將加載,然后按預期更新,即:
$Button.Add_Click({
DoStuff
})
一個簡化的例子如下:
Add-Type -AssemblyName presentationframework
[xml]$xaml = @"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Window" Title="Countdown" WindowStartupLocation="CenterScreen" WindowStyle="None" Background="#2C2A6F" ResizeMode="NoResize" Width="100" Height="140">
<StackPanel>
<Label Content="3" x:Name="Counter" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" FontWeight="Bold" FontSize="90" Padding="0,0,0,0" />
<Button Content="Go" x:Name="Button" />
</StackPanel>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load( $reader )
$Counter = $Window.FindName("Counter")
$Button = $Window.FindName("Button")
$Button.Add_Click({
Countdown
})
$Window.Add_Loaded({
})
Function Countdown(){
for($i=3; $i-ge 0; $i--) {
$Counter.Content = $i
$Window.Dispatcher.Invoke([Action]{},[Windows.Threading.DispatcherPriority]::ContextIdle);
Start-sleep -Seconds 1
}
}
$Window.ShowDialog()
這在加載表單時起作用,然后當我單擊按鈕時,它會倒計時到零。 但是,如果我將其更改為:
$Window.Add_Loaded({
Countdown
})
該腳本以尚未可見的表單運行,然后將計數器顯示為零。
如何設置它以便顯示表單,然后觸發該功能以自動開始倒計時?
當整個窗口准備就緒時,會觸發 Loaded 事件。 渲染前的最后一站。
這對你的Countdown
有點太早了。
使用 ContentRendered 事件。
$Window.Add_ContentRendered({
Countdown
})
這是一個很好的參考WPF 應用程序的生命周期事件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.