Добавить записи в форму просмотра списка событий - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий пользовательский интерфейс, и мне нравится добавлять данные из событий System.IO.FileWatcher в просмотр списка без блокировки пользовательского интерфейса.

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')

# Load the WPF XAML Form
[xml]$XAML = @'
<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="315.885" Width="325.289">
        <Grid Margin="0,0,-0.2,0.2">
        <ListView Name="lvMain" HorizontalAlignment="Left" Height="196" Margin="6,53,-302,-249" VerticalAlignment="Top" Width="297" IsSynchronizedWithCurrentItem="False"/>
        <CheckBox Name="cbDelete" Content="Verwijderen" HorizontalAlignment="Left" Height="15" Margin="6,257,-106,-272" VerticalAlignment="Top" Width="100"/>
        <Button Name="btnClose" Content="Sluiten" HorizontalAlignment="Left" Height="20" Margin="216,254,-303,-274" VerticalAlignment="Top" Width="87"/>
        <TextBox Name="tbState" HorizontalAlignment="Left" Height="28" Margin="6,20,-303,-48" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="297" FontSize="20" TextAlignment="Center" FontWeight="Bold"/>

    </Grid>
</Window>

'@


# load xaml to reader
$reader=(New-Object System.Xml.XmlNodeReader $xaml)

# render the gui
$uiHash.Window=[Windows.Markup.XamlReader]::Load( $reader )

# Connect to form objects 
$xaml.SelectNodes("//*[@Name]") | %{
    Write-Verbose -Message "Loading $($_.Name) to `$uiHash.Windows.$($_.Name)" -Verbose
    $uiHash.Item($_.Name) = $uiHash.Window.FindName($_.Name) 
}


$uiHash.Window.ShowDialog() | Out-Null

часть ниже должна быть в отдельном потоке, я думаю, потому что иначесобытия сбивают поток GUI.

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$FileWatcher = New-Object System.IO.FileSystemWatcher
$FileWatcher.Path = Split-Path -Path "C:\temp\input.txt"
$FileWatcher.Filter = Split-Path -Path "C:\temp\input.txt" -Leaf
$FileWatcher.EnableRaisingEvents = $true  


### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY  
$Changed = Register-ObjectEvent $FileWatcher Changed -MessageData $uiHash -Action {
    $FullPath = $Event.SourceEventArgs.FullPath
    $ChangeType = $Event.SourceEventArgs.ChangeType
    Write-Verbose -Verbose -Message  "$(Get-Date), $ChangeType, $FullPath"
    $uiHash.Window.Dispatcher.Invoke('Normal',[Action]{    $uiHash.lvMain.Text.Add($(Get-Date)) })
    #$uiHash.ObservableCollection.Add(1)
}
...