.net Powershell:如何更改列表框项目颜色,以及在选中时如何更改它们
以下是我目前掌握的情况:.net Powershell:如何更改列表框项目颜色,以及在选中时如何更改它们,.net,user-interface,powershell,listbox,.net,User Interface,Powershell,Listbox,以下是我目前掌握的情况: foreach($group in $userBGroups.Items) { if($_.State -eq 'Selected') { try { $brush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::LightBlue) $_.Graphics.FillRectangle($brush, $_.bounds)
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()
}
}
}
这在大多数情况下都是有效的,除了您想要选择一个已经被涂成绿色的项目外,它似乎必须选择它一小段时间,然后立即恢复为绿色。我不知道是什么导致了这种行为
我知道,如果我在“选择的”逻辑中添加“或”语句来查找无加速器,我会将所有行都涂成浅蓝色,然后当我单击它们时,它们会突出显示深蓝色或浅绿色,如果它们本来是没有无加速器的颜色。因此我设法找到了解决问题的方法。我修改了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()
}
它会导致在选择项目后重新绘制时出现闪烁,但在我确定是否有办法解决该问题之前,闪烁是可行的。因此我设法找到了解决问题的方法。我修改了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()
}
当它重新绘制时,它会导致在选择一个项目后出现闪烁,但在我能够找出是否有办法解决该问题之前,它是可行的