私はWPFとイベントハンドリングの初心者です。達成したいのは、ボタンをクリックするだけです。プログレスバーは0〜100 。しかし、次のコードを実行すると、add_clickブロック内のコード全体が計算され、ループ内の最後の反復のみが表示されます。 私は多分それが愚かな解決策であることは知っていますが、私はこれにいくつかの助けが必要です。
$syncHash = [hashtable]::Synchronized(@{})
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState = "STA"
$newRunspace.ThreadOptions = "ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$psCmd = [PowerShell]::Create().AddScript({
$XamlPath="C:\Forms\MyFormsv1.xaml"
$inputXML = Get-Content -Path $XamlPath
[xml]$Global:xmlWPF = $inputXML -replace 'mc:Ignorable="d"','' -replace "x:N",'N' -replace '^<Win.*', '<Window'
#Add WPF and Windows Forms assemblies
try{
Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,system.windows.forms
} catch {
Throw “Failed to load Windows Presentation Framework assemblies.”
}
$syncHash.Window=[Windows.Markup.XamlReader]::Load((new-object System.Xml.XmlNodeReader $xmlWPF))
[xml]$XAML = $xmlWPF
$xmlWPF.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | %{
$Global:synchash.Add($_.Name,$synchash.Window.FindName($_.Name))}
function tool1_progress{
$var1=50
for($index=1 ; $index -le $var1; $index++)
{
[int]$tmpProgNum= ($index/$var1) * 100
$syncHash.tool1_pb.Value= $tmpProgNum
$syncHash.consoleOutput.Text=$index
Start-Sleep -Milliseconds 250
}
}
$syncHash.myButton.add_click({tool1_progress})
$syncHash.Window.ShowDialog() | out-null
})
$psCmd.Runspace = $newRunspace
$data = $psCmd.BeginInvoke()
$ TOOL1ラベルです。 $ tool1_pbはプログレスバーです。 $ consoleOutputは のテキストボックスです。
コードは、ループを実行している間にUIを更新できないことを意味するUIを更新する同じスレッドで実行されます。 – mm8
ええ、私はスレッドの問題のいくつかの並べ替えが必要であることを知っています、あなたは私にこの問題の世話をする方法のソリューションを提供できますか?しかし、ありがとう。 :) –
'BeginInvoke()'を使って新しいランスペースを作成する必要があります。これは私があなたと同じことをしようとしていたときに私を助けました。 https://learn-powershell.net/2012/10/14/powershell-and-wpf-writing-data-to-a-ui-from-a-different-runspace/ – Nick