Wpf PowerShell XAML-将文本框文本获取到变量中

Wpf PowerShell XAML-将文本框文本获取到变量中,wpf,xaml,powershell,Wpf,Xaml,Powershell,我正在编写一个应用程序,其中需要有一个用于用户输入的对话框。我遇到的问题是,在用户单击按钮后,将文本框中的值放入变量中 [xml]$XAML_ConnectDialog = @" <Window Name="Form_ConnectDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/

我正在编写一个应用程序,其中需要有一个用于用户输入的对话框。我遇到的问题是,在用户单击按钮后,将文本框中的值放入变量中

[xml]$XAML_ConnectDialog = @"
<Window Name="Form_ConnectDialog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Connect" Height="176" Width="328" ResizeMode="NoResize" ShowInTaskbar="False">
    <Grid>
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                <GradientStop Color="#FFB4B4B4" Offset="1"/>
                <GradientStop Color="White" Offset="0.603"/>
            </LinearGradientBrush>
        </Grid.Background>
        <TextBlock TextWrapping="Wrap" Text="Enter the hostname or IP address of the remote host to connect to." Margin="10,0,10,91"/>
        <Label Content="Connect To:" HorizontalAlignment="Left" Height="27" VerticalAlignment="Top" Width="76" Margin="10,47,0,0"/>
        <Button Name="Btn_ConnectDialog_Connect" Content="Connect" Height="20" Margin="194,88,26,20" IsDefault="True"/>
        <TextBox Name="Txt_ConnectDialog_Input" HorizontalAlignment="Left" Height="23" Margin="91,51,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="208"/>
    </Grid>
</Window>
"@

$XML_Node_Reader_ConnectDialog = (New-Object System.Xml.XmlNodeReader $XAML_ConnectDialog)
$ConnectDialog = [Windows.Markup.XamlReader]::Load($XML_Node_Reader_ConnectDialog)
$Btn_ConnectDialog_Connect = $ConnectDialog.FindName('Btn_ConnectDialog_Connect')
$Txt_ConnectDialog_Input = $ConnectDialog.FindName('Txt_ConnectDialog_Input')


$Btn_ConnectDialog_Connect.Add_Click({
    $ConnectDialog.Hide()
    $var = $Txt_ConnectDialog_Input.Text.ToString()

})

write-host $var
$ConnectDialog.ShowDialog() | Out-Null
[xml]$XAML\u ConnectDialog=@”
"@
$XML\u Node\u Reader\u ConnectDialog=(New Object System.XML.XmlNodeReader$XAML\u ConnectDialog)
$ConnectDialog=[Windows.Markup.XamlReader]::加载($XML\u节点\u阅读器\u ConnectDialog)
$Btn\u ConnectDialog\u Connect=$ConnectDialog.FindName('Btn\u ConnectDialog\u Connect')
$Txt\u ConnectDialog\u Input=$ConnectDialog.FindName('Txt\u ConnectDialog\u Input'))
$Btn\u连接对话框\u连接。添加\u单击({
$ConnectDialog.Hide()
$var=$Txt\u ConnectDialog\u Input.Text.ToString()
})
写入主机$var
$ConnectDialog.ShowDialog()|输出空值
感谢您的帮助

谢谢

  • 在运行GUI之前,您正在使用
    Write Host$var
    。由于GUI首先用于定义变量,因此
    Write Host
    命令永远不会返回任何内容
  • 在单击eventhandler之前未定义
    $var
    。eventhandler是一个函数,因此该变量将在仅存在于函数内部的局部作用域中创建,然后在函数/eventhandler完成后删除。我通过指定eventhandler将值存储在
    script
    范围内的变量
    $var
    中来解决这个问题,因此它将在脚本完成之前一直可用
  • 固定脚本:

    [xml]$XAML_ConnectDialog = @"
    <Window Name="Form_ConnectDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Connect" Height="176" Width="328" ResizeMode="NoResize" ShowInTaskbar="False">
        <Grid>
            <Grid.Background>
                <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                    <GradientStop Color="#FFB4B4B4" Offset="1"/>
                    <GradientStop Color="White" Offset="0.603"/>
                </LinearGradientBrush>
            </Grid.Background>
            <TextBlock TextWrapping="Wrap" Text="Enter the hostname or IP address of the remote host to connect to." Margin="10,0,10,91"/>
            <Label Content="Connect To:" HorizontalAlignment="Left" Height="27" VerticalAlignment="Top" Width="76" Margin="10,47,0,0"/>
            <Button Name="Btn_ConnectDialog_Connect" Content="Connect" Height="20" Margin="194,88,26,20" IsDefault="True"/>
            <TextBox Name="Txt_ConnectDialog_Input" HorizontalAlignment="Left" Height="23" Margin="91,51,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="208"/>
        </Grid>
    </Window>
    "@
    
    $XML_Node_Reader_ConnectDialog = (New-Object System.Xml.XmlNodeReader $XAML_ConnectDialog)
    $ConnectDialog = [Windows.Markup.XamlReader]::Load($XML_Node_Reader_ConnectDialog)
    $Btn_ConnectDialog_Connect = $ConnectDialog.FindName('Btn_ConnectDialog_Connect')
    $Txt_ConnectDialog_Input = $ConnectDialog.FindName('Txt_ConnectDialog_Input')
    
    
    $Btn_ConnectDialog_Connect.Add_Click({
        $ConnectDialog.Hide()
        $script:var = $Txt_ConnectDialog_Input.Text.ToString()
    })
    
    $ConnectDialog.ShowDialog() | Out-Null
    write-host $var
    
    [xml]$XAML\u ConnectDialog=@”
    "@
    $XML\u Node\u Reader\u ConnectDialog=(New Object System.XML.XmlNodeReader$XAML\u ConnectDialog)
    $ConnectDialog=[Windows.Markup.XamlReader]::加载($XML\u节点\u阅读器\u ConnectDialog)
    $Btn\u ConnectDialog\u Connect=$ConnectDialog.FindName('Btn\u ConnectDialog\u Connect')
    $Txt\u ConnectDialog\u Input=$ConnectDialog.FindName('Txt\u ConnectDialog\u Input'))
    $Btn\u连接对话框\u连接。添加\u单击({
    $ConnectDialog.Hide()
    $script:var=$Txt\u ConnectDialog\u Input.Text.ToString()
    })
    $ConnectDialog.ShowDialog()|输出空值
    写入主机$var
    
    啊,是的,我想这可能与范围有关。非常感谢你的回答。