用于PowerShell的WPF GUI

时间:2018-04-17 15:00:38

标签: wpf powershell xaml user-interface

不知何故,我的XAML代码无法在PowerShell中运行。

<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"
    xmlns:local="clr-namespace:SD_Tools"
    mc:Ignorable="d"
    Title="Service Desk Tools" Height="450" Width="800" WindowStyle="None" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Border Name="Content" BorderBrush="Black" BorderThickness="0" HorizontalAlignment="Left" Height="412" Margin="139,38,0,0" VerticalAlignment="Top" Width="661" Background="#FFECF0F3"/>
    <Border Name="Nav" BorderBrush="Black" BorderThickness="0" HorizontalAlignment="Left" Height="450" VerticalAlignment="Top" Width="139" Background="#FF334351">
        <Border.Effect>
            <DropShadowEffect BlurRadius="16" Direction="361" RenderingBias="Quality" Color="#FFC5BEBE"/>
        </Border.Effect>
    </Border>
    <Border Name="Top" BorderBrush="Black" BorderThickness="0" HorizontalAlignment="Left" Height="38" Margin="139,0,0,0" VerticalAlignment="Top" Width="661" Background="#FF6B7B9E">
        <Border.Effect>
            <DropShadowEffect BlurRadius="16" Direction="1" RenderingBias="Quality" Color="#FFC5BEBE"/>
        </Border.Effect>
        <Button Name="Button_close" Content="X" HorizontalAlignment="Left" Height="38" Margin="615,0,0,0" VerticalAlignment="Top" Width="46" Background="{Null}" Foreground="White" FontFamily="Century Gothic" FontSize="16" FontWeight="Light" BorderBrush="{Null}"/>
    </Border>
    <Button Name="Button_Members" Content="Members" HorizontalAlignment="Left" Height="60" Margin="15,162,0,0" VerticalAlignment="Top" Width="119" Foreground="#FF00E8FF" BorderThickness="0" SnapsToDevicePixels="True" FontFamily="Century Gothic" FontWeight="Light" FontSize="14" BorderBrush="{Null}" Background="{Null}"/>
    <Button Name="Button_Device" Content="Device" HorizontalAlignment="Left" Height="60" VerticalAlignment="Top" Width="119" Foreground="#FF00E8FF" BorderThickness="0" SnapsToDevicePixels="True" FontFamily="Century Gothic" FontWeight="Light" FontSize="14" BorderBrush="{Null}" Background="{Null}" />
    <Button Name="Button___Permissions" Content="Permissions" HorizontalAlignment="Left" Height="60" Margin="10,73,0,0" VerticalAlignment="Top" Width="119" Foreground="#FF00E8FF" BorderThickness="0" SnapsToDevicePixels="True" FontFamily="Century Gothic" FontWeight="Light" FontSize="14" BorderBrush="{Null}" Background="{Null}"/>
    <Label Name="Label_members" Content="Geben Sie die gewünschte Gruppe ein, für welche Sie eine Liste erstellen wollen:" HorizontalAlignment="Left" Margin="160,92,0,0" VerticalAlignment="Top" FontFamily="Century Gothic"/>
    <TextBox Name="Box_members" HorizontalAlignment="Left" Height="23" Margin="160,122,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" MaxLines="1" FontFamily="Century Gothic"/>
    <Button Name="Button_search_members" Content="Suchen" HorizontalAlignment="Left" Height="46" Margin="160,361,0,0" VerticalAlignment="Top" Width="118" Background="#FF6B7B9E" FontFamily="Century Gothic"/>
    <Label Name="Label_device" Content="Geben Sie den Computernamen ein, für welchen Sie den Standort herausfinden möchten:" HorizontalAlignment="Left" Margin="160,92,0,0" VerticalAlignment="Top" FontFamily="Century Gothic"/>
    <TextBox Name="Box_device" HorizontalAlignment="Left" Height="23" Margin="160,122,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" MaxLines="1" FontFamily="Century Gothic"/>
    <Button Name="Button_search_device" Content="Suchen" HorizontalAlignment="Left" Height="46" Margin="160,361,0,0" VerticalAlignment="Top" Width="118" Background="#FF6B7B9E" FontFamily="Century Gothic"/>
    <Label Name="Label_permissions" Content="Von welchem User möchten Sie die Rechte nehmen:" HorizontalAlignment="Left" Margin="160,92,0,0" VerticalAlignment="Top" FontFamily="Century Gothic"/>
    <TextBox Name="Box_per_set" HorizontalAlignment="Left" Height="23" Margin="160,122,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" MaxLines="1" FontFamily="Century Gothic"/>
    <Label Name="Label_permissions2" Content="Welchem User möchten Sie die Rechte geben:" HorizontalAlignment="Left" Margin="160,162,0,0" VerticalAlignment="Top" FontFamily="Century Gothic"/>
    <TextBox Name="Box_per_get" HorizontalAlignment="Left" Height="23" Margin="160,199,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" MaxLines="1" FontFamily="Century Gothic"/>
    <Button Name="Button_search_1to1" Content="1:1" HorizontalAlignment="Left" Height="46" Margin="160,361,0,0" VerticalAlignment="Top" Width="118" Background="#FF6B7B9E" FontFamily="Century Gothic"/>
    <Button Name="Button_search_add" Content="Hinzufügen" HorizontalAlignment="Left" Height="46" Margin="333,361,0,0" VerticalAlignment="Top" Width="118" Background="#FF6B7B9E" FontFamily="Century Gothic"/>

</Grid>

我测试了另一个xaml代码并且工作正常,所以可能与.netframework或PowerShell脚本无关?

但是我的脚本看起来像这样:

&#13;
&#13;
#==============================================================================================
# XAML Code - Imported from Visual Studio Express WPF Application
#==============================================================================================
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = @'

  [XAML CODE HERE]

'@
#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}

#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================
$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name ($_.Name) -Value $Form.FindName($_.Name)}


#===========================================================================
# Shows the form
#===========================================================================
$Form.ShowDialog() | out-null
&#13;
&#13;
&#13;

我使用Visual Studio 2017生成了XAML,但我认为这并不重要...

提前多多感谢。

此致 罗宾; - )

1 个答案:

答案 0 :(得分:0)

您的XML无效。例如,您不能将元素分配给Null。此外,您错过了结束</Window>

我清理了一点XML。它应该加载Powershell

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
#Build the GUI
[xml]$xaml = @"
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
    Title="Service Desk Tools" Height="450" Width="800" WindowStyle="None" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Border Name="Content" BorderBrush="Black" BorderThickness="0" HorizontalAlignment="Left" Height="412" Margin="139,38,0,0" VerticalAlignment="Top" Width="661" Background="#FFECF0F3"/>
        <Border Name="Nav" BorderBrush="Black" BorderThickness="0" HorizontalAlignment="Left" Height="450" VerticalAlignment="Top" Width="139" Background="#FF334351">
            <Border.Effect>
                <DropShadowEffect BlurRadius="16" Direction="361" RenderingBias="Quality" Color="#FFC5BEBE"/>
            </Border.Effect>
        </Border>
        <Border Name="Top" BorderBrush="Black" BorderThickness="0" HorizontalAlignment="Left" Height="38" Margin="139,0,0,0" VerticalAlignment="Top" Width="661" Background="#FF6B7B9E">
            <Border.Effect>
                <DropShadowEffect BlurRadius="16" Direction="1" RenderingBias="Quality" Color="#FFC5BEBE"/>
            </Border.Effect>
            <Button Name="Button_close" Content="X" HorizontalAlignment="Left" Height="38" Margin="615,0,0,0" VerticalAlignment="Top" Width="46" Foreground="White" FontFamily="Century Gothic" FontSize="16" FontWeight="Light" />
        </Border>
        <Button Name="Button_Members" Content="Members" HorizontalAlignment="Left" Height="60" Margin="15,162,0,0" VerticalAlignment="Top" Width="119" Foreground="#FF00E8FF" BorderThickness="0" SnapsToDevicePixels="True" FontFamily="Century Gothic" FontWeight="Light" FontSize="14" />
        <Button Name="Button_Device" Content="Device" HorizontalAlignment="Left" Height="60" VerticalAlignment="Top" Width="119" Foreground="#FF00E8FF" BorderThickness="0" SnapsToDevicePixels="True" FontFamily="Century Gothic" FontWeight="Light" FontSize="14" />
        <Button Name="Button___Permissions" Content="Permissions" HorizontalAlignment="Left" Height="60" Margin="10,73,0,0" VerticalAlignment="Top" Width="119" Foreground="#FF00E8FF" BorderThickness="0" SnapsToDevicePixels="True" FontFamily="Century Gothic" FontWeight="Light" FontSize="14" />
        <Label Name="Label_members" Content="Geben Sie die gewünschte Gruppe ein, für welche Sie eine Liste erstellen wollen:" HorizontalAlignment="Left" Margin="160,92,0,0" VerticalAlignment="Top" FontFamily="Century Gothic"/>
        <TextBox Name="Box_members" HorizontalAlignment="Left" Height="23" Margin="160,122,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" MaxLines="1" FontFamily="Century Gothic"/>
        <Button Name="Button_search_members" Content="Suchen" HorizontalAlignment="Left" Height="46" Margin="160,361,0,0" VerticalAlignment="Top" Width="118" Background="#FF6B7B9E" FontFamily="Century Gothic"/>
        <Label Name="Label_device" Content="Geben Sie den Computernamen ein, für welchen Sie den Standort herausfinden möchten:" HorizontalAlignment="Left" Margin="160,92,0,0" VerticalAlignment="Top" FontFamily="Century Gothic"/>
        <TextBox Name="Box_device" HorizontalAlignment="Left" Height="23" Margin="160,122,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" MaxLines="1" FontFamily="Century Gothic"/>
        <Button Name="Button_search_device" Content="Suchen" HorizontalAlignment="Left" Height="46" Margin="160,361,0,0" VerticalAlignment="Top" Width="118" Background="#FF6B7B9E" FontFamily="Century Gothic"/>
        <Label Name="Label_permissions" Content="Von welchem User möchten Sie die Rechte nehmen:" HorizontalAlignment="Left" Margin="160,92,0,0" VerticalAlignment="Top" FontFamily="Century Gothic"/>
        <TextBox Name="Box_per_set" HorizontalAlignment="Left" Height="23" Margin="160,122,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" MaxLines="1" FontFamily="Century Gothic"/>
        <Label Name="Label_permissions2" Content="Welchem User möchten Sie die Rechte geben:" HorizontalAlignment="Left" Margin="160,162,0,0" VerticalAlignment="Top" FontFamily="Century Gothic"/>
        <TextBox Name="Box_per_get" HorizontalAlignment="Left" Height="23" Margin="160,199,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" MaxLines="1" FontFamily="Century Gothic"/>
        <Button Name="Button_search_1to1" Content="1:1" HorizontalAlignment="Left" Height="46" Margin="160,361,0,0" VerticalAlignment="Top" Width="118" Background="#FF6B7B9E" FontFamily="Century Gothic"/>
        <Button Name="Button_search_add" Content="Hinzufügen" HorizontalAlignment="Left" Height="46" Margin="333,361,0,0" VerticalAlignment="Top" Width="118" Background="#FF6B7B9E" FontFamily="Century Gothic"/>

    </Grid>
</Window>
"@ 

#Read XAML
$reader=(New-Object System.Xml.XmlNodeReader $xaml) 
$Form=[Windows.Markup.XamlReader]::Load( $reader )
<#
try{}
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}
#>
#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================
$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name ($_.Name) -Value $Form.FindName($_.Name)}


#===========================================================================
# Shows the form
#===========================================================================
$Form.ShowDialog() | out-null