2016-03-22 2 views
1

私はWPFフォームを使用しているPowershellにログインスクリプトを持っています。私はそれがフォームをロードして、スクリプトの進捗状況でフォームを更新したい。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 
}) 

このスクリプトはまだ表示されていない形式で実行され、ゼロでカウンタを表示します。

フォームを表示するように設定すると、自動的にカウントダウンを開始する機能が起動されます。

答えて

1

Loadedイベントは、ウィンドウ全体の準備ができたらトリガーされます。レンダリング前の最後の停止。

これは少し早すぎますCountdownです。

ContentRenderedイベントを使用します。ここで

$Window.Add_ContentRendered({  
    Countdown 
}) 

Lifetime events of a WPF application

+0

パーフェクト良いリファレンスです!どうもありがとう。リンクありがとう - ウェブ上でこれを見つけるのに苦労しました。 – Ben

関連する問題