Hey guys,
Been struggling to get my head round this for a few weeks now so I’m finally giving in and asking for help!
I’m creating a GUI using WPF, formatted as XML, and I’m trying to use PoshRSJob for backgrounding tasks, etc, with a Synchronized Hashtable to share data between runspaces…
I’m struggling to understand how I need to format things - I’ll show you what I have so far.
I have this to load the App.xaml file generated by Visual Studio and I’m fairly sure this is OK:
function Get-XamlObject
{
[CmdletBinding()]
param (
[Parameter(Position = 0,
Mandatory = $true,
ValuefromPipelineByPropertyName = $true,
ValuefromPipeline = $true)]
[Alias("FullName")]
[System.String[]]$Path
)
BEGIN
{
Set-StrictMode -Version Latest
$wpfObjects = @{ }
Add-Type -AssemblyName presentationframework, presentationcore
} #BEGIN
PROCESS
{
try
{
foreach ($xamlFile in $Path)
{
#Change content of Xaml file to be a set of powershell GUI objects
$inputXML = Get-Content -Path $xamlFile -ErrorAction Stop
$inputXMLClean = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace 'x:Class=".*?"', '' -replace 'd:DesignHeight="\d*?"', '' -replace 'd:DesignWidth="\d*?"', ''
[xml]$xaml = $inputXMLClean
$reader = New-Object System.Xml.XmlNodeReader $xaml -ErrorAction Stop
$tempform = [Windows.Markup.XamlReader]::Load($reader)
#Grab named objects from tree and put in a flat structure
$namedNodes = $xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]")
$namedNodes | ForEach-Object {
$wpfObjects.Add($_.Name, $tempform.FindName($_.Name))
} #foreach-object
} #foreach xamlpath
} #try
catch
{
throw $error[0]
} #catch
} #PROCESS
END
{
Write-Output $wpfObjects
} #END
}
$path = '*path to folder containing xaml files*'
This is where I’m not so sure… I’ll comment the code with what I’m trying to do with each section - hoping someone can tell me where I’m going wrong!
#creating the hashtable
$SyncHash = [hashtable]::Synchronized(@{})
#adding the xaml code to the hashtable just created
$syncHash.wpf = Get-ChildItem -Path $path -Filter *.xaml -file | Where-Object { $_.Name -ne 'App.xaml' } | Get-XamlObject
#scriptblock for RSJob (not really understanding what needs to be put in here and what doesn't)
$ScriptBlock = {
Param($SyncHash)
#something to do with setting the hashtable to the syncroot properly (?)
[System.Threading.Monitor]::Enter($SyncHash.SyncRoot)
[pscustomobject] @{
#I have various functions like this to show different pages, calculate things, etc, this is just an example of the kind of thing that they do
function Get-Results {
$script:syncHash.home_Grid.Visibility = 'Collapsed'
$script:syncHash.processing_Grid.Visibility = 'Collapsed'
$script:syncHash.results_Grid.Visibility = 'Visible'
}
function Update-ProgressBar {
while ($script:syncHash.displayThreatLevel -lt $script:syncHash.threatLevel) {
Write-Output $script:syncHash.displayThreatLevel $script:syncHash.threatLevel
$script:syncHash.displayThreatLevel += 1
Start-Sleep -Milliseconds 100
Display-ThreatLevel
}
}
$SyncHash.Email_Check.ShowDialog() | Out-Null
[System.Threading.Monitor]::Exit($SyncHash.SyncRoot)
}
}
Start-RSJob -Name {$_} -ScriptBlock $ScriptBlock -ArgumentList $wpf -FunctionsToLoad Get-Home |
Wait-RSJob -ShowProgress