【问题标题】:XAML GUI to Powershell with variablesXAML GUI 到带有变量的 Powershell
【发布时间】:2016-09-28 11:30:31
【问题描述】:

Superuser 上的一位成员让我在 this guide 上为 powershell 脚本创建 GUI,但是我是这个领域的新手,所以我需要一些关于编码的指导。

这是 Visual Studio 2015 生成的 XAML 代码;

<Window x:Name="Title" x:Class="WpfApplication1.MainWindow"
    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:WpfApplication1"
    mc:Ignorable="d"
    Title="New Mailbox" Height="400" Width="420">
<Grid>
    <Image x:Name="image" HorizontalAlignment="Left" Height="100" Margin="14,10,0,0" VerticalAlignment="Top" Width="386" Source="C:\Users\Daniel Neocleous\Documents\Visual Studio 2015\Projects\WpfApplication1\WpfApplication1\Images\SibelcoLogo.png"/>
    <RadioButton x:Name="radioButton" Content="Step 1" HorizontalAlignment="Left" Margin="150,125,0,0" VerticalAlignment="Top"/>
    <RadioButton x:Name="radioButton_Copy" Content="Step 2" HorizontalAlignment="Left" Margin="217,125,0,0" VerticalAlignment="Top"/>
    <Button x:Name="button" Content="Create Mailbox" HorizontalAlignment="Left" Margin="150,152,0,0" VerticalAlignment="Top" Width="119" Height="35"/>
    <GroupBox x:Name="groupBox" Header="Output" HorizontalAlignment="Left" Height="169" Margin="10,192,0,0" VerticalAlignment="Top" Width="394">
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="147" Margin="0,0,-1.143,-0.714" TextWrapping="Wrap" VerticalAlignment="Top" Width="384"/>
    </GroupBox>

</Grid>

现在据我了解,我必须通过删除 x 和 x:Class="WpfApplication1.MainWindow" 字符串来修改此代码,并将以下内容添加到末尾;

#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

虽然假设我上面的内容是正确的,但我从这里有点卡住了。我如何将这一切与 Gui 联系起来?

GUI

有两个单选按钮,根据选择的一个,我希望运行不同的脚本并将 Powershell 输出显示在底部的文本框中,但我该如何实现呢?

我想在第 1 步运行的 Powershell

$credentials = get-credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri URL -Credential $credentials –AllowRedirection
Import-PSSession $Session
set-ADServerSettings -ViewEntireForest $true
Enable-RemoteMailbox -Identity test@test.com -RemoteRoutingAddress test@test.com.onmicrosoft.com
Enable-RemoteMailbox -Identity test@test.com -Archive

第 2 步

$msolcred = get-credential
connect-msolservice -credential $msolcred
Set-MsolUser -UserPrincipalName test@test.com -UsageLocation GB
$LicOpt = New-MsolLicenseOptions -AccountSkuId company:STANDARDPACK -DisabledPlans MCOSTANDARD
Set-MsolUserLicense -UserPrincipalName test@test.com -AddLicenses company:STANDARDPACK -LicenseOptions $LicOpt
Remove-PSSession $Session

谢谢大家的建议。

【问题讨论】:

    标签: c# wpf xaml user-interface powershell


    【解决方案1】:

    您的$Form 应该是Window 对象,因此支持其所有方法,因此要对某些事件做出反应,您必须读取控件的状态。

    由于这是基于脚本的,我只需命名所有相关部分并使用 FindName 搜索它们(您的脚本显然已经为所有命名控件创建了 powershell 变量)。然后,您可以访问IsChecked 之类的属性,以区分选择了哪个RadioButton。要收听按钮单击,您可能需要Register-ObjectEvent。当您使用ShowDialog 时,您有一个在设置DialogResult 时返回的阻塞调用,因此您应该在事件监听器中设置它。

    编辑:我只是在玩这个,这里有一个小示例,显示了基本过程。

    ScriptWindow.xaml

    <Window x:Name="Title"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel>
            <ListBox x:Name="selection" SelectionMode="Single">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <RadioButton IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                                     Content="{Binding}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
                <sys:String>Step 1</sys:String>
                <sys:String>Step 2</sys:String>
            </ListBox>
            <Button x:Name="run">Run</Button>
            <GroupBox Header="Output">
                <TextBox x:Name="output" IsReadOnly="True"/>
            </GroupBox>
        </StackPanel>
    </Window>
    

    ScriptWindow.ps1

    Add-Type –assemblyName PresentationFramework
    Add-Type –assemblyName PresentationCore
    Add-Type –assemblyName WindowsBase
    
    $xaml="ScriptWindow.xaml"
    $xmlReader=(New-Object System.Xml.XmlTextReader $xaml)
    $app=(New-Object System.Windows.Application)
    $form=[Windows.Markup.XamlReader]::Load( $xmlReader )
    $doc=(New-Object System.Xml.XmlDocument)
    $doc.Load($xaml)
    $run = $form.FindName("run")
    $selection = $form.FindName("selection")
    $output = $form.FindName("output")
    $run.Add_Click({ $output.Text = $selection.SelectedItem })
    $app.Run($form)
    

    显然你也可以通过Add_* 添加事件监听器,Register-ObjectEvent 对我不起作用。在回调中,我只是将所选选项分配给TextBox,您需要对所选值进行区分大小写并执行各自的操作。

    【讨论】:

    • 整体代码是否正确?我是脚本和编码的新手,所以我对一些术语有点陌生。我是否使用 FindName 或 GUI 部分等内容更改 PS 脚本?
    • 值得注意的是,如果遵循原始指南,它们会为每个对象生成变量,变量名称以$WPF 开头,它会为您列出所有变量。然后你只需找到你的按钮,并在其上执行.Add_Click({&lt;action goes here&gt;}) 方法。
    • @H.B.非常感谢你。我对您编写的 Powershell 脚本有点困惑,据我了解它链接到 GUI 上的按钮和各种控件,但是 GUI 和 ScriptWindow.ps1 文件如何调用步骤 1 和步骤 2 powershell 脚本?
    • @DanielNeocleous:正如我所说,他们不需要在Add_Click 的代码块中区分大小写,应该是微不足道的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2022-01-17
    • 1970-01-01
    • 2021-11-27
    • 2019-10-25
    • 2013-03-08
    相关资源
    最近更新 更多