ค้นหาเว็บไซต์

สนุกสนานมีสีสันยิ่งขึ้นด้วย PowerShell


ในโพสต์ Friday Fun ครั้งล่าสุดของฉัน ฉันได้แชร์โค้ด PowerShell บางส่วนสำหรับการแสดงค่า [System. Drawing.Color] จากคอนโซลโดยใช้ ANSI Escape Sequence หลังจากที่ฉันเผยแพร่บทความ ฉันพบว่าสิ่งที่จริงๆ ต้องการคือการแสดงชุดสีที่จะไม่ได้รับผลกระทบจากพื้นหลังของคอนโซล แบบฟอร์ม Windows Presentation Foundation (WPF) จะช่วยได้ ฉันสามารถใช้แบบฟอร์มเพื่อแสดงตัวอย่างสีได้ WPF เป็นเทคนิคที่มีประโยชน์ในการแสดงข้อมูล และไม่จำเป็นต้องเกี่ยวข้องกับไฟล์ XAML ที่ซับซ้อน

เริ่มต้นง่ายๆ

ฉันมักจะสร้างสคริปต์ PowerShell เพื่อสร้างเอาต์พุต WPF ที่ไม่ต้องอาศัยไฟล์ XAML สำหรับการแสดงผลแบบธรรมดา คุณสามารถทำทุกอย่างให้สำเร็จได้ด้วยโค้ด PowerShell ขั้นตอนแรกในโครงการ WPF คือการเพิ่มชุดประกอบที่จำเป็น

Add-Type -AssemblyName PresentationFramework

ขั้นแรกฉันเขียนโค้ดพิสูจน์แนวคิดเพื่อแสดงสีเดียว ในที่สุดฉันก็รู้ว่าฉันต้องการแสดงชุดสีทั้งหมด การมุ่งเน้นที่การแสดงสีเดียวจะช่วยระบุปัญหาที่อาจเกิดขึ้นหรือช่องว่างในความรู้ WPF ของฉัน ซึ่งฉันรู้ว่ายังมีอีกมาก

ขั้นตอนแรกคือการกำหนดรูปแบบหน้าต่าง

$form = New-Object System.Windows.Window
$form.Title = "Color Sample"
$form.Height = 100
$form.Width = 300
$form.top = 200
$form.left = 100
$form.UseLayoutRounding = $True
$form.WindowStartupLocation = "CenterScreen"

ชื่อคุณสมบัติควรอธิบายในตัวมันเอง เมื่อใช้ WPF ตัวควบคุม เช่น ปุ่มและกล่องข้อความ จะต้องอยู่ภายในคอนเทนเนอร์ เพื่อไม่ให้สับสนกับคอนเทนเนอร์ Docker สำหรับแบบฟอร์ม WPF แบบง่าย ฉันมักจะใช้ Stack Panel

$stack = New-Object System.Windows.Controls.StackPanel

ฉันคิดว่านี่เป็นชุดของชั้นวาง การควบคุมแต่ละรายการที่ฉันเพิ่มลงในสแต็กจะเรียงตามลำดับชั้น สแต็กของฉันต้องการเพียงกล่องข้อความเท่านั้น

$TextBox = New-Object System.Windows.Controls.TextBox
$TextBox.Width = 275
$textbox.Height = 30
$TextBox.HorizontalAlignment = "Center"
$textbox.TextAlignment = "center"
$textbox.VerticalContentAlignment = "center"
$textbox.FontSize = 16

อย่างไรก็ตาม ฉันรู้ว่าคุณอาจไม่คุ้นเคยกับคุณสมบัติของการควบคุมเฉพาะทั้งหมด ไม่มีปัญหา. คุณสามารถใช้ Get-Member

$TextBox | Get-Member

ฉันต้องการตั้งค่าพื้นหลังของกล่องข้อความให้เป็นสีที่ระบุและข้อความของกล่องข้อความเพื่อแสดงชื่อสีและค่า RGB นี่คือจุดที่ฉันไปถึงอุปสรรค์แรก

คุณสมบัติพื้นหลังคาดว่าจะมีประเภทอ็อบเจ็กต์ [System.Windows.Media.Brush]

ฉันตั้งใจที่จะให้ค่าชื่อ

$color = "cornsilk"

ฉันรู้ว่าฉันสามารถรับออบเจ็กต์ [System. Drawing.Color] ได้จากค่านี้

$sdc = [System.Drawing.Color]::FromName($color)

แต่นั่นเป็นวัตถุประเภทอื่น หลังจากการหาข้อมูลออนไลน์เล็กน้อยและเรียนรู้เพิ่มเติมเกี่ยวกับ WPF ฉันก็ได้ค้นพบคลาส [System.Windows.Media.BrushConverter] ฉันสามารถใช้สิ่งนี้เพื่อแปลงสีเป็นคลาส [System.Windows.Media.Brush] ตัวแปลงมีเมธอด ConvertFromString() พารามิเตอร์เป็นสตริงสี HTML เช่น #FFF8DC ฉันมีค่า RGB จาก [System. Drawing.Color] ฉันจะแปลงเป็นสตริง HTML ได้อย่างไร

ฉันได้เรียนรู้สิ่งใหม่อีกครั้ง ฉันไม่เคยสนใจรหัสสี HTML เลย ฉันรู้วิธีใช้แต่ไม่เคยคิดว่าจะสร้างขึ้นมาได้อย่างไร นี่คือตัวอย่างว่าทำไมฉันจึงคิดว่าจำเป็นต้องเข้าใจว่า เหตุใด PowerShell จึงทำงานและไม่ใช่แค่การสำรอกคำสั่งเท่านั้น ฉันค้นพบว่าโค้ด HTML คือค่า RGB ที่แปลงเป็นเลขฐานสิบหก ที่ฉันสามารถทำได้

สตริงรูปแบบคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ดังนั้นอย่าลืมใช้ X โดยเลข 2 หมายถึงการจัดรูปแบบเป็นสองตำแหน่ง ซึ่งมีความสำคัญเมื่อจัดรูปแบบค่าศูนย์ ด้วยเหตุนี้ ฉันสามารถแปลงค่าและตั้งค่าคุณสมบัติกล่องข้อความได้

$htmlcode = "#{0:X2}{1:X2}{2:X2}" -f $sdc.r, $sdc.g, $sdc.b
$textbox.background = [System.Windows.Media.BrushConverter]::new().ConvertFromString($htmlcode)
$name = $sdc.Name
$TextBox.Text = "$name ($($sdc.R),$($sdc.G),$($sdc.B))"

สิ่งที่เหลืออยู่คือการเพิ่มกล่องข้อความลงในสแต็ก เพิ่มสแต็กลงในแบบฟอร์ม และแสดงแบบฟอร์ม

$stack.AddChild($TextBox)
$form.AddChild($stack)
[void]$form.ShowDialog()

ตรวจสอบให้แน่ใจว่าใช้เมธอด ShowDialog() และ ไม่ใช่ Show() เมธอด ShowDialog() ส่งกลับค่าบูลีนที่ฉันแทบไม่ต้องเห็น ดังนั้นฉันจึงส่งเอาต์พุตไปที่ [Void] พรอมต์ PowerShell ของคุณจะถูกบล็อกจนกว่าคุณจะปิดแบบฟอร์ม

ฉันไม่ได้เพิ่มปุ่มลงในแบบฟอร์ม ฉันคลิก X เพื่อปิดหน้าต่าง

แสดง-SingleColor

ฉันรวมโค้ดทั้งหมดของฉันไว้ในฟังก์ชัน PowerShell อย่าลืมรวมคำสั่ง Add-Type ไว้ในไฟล์สคริปต์

Function Show-SingleColor {
    Param([string]$Color)

    $form = New-Object System.Windows.Window
    $form.Title = "Color Sample"
    $form.Height = 100
    $form.Width = 300
    $form.top = 200
    $form.left = 100
    $form.UseLayoutRounding = $True
    $form.WindowStartupLocation = "CenterScreen"

    $stack = New-Object System.Windows.Controls.StackPanel

    $TextBox = New-Object System.Windows.Controls.TextBox
    $TextBox.Width = 275
    $textbox.Height = 30
    $TextBox.HorizontalAlignment = "Center"
    $textbox.TextAlignment = "center"
    $textbox.VerticalContentAlignment = "center"
    $textbox.FontSize = 16
    #The drawing color may need to be converted to a brush color
    #convert color to html value
    $sdc = [System.Drawing.Color]::FromName($color)
    #get RGB values and convert to HTML
    $htmlcode = "#{0:X2}{1:X2}{2:X2}" -f $sdc.r, $sdc.g, $sdc.b
    $textbox.background = [System.Windows.Media.BrushConverter]::new().ConvertFromString($htmlcode)
    $name = $sdc.Name
    $TextBox.Text = "$name ($($sdc.R),$($sdc.G),$($sdc.B))"
    $stack.AddChild($TextBox)
    $form.AddChild($stack)
    [void]$form.ShowDialog()
}

ฟังก์ชันนี้เป็นเครื่องมือที่มีประโยชน์เมื่อฉันต้องการเห็นเพียงสีเดียว ซึ่งฉันอาจยังต้องการอยู่ มูลค่าที่แท้จริงของโค้ดของฉันทำหน้าที่เป็นตัวทดสอบและวางรากฐานสำหรับฟังก์ชัน WPF และ PowerShell ที่ซับซ้อนมากขึ้น ฉันจะดำดิ่งลงไปในครั้งต่อไป

บทความที่เกี่ยวข้อง