【问题标题】:Powershell GUI Label changePowershell GUI 标签更改
【发布时间】:2018-03-10 13:01:48
【问题描述】:

我正在使用 XAML 在 powershell 中构建一个 GUI。我将使用程序中正在发生的事情的文本更新 gui 标签/文本。

for($i in $array){
  if $i -eq "item"{
   add item to matcharray
  }
}

以这段代码搜索数组中的匹配项为例。 GUI 的标签会显示为“搜索匹配的数组”。然后当它进入代码的另一部分时,比如做一些数学函数。 GUI 会说“做数学函数” 到目前为止,我可以通过单击按钮来更新 GUI,但我希望它在执行那段代码后更新。至少让它在计时器上更新。我正在寻找一种自动更改标签文本的方法。只需一小段自动更改标签的代码就会有所帮助。

【问题讨论】:

    标签: wpf powershell xaml user-interface data-binding


    【解决方案1】:

    这实际上非常简单,这里有一点代码。 https://foxdeploy.com/functions/ise-snippets/xaml-to-gui/

    您使用该函数将 WFP 对象绑定到 Powershell 对象,并相应地对其进行更新。

    $inputXML = @"
    XAML
    "@       
    
    $inputXML = $inputXML -replace 'mc:Ignorable="d"','' -replace "x:N",'N'  -replace '^<Win.*', '<Window'
    
    [void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
    [xml]$XAML = $inputXML
    
    $reader=(New-Object System.Xml.XmlNodeReader $xaml)
    try {
        $Form=[Windows.Markup.XamlReader]::Load( $reader )
    } catch { 
        Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."
    }
    
    $xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name)}
    
    Function Get-FormVariables
    {
        if ($global:ReadmeDisplay -ne $true) {
            Write-host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow; $global:ReadmeDisplay=$true
        }
        write-host "Found the following interactable elements from our form" -ForegroundColor Cyan
        get-variable WPF*
    }
    
    Get-FormVariables
    
    #Updates the XAML thing named "label1"
    $WPFlabel1.Text = "This is the starting value!"
    
    $WPFbutton1.Add_Click({
    $WPFlabel1.Text = "This is the updated value!"
    })
    $Form.ShowDialog() | out-null
    

    您只需将代码放在 Add_Click 中,然后将更新后的文本放置在您希望它出现的任何位置。在计时器等上。

    【讨论】:

    • 好帖子。很确定这就是我在 powershell 中学习使用 XAML 的确切脚本 :)
    • 感谢@CoryEtmund,我刚刚为最近的一个项目自己学习了它,所以它让我记忆犹新。不过,如果没有该网站上的资源,我绝对无法做到。
    • 那个网站绝对有用。我试图在 Visual Studio 的 WPF 项目中创建我的第一个 XAML 表单,但我对 C# 没有太多经验。发现我可以用 PS 做到这一点,从那一刻起就非常高兴!
    【解决方案2】:

    你尝试过这样的事情吗?

    $Label.Text = "Whatever you want your label to say here"
    

    您可以将它添加到您希望它在代码中运行的任何位置,如果需要,可以多次添加。

    【讨论】:

    • 对于 XAML,它也可能是 $Label.Content
    • 是的,但问题在于更新 GUI。我可以设置文本。然后,如果我放另一行更改文本。 GUI 只显示第一组,永远不会更新到第二组。
    • 更新文本后执行此操作:[System.Windows.Forms.Application]::DoEvents() 这将强制更新表单,这应该会更改文本。
    • $Window.ShowDialog() 是显示表单的内容。如果您在显示表单之前设置了一些东西,那么这就是您将要看到的。在这种情况下,您只会看到“第二个”,因为这是在您激活表单之前设置的最新内容。 ShowDialog() 将停止您的脚本并等待交互,Show() 将显示您的表单,然后继续运行您的脚本。因此,要么将其更改为$Window.Show(),然后更新您的文本,要么单击按钮开始更改文本的过程。
    • 感谢 cet51。那效果很好。 $btnOK.Content = "Processing..." ; [System.Windows.Forms.Application]::DoEvents() 为我工作。这段代码可以放在一行上,这样可以稍微清理一下。
    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2011-11-14
    相关资源
    最近更新 更多