Powershell:如何更改列表框项的颜色,以及在选中时更改它们



到目前为止我已经有了:

foreach($group in $userBGroups.Items) {
    if($_.State -eq 'Selected') {
        try {
            $brush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::LightBlue)
            $_.Graphics.FillRectangle($brush, $_.bounds)
        } finally {
            $brush.Dispose()
        }
    } elseif($group -eq $lbItem) {
        try {
            $brush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::LightGreen)
            $_.Graphics.FillRectangle($brush, $_.Bounds)
        } finally {
            $brush.Dispose()
        }
    }
}

这在大多数情况下都是有效的,除了当你想选择一个已经被颜色为绿色的项目时,它似乎必须在一秒钟内选择它,然后它立即恢复为绿色。我不知道是什么原因导致了这种行为。

我知道,如果我添加"或"语句的'Selected'逻辑寻找NoAccelerator我最终着色所有行浅蓝色,然后当我点击他们,他们要么突出显示深蓝色或浅绿色,如果他们本来是没有NoAccelerator的颜色。

所以我设法找到了一个解决我的问题的方法。我修改了我的DrawItem事件,看起来像这样:

$userBGroups_DrawItem=[System.Windows.Forms.DrawItemEventHandler]{
    #Event Argument: $_ = [System.Windows.Forms.DrawItemEventArgs]
    if($userBGroups.Items.Count -eq 0) {return}
    $_.DrawBackground()
    $lbItem = $userBGroups.Items[$_.Index]
    $itemBGColor = [System.Drawing.Color]::White
    if($userBGroups.SelectedItems.Contains($lbItem)) {
        $itemBGColor = [System.Drawing.Color]::LightBlue
    } else {
        if($userBGroups.Items -contains $lbItem) {
            $itemBGColor = [System.Drawing.Color]::LightGreen
        } else {
            $itemBGColor = [System.Drawing.Color]::White
        }
    }
    try {
        $brush = New-Object System.Drawing.SolidBrush($itemBGColor)
        $_.Graphics.FillRectangle($brush, $_.Bounds)
    } finally {
        $brush.Dispose
    }
    $_.Graphics.DrawString($lbItem, $_.Font, [System.Drawing.SystemBrushes]::ControlText, (New-Object System.Drawing.PointF($_.Bounds.X, $_.Bounds.Y)))
}

关键是这段代码可以工作,但是缺少了一些东西。每当我选择了一个项目,然后选择了一个不同的项目,我仍然会保留之前的选择。为了解决这个问题,我做了以下选择更改事件:

$userBGroups_SelectedValueChanged={
    $userBGroups.Refresh()
}

它导致一个闪烁发生后,选择一个项目,当它重新绘制,但是可行的,直到我能弄清楚是否有办法解决这个问题。

相关内容

  • 没有找到相关文章

最新更新