2016-12-06 2 views
0

Ich baue gerade ein Powershell-Programm, das Betriebssysteminformationen in eine GUI zieht. Ich bin derzeit mit einem Problem zu haben, was ich denke, ist ungültig XAML-Code -XAML WPF GUI in Powershell

[void] [System.Reflection.Assembly]::LoadWithPartialName('presentationframework') 
[xml]$XAML = @' 
<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    Title="OS Details" Height="384.399" Width="525"> 
<Grid Margin="0,0,0,-12"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="281*"/> 
     <ColumnDefinition Width="236*"/> 
    </Grid.ColumnDefinitions> 
    <TextBox Name="textBox" Height="37" Margin="0,1,0,0" TextWrapping="Wrap" Text=" &#x9;    Operating System Details" VerticalAlignment="Top" FontSize="18" Background="#FF9BABF1" HorizontalAlignment="Left" Width="517" Grid.ColumnSpan="2"/> 
    <Label Name="HostName" Content="HostName" HorizontalAlignment="Left" Height="35" Margin="0,43,0,0" VerticalAlignment="Top" Width="246" Background="#FF9BABF1"/> 
    <Label Name="OSName" Content="OS Name" HorizontalAlignment="Left" Height="35" Margin="0,83,0,0" VerticalAlignment="Top" Width="246" Background="#FF9BABF1"/> 
    <Label Name="AvailableMemory" Content="Available Memory" HorizontalAlignment="Left" Height="35" Margin="0,123,0,0" VerticalAlignment="Top" Width="246" Background="#FF9BABF1"/> 
    <Label Name="OSArchitecture" Content="OS Architecture" HorizontalAlignment="Left" Height="35" Margin="0,163,0,0" VerticalAlignment="Top" Width="246" Background="#FF9BABF1"/> 
    <Label Name="WindowsDirectory" Content="Windows Directory" HorizontalAlignment="Left" Height="35" Margin="0,203,0,0" VerticalAlignment="Top" Width="246" Background="#FF9BABF1"/> 
    <Label Name="WindowsVersion" Content="Windows Version" HorizontalAlignment="Left" Height="33" Margin="0,243,0,0" VerticalAlignment="Top" Width="246" Background="#FF9BABF1"/> 
    <Label Name="SystemDrive" Content="System Drive" HorizontalAlignment="Left" Height="32" Margin="0,281,0,0" VerticalAlignment="Top" Width="246" Background="#FF9BABF1"/> 
    <TextBox Name="txtHostname" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="35" Margin="253,43,0,0" TextWrapping="Wrap" Text="&#xD;&#xA;" VerticalAlignment="Top" Width="254" TextChanged="textBox1_TextChanged"/> 
    <TextBox Name="txtOSName" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="35" Margin="253,83,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="254"/> 
    <TextBox Name="txtAvailMem" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="35" Margin="253,123,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="254"/> 
    <TextBox Name="txtOSArch" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="35" Margin="253,163,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="254"/> 
    <TextBox Name="txtWinDir" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="35" Margin="253,203,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="254"/> 
    <TextBox Name="txtWinVer" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="35" Margin="253,241,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="254"/> 
    <TextBox Name="txtSysDrv" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="32" Margin="253,281,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="254"/> 
    <Button Name="button" Grid.ColumnSpan="2" Content="Exit" HorizontalAlignment="Left" Height="27" Margin="10,318,0,0" VerticalAlignment="Top" Width="490"/> 

</Grid> 
</Window> 

'@ 

#Read XAML 
$reader=(New-Object System.Xml.XmlNodeReader $xaml) 
try{$Form=[Windows.Markup.XamlReader]::Load($reader)} 
catch{Write-Host "Unable to load Windows.Markup.XamlReader. Some possible  causes for this problem include: .NET Framework is missing PowerShell must be launched with PowerShell -sta, invalid XAML code was encountered."; exit} 

Wenn ich das ich laufe die „fängt“ Anweisung erhalte (Code von einem anderen Benutzer auf einer andere hilfreiche Website geschrieben wurde - https://blogs.technet.microsoft.com/platformspfe/2014/01/20/integrating-xaml-into-powershell/#comment-3105)

Irgendwelche Ideen, wo ich falsch liege?

Vielen Dank im Voraus!

Antwort

0

TextChanged="textBox1_TextChanged" ist das Problem, es gibt keine textBox1, so dass Ereignis nicht generieren kann. Sie sollten es nur sicher entfernen können, sobald Sie das Steuerelement in Ihr Skript laden, können Sie in Ihrem Code eine $txtHostName.Add_TextChanged definieren.

1

Wenn ich versuche, diesen XAML-Code in einem tatsächlichen WPF-Projekt zu verwenden ich folgende Fehlermeldung auf Build erhalten:

Fehler ‚Fenster‘ Wurzelelement erfordert ax: Class-Attribut Event-Handler in der XAML zu unterstützen Datei. Entfernen Sie den Ereignishandler für das TextChanged-Ereignis oder fügen Sie dem Stammelement ein x: Class-Attribut hinzu. Linie 20 Position 190

Das ist das Problem Linie:

<TextBox Name="txtHostname" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="35" Margin="253,43,0,0" TextWrapping="Wrap" Text="&#xD;&#xA;" VerticalAlignment="Top" Width="254" TextChanged="textBox1_TextChanged"/> 

Wenn Sie nicht brauchen, dass Textchanged-Ereignis, dort zu sein versuchen, sie zu löschen und sehen, ob das das Problem behebt.

0

Wie Asnivor angibt, können Sie ein Ereignis in Ihrem XAML nicht so verwenden.

Eine Option wäre, die TextChanged = "textBox1_TextChanged" aus der XAML herauszunehmen und das Ereignis zu Ihrem Code hinter hinzuzufügen.

$txtHostname.add_textchanged({ 

    Your code here 

})