将 argb 转换为字符串

Кир*_*пин 4 powershell winforms

哪种方法允许将 ARGB 转换为字符串'int, int, int'?例子。将$Main背景色设置为一个字符串'0, 100, 200'。返回$Main.BackColor给出 ARGB 但不是字符串 '0, 100, 200':

$Main  = [System.Windows.Forms.Form] @{
    BackColor = '0, 100, 200'
}

$Main.BackColor
--------------
R             : 0
G             : 100
B             : 200
A             : 255
IsKnownColor  : False
IsEmpty       : False
IsNamedColor  : False
IsSystemColor : False
Name          : ff0064c8
Run Code Online (Sandbox Code Playgroud)

To.String()方法返回结果Color [A=255, R=0, G=100, B=200] 。这不是预期的。

目前我正在这样做:

 ('R', 'G', 'B').ForEach({ $Main.BackColor.$_ }) -join ', '

--------------
0, 100, 200
Run Code Online (Sandbox Code Playgroud)

但是,我希望有特殊的方法来转换 as ARGBto string, as stringto ARGB。这些方法是什么?谢谢

Mat*_*sen 5

但是,我希望有特殊的方法可以将 as argb 转换为 string,将 string 转换为 argb。这些方法是什么?

你会这么认为,但据我所知,不幸的是,没有内置的双向转换。

以下是您可以做的几件事:

创建自己的ConvertFrom-Color函数:

function ConvertFrom-Color
{
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [System.Drawing.Color[]]$InputColor
    )

    process {
        foreach($color in $InputColor){
            $color.R,$color.G,$color.B -join ', '
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在需要时使用:

PS C:\> $colorString = $Main.BackColor |ConvertFrom-Color
PS C:\> $colorString
0, 100, 200
Run Code Online (Sandbox Code Playgroud)

使用 [int]

一种ARGB颜色由 4 个 1 字节通道组成,完全适合 32 位整数。如果您需要使用单个参数传达不同的颜色,则已经支持:

PS C:\> $color = [System.Drawing.Color]'0,100,100'
PS C:\> $color.ToArgb()
-16751516
PS C:\> $argbValue = $color.ToArgb()
PS C:\> [System.Drawing.Color]::FromArgb($argbValue)

R             : 0
G             : 100
B             : 100
A             : 255
IsKnownColor  : False
IsEmpty       : False
IsNamedColor  : False
IsSystemColor : False
Name          : ff006464
Run Code Online (Sandbox Code Playgroud)

就像您的初始字符串表示一样,值得强调的是,[int]在分配给类型化属性时,从表示转换既适用于显式转换也适用于隐式转换:

$argbValue = -16751516
# This works just fine
[System.Drawing.Color]$argbValue
# As does this
[System.Windows.Forms.Form]@{ BackColor = $argbValue }
Run Code Online (Sandbox Code Playgroud)

覆盖 Color.ToString()

由于您对更改 的默认字符串表示形式的行为感兴趣System.Drawing.Color,您不妨覆盖ToString()方法实现:

Update-TypeData -TypeName System.Drawing.Color -MemberType ScriptMethod -MemberName ToString -Value {
    $this.psobject.Properties['R','G','B'].Value -join ', '
} -Force
Run Code Online (Sandbox Code Playgroud)

现在,当转换为字符串时,所有实例都[System.Drawing.Color]将使用您的自定义ToString()方法:

PS C:\> "$($Main.BackColor)"
0, 100, 200
Run Code Online (Sandbox Code Playgroud)