Формы Powershell - изменение цвета текста в списке - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь закодировать окно ведения журнала / процесса на основе списка в формах и хочу изменить цвет текста на основе текста, который я ему отправляю (например, обычный, красный для предупреждения, серый для информации)

Я действительно новичок в Forms, не говоря уже о кастомной работе, подобной этой, но я дошел до этого (кодирование цвета фона на самом деле не нужно, но я оставил его):

$ProgressBox_DrawItem = {
    param(
        [System.Object] $sender, 
        [System.Windows.Forms.DrawItemEventArgs] $e
    )
    $itemIndex = $e.Index
    # $lbItem= $Sender.Items[$e.Index]
    $BgColour=[System.Drawing.Color]::White
    $TextColour = [System.Drawing.Color]::DarkGray
    If ($itemIndex -eq ($ProgressBox.Items.Count - 1)) {
        Try {
            $BgColourBrush = new-object System.Drawing.SolidBrush($BgColour)
            $e.Graphics.FillRectangle($BgColourBrush, $e.Bounds)
            $itemText = $ProgressBox.Items[$itemIndex].ToString()
            $TextColourBrush = New-Object System.Drawing.SolidBrush($TextColour)
            $e.Graphics.DrawString($itemText, $e.Font, $TextColourBrush, (new-object System.Drawing.PointF($e.Bounds.X, $e.Bounds.Y)))
        }
        Finally {
            $BgColourBrush.Dispose()
            $TextColourBrush.Dispose()
        }
    }
    Else {
    } 
}
# Add new entry
$ProgressBox.Items.Add($InputText)
# Color new item
$ProgressBox.Add_DrawItem($ProgressBox_DrawItem)
# Relocate to bottom of listbox
$ProgressBox.TopIndex = $ProgressBox.Items.Count - 1
# Refresh listbox
$ProgressBox.Update()

Вышеприведенное работает, но оставляет список пустым, за исключением последнего элемента, который имеет правильные цвета, поэтому я предполагаю, что часть его работает нормально.

Я подозреваю, что неправильно понимаю, какэтот drawitem работает - он перерисовывает весь список?Поведение, на которое я надеялся, использовало «.Items.Add», чтобы добавить значение в цвете текста по умолчанию, а затем использовало его, чтобы добавить новую запись в другом цвете (оставив остальное «как есть»).

Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 14 декабря 2018

Есть много статей, объясняющих, как это сделать в C, но ни одной я не смог найти в PS, поэтому на случай, если кто-то еще столкнется с этим - вот как я решил проблему:

$ProgressBox.DrawMode = 'OwnerDrawFixed'
$ProgressBox_DrawItem = {
    param(
    [System.Object] $sender, 
    [System.Windows.Forms.DrawItemEventArgs] $e
    )
    If ($Sender.Items.Count -eq 0) {return}
    $lbItem=$Sender.Items[$e.Index]
    If ($lbItem.contains('Info')) {
        $TextColour = [System.Drawing.Color]::DarkGray
    }
    ElseIf ($lbItem.contains('(!)')) {
        $TextColour = [System.Drawing.Color]::Red
    }
    Else {
        $TextColour = [System.Drawing.Color]::Black
    }
    Try {
        $TextColourBrush = New-Object System.Drawing.SolidBrush($TextColour)
        $ItemText = $lbitem.ToString()
        $e.Graphics.TextRenderingHint = 'SingleBitPerPixelGridFit'
        $e.Graphics.DrawString($itemText, $e.Font, $TextColourBrush, (new-object System.Drawing.PointF($e.Bounds.X, $e.Bounds.Y)))
    }
    Finally {
        $TextColourBrush.Dispose()
    }
}
$ProgressBox.BeginUpdate()
$ProgressBox.Items.Add($InputText)
$ProgressBox.Add_DrawItem($ProgressBox_DrawItem)
$ProgressBox.TopIndex = $ProgressBox.Items.Count - 1
$ProgressBox.EndUpdate()

Это однакогораздо медленнее, чем просто нативный метод, и, как уже упоминалось выше, я очень плохо знаком с использованием форм, поэтому, если кто-то сможет его улучшить, не стесняйтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...