使用WPF為Powershell程序制作GUI界面


1. 使用Xaml創建應用界面

  打開visual studio,創建一個新的項目,在已安裝模板中選擇Visual C# →Wpf應用。

  完成創建后,我們得到如下圖所示的應用界面。

  

  wpf界面是基於xaml語言設計的,但是無需學習xaml,也可以用工具箱中的各種控件拖拽出不錯的布局(就像拖拽winform的控件一樣)。再配合屬性面板,修改各個控件的屬性,很容易就得到一個還看得過去的GUI界面。


  

  保存項目。在項目的目錄下找到MainWindows.xaml,將其復制一份,這個xaml文件將會成為powershell腳本應用的GUI布局文件。

## 2. 編寫powershell腳本

  新建powershell腳本。

  首先引用wpf framework/core程序集,使得powershell腳本具備創建wpf應用的能力。

Add-type -AssemblyName presentationframework, presentationcore

  接着創建wpf對象。

$wpf = @{ }

 

  在腳本中讀入xaml文件

$x = Split-Path -Parent $MyInvocation.MyCommand.Definition

$path = $x + ".\MainWindow.xaml"

$inputXAML = Get-Content -Path $path

$inputCleanXAML = $inputXAML -replace 'mc:Ignorable="d"','' -replace "x:N",'N' -replace 'x:Class=".*?"','' -replace 'd:DesignHeight="\d*?"','' -replace 'd:DesignWidth="\d*?"',''

  幾個說明:

  $x是該powershell腳本所在文件夾的絕對路徑,我將MainWindows.xaml放在與powershell腳本同級的文件夾下,使用 $MyInvocation.MyCommand.Definition獲取當前運行腳本所在路徑, Split-Path -Parent $MyInvocation.MyCommand.Definition即可獲得當前運行腳本所在的文件夾路徑。

  由於powershell只支持對xml的解析,所以需要對xaml稍微修改一下,使用-replace批量替換掉多余的字符。

$inputCleanXAML = $inputXAML -replace 'mc:Ignorable="d"','' -replace "x:N",'N' -replace 'x:Class=".*?"','' -replace 'd:DesignHeight="\d*?"','' -replace 'd:DesignWidth="\d*?"',''

 

  所有的xaml文件都可以使用這條語句來替換成xml。

  緊接着使用xmlReader解析xml,創建窗體。

[xml]$xaml = $inputCleanXAML

$reader = New-Object System.Xml.XmlNodeReader $xaml

$tempform = [Windows.Markup.XamlReader]::Load($reader)

  遍歷完xml的節點后,調用$wpf.MainWindow.ShowDialog()就可以顯示GUI窗體了。

  此時我們點擊窗體的按鈕,窗體還不會有反應,接下來添加交互邏輯。

  添加如下語句

$wpf.Confirm.add_Click({

#TODO...

})

  (在塊內添加單擊按鈕時你所需要執行的邏輯。)

  注意:我在創建wpf引用界面時,創建了一個名為“Confirm”的按鈕,所以這里的add_Click({})對應的就是該按鈕的點擊時引發的事件。

  保存powershell腳本文件,點擊運行,我們即可以得到一個GUI程序了,如下圖:

 

  這個powershell腳本是我寫的一個文本解析器,先點擊More...按鈕打開文件選擇框,選擇一個*.mod的文本文件,然后點擊確定生成按鈕獲得變量列表--一個csv文件。

  你可以在*https://github.com/Afuness/PowershellLab/tree/master/GUI*獲取源代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM