2011-03-09 36 views
6

Chúng tôi đã tạo một số tập lệnh PowerShell tuyệt vời. Nhưng khi thời gian trôi qua, chúng tôi đã đưa các kịch bản cho những người không lập trình. Vì vậy, chúng tôi đã quyết định đã đến lúc cho một GUI đơn giản dễ hiểu cho PowerShell.Sử dụng WPK cho PowerShell GUI

Tôi đã xem kênh video 9 của James Brundage. Video của anh ấy thực hiện một công việc tuyệt vời để giải thích Cửa sổ, Bảng xếp hạng, Bảng điều khiển tài liệu, Lưới, Nhãn và Hộp văn bản. Tuy nhiên, có tổng cộng 60 điều khiển. Không biết WPF không giúp được gì.

Những gì tôi muốn làm là có thể làm như sau:

Text Input
Danh sách thả xuống
RadioButton Nhóm
Checkbox Nhóm

tôi đã đưa ra một ví dụ mà không được đầu tiên ba nhưng với lỗi.
Điều khiển vô tuyến hiển thị trực quan nút đầu tiên được chọn, nhưng khi tôi kéo giá trị cho nhóm thì không đúng.

Tôi không thể tìm thấy ví dụ cho Hộp kiểm.

Mọi mẹo sẽ được đánh giá cao.

Đây là thử nghiệm của tôi của WPK trong PowerShell:

function TestGui { 
    Import-Module WPK 

    $SelectedRadio = "First" 

    New-Window -Title "Test User Input" -WindowStartupLocation CenterScreen ` 
     -Width 400 -Height 300 -Show { 

     New-Grid -Rows 32*, 32*, 32*, 32* -Columns 100, 1* { 

     #create style to use on controls 
     $createLblStyle = @{ 
      Margin = 5 
      HorizontalAlignment = "right" 
      VerticalAlignment = "center" 
     } 

     #Label Text for this row 
     New-TextBlock -Text "Pick fruit" ` 
      -Row 0 -Column 0 @createLblStyle 

     # dropdown (combo box) 
     New-ComboBox -Name FruitList ` 
      -row 0 -column 1 @createLblStyle ` 
      -Items { "Apple", "Pear", "Peach" } -SelectedIndex 0 

     #Label Text for this row 
     New-TextBlock -Text "Pick number" ` 
      -Row 1 -Column 0 @createLblStyle 

     # TextBox 
     New-TextBox -Name TextInputName ` 
      -Row 1 -Column 1 @createLblStyle 

     #Label Text for this row 
     New-TextBlock -Text "Get Text Input" ` 
      -Row 2 -Column 0 @createLblStyle   

     #Do three radio buttons for this row. 
     New-StackPanel -Row 2 -Column 1 -Orientation Horizontal { 
      New-RadioButton -Content "Pick first" ` 
       -GroupName Results -IsChecked $True -On_Click { 
        $SelectedRadio = "First" 
       } 

      New-RadioButton -Content "Pick two" ` 
       -GroupName Results -On_Click { 
        $SelectedRadio = "Second" 
       } 

      New-RadioButton -Content "Pick three" ` 
       -GroupName Results -On_Click { 
        $SelectedRadio = "Third" 
       } 
     } 


     New-Button -Content "_Call PS Script" -Row 3 -Column 0 -Margin 3 -On_Click { 
      $FruitList   = $window | Get-ChildControl FruitList 
      $TextInputName  = $Window | Get-ChildControl TextInputName 
      $Results   = $Window | Get-ChildControl Results 

      $Window.Close() 
      write-host "call PS script with: " 
      write-host "DropDown => " $FruitList.SelectedValue 
      write-host "TextBox => " $TextInputName.Text 
      write-host "Radio => " $SelectedRadio 
    } 

     New-Button -Content "Cancel" -Row 3 -Column 1 -Margin 3 -On_Click { 
      $Window.Close() 
      write-host "Cancel was pressed" 
     } 
     } 
    } 
} 
+0

Sự cố với nút radio là gì? Tôi không thấy gì cả. –

+0

bernd, đó là khi tôi cố gắng lấy lại nút đã chọn, nó không cho tôi cái mà tôi đã chọn. – Razcer

+0

Tôi đã kiểm tra tất cả các trường hợp ban đầu, nút radio bên trái, phải, trái và 'Gọi PS Script' cho: Radio => Đầu tiên, Radio => Đầu tiên, Radio => Thứ ba, Radio => Đầu tiên. Bạn có luôn nhận được cùng một giá trị hoặc bạn nhận được các giá trị khác nhau, nhưng sai? –

Trả lời

0

Theo như tôi hiểu, bạn muốn tạo ra một giao diện đồ họa trên đỉnh của một kịch bản PowerShell bạn đã viết.

Ý kiến ​​của tôi là bạn có hai giải pháp kỹ thuật.

  1. Bạn xây dựng một giao diện đồ họa trên đỉnh Mẫu Windows, đó là con đường cũ để xây dựng GUI trong de .NET Framework
  2. Bạn xây dựng một giao diện đồ họa trên đỉnh của WPF, mà là một cách mới để xây dựng GUI trong de .NET Framework

trong giải pháp đầu tiên bạn có thể trực tiếp tạo mẫu của bạn với visual studio và "transform" nó, hoặc tạo ra nó với một công cụ Sapien công ty được gọi là "PrimalForms Community Edition" mà là một người thợ xây GUI miễn phí công cụ cho người dùng PowerShell. Bạn xây dựng GUI của bạn (giống như một .NET developper) và công cụ tạo mã Window Form trong cú pháp PowerShell. Bạn chỉ cần gọi hàm script của bạn ở đúng vị trí (được tạo cho mỗi khối kịch bản sự kiện). Giải pháp này là ok cho các hình thức bình thường.

Giải pháp WPF là một chút gần đây và đặc biệt dành riêng cho trường hợp bạn muốn thêm biểu đồ 2D hoặc 3D vào biểu mẫu hoặc thích ứng với kích thước màn hình khác nhau. Trong giải pháp này, bạn phải xây dựng một biểu diễn XAML của biểu mẫu của bạn (ví dụ như Visual Studio 2010 Expess) và sau đó tải nó vào PowerShell. Giải pháp này cần PowerShell 2.0 và Framework 3.5 được cài đặt cùng với các cờ đặc biệt (-STA) để khởi động PowerShell. Đối với tôi, module WPK là buid trên giải pháp này.

Nó cũng tồn tại cũng là cách tạo biểu đồ trong PowerShell.

Nếu bạn quan tâm đến một hoặc giải pháp khác, vui lòng cho tôi biết.

Tôi hy vọng điều đó sẽ hữu ích.

JP

+0

JP, Tôi đang cố gắng thực hiện việc này bằng PowerShellPack (WPK) chứ không phải bằng cách tạo biểu mẫu cửa sổ. ví dụ: Chạy một tập lệnh mở một cửa sổ nhỏ cho một số đầu vào đơn giản. Với một nút gọi nhiều tập lệnh hơn để sử dụng đầu vào được cung cấp. Tôi có thể làm cho nó làm việc với New-TextBox/New-ComboBox (bằng cách thêm các mục thủ công) nhưng tôi vẫn cố gắng tìm các ví dụ cú pháp cho New-RadioButton (List)/New-CheckBox (List) và có thể là ListBox thay vì ComboBox. – Razcer

0

Thay đổi để $Script:SelectedRadio trong On_Click scriptblocks của radiobutton.

0

Để tìm hiểu nào trong ba Radio Buttons của bạn đã được kiểm tra, bạn có thể sử dụng các biểu thức sau đây:

if (($Window | Get-ChildControl 'One').IsChecked) { 
    $SelectedRadioButton = '1' 
} elseif (($Window | Get-ChildControl 'Two').IsChecked) { 
    $SelectedRadioButton = '2' 
} elseif (($Window | Get-ChildControl 'Three').IsChecked) { 
    $SelectedRadioButton = '3' 
} 

Nếu bạn chỉ có một nhóm các nút radio, không có cần phải gán một tên nhóm . Cũng không cần sự kiện On_Click. Bạn có thể rút ngắn thời biểu New-RadioButton của bạn để:

New-RadioButton -Name 'One' -Content "Pick first" -IsChecked $true 
New-RadioButton -Name 'Two' -Content "Pick two" 
New-RadioButton -Name 'Three' -Content "Pick three" 

Để tìm hiểu, cho dù một Check Box:

New-CheckBox -Name 'Uno' -Content "Uno" 

đã được kiểm tra, bạn cũng sẽ suy ra tài sản IsChecked của nó:

Write-Host "Checkbox UNo => " ($Window | Get-ChildControl UNo).IsChecked 
Các vấn đề liên quan