Есть ли способ изменить цвет определенного слова/строки во время выполнения элемента WPF ListBox?

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

т. е.: все добавленные новые элементы, содержащие строку/слово «Утверждено», должны быть окрашены в зеленый цвет, как только новый элемент будет добавлен в список WPF ListBox во время выполнения.

 private void dispatcherTimerMensagem_Tick(object sender, EventArgs e)
    {
        if (!(principalDB.testarConexãoDB()))
        {
            dispatcherTimerVendasFechadas.Stop();
            dispatcherTimerMensagem.Stop();
            LstMensagem.ItemsSource = null;
            LbPbVendasFechadas.ItemsSource = null;
        }
        else
        {
            mensagem = principalDB.selectMessagemUsuario(null);

            if (mensagem != string.Empty)
            {
                this.Activate();
                LstMensagem.Opacity = 1;
                LstMensagem.Items.Add(principalDB.mensagemRemetente + " (" + principalDB.mensagemData + ")" + ": " + mensagem);

                voice.Voice = voice.GetVoices().Item(0);

                myWorkerMensagem.WorkerReportsProgress = true;
                myWorkerMensagem.WorkerSupportsCancellation = true;
                myWorkerMensagem.RunWorkerAsync();

                if (VisualTreeHelper.GetChildrenCount(LstMensagem) > 0)
                {
                    Border border = (Border)VisualTreeHelper.GetChild(LstMensagem, 0);
                    ScrollViewer scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0);
                    scrollViewer.ScrollToBottom();
                }
            }
            else
            {
                LstMensagem.Opacity = 0.5;
            }
        }
    }

Таким образом, LstMensagem получит новый элемент во время выполнения из объявленных переменных в этой строке кода:

 LstMensagem.Items.Add(principalDB.mensagemRemetente + " (" + principalDB.mensagemData + ")" + ": " + mensagem);

Если появляется конкретное слово/строка, т.е. «одобрено», я хочу, чтобы эта строка имела другой цвет текста, например, окрашенный в зеленый цвет.


person Just Fair    schedule 28.08.2017    source источник
comment
Вы должны объяснить, что вы пытались сделать, и любой соответствующий код. трудно дать решение из предположения.   -  person Ginger Ninja    schedule 29.08.2017
comment
Я обновил свой вопрос. Пожалуйста, смотрите выше.   -  person Just Fair    schedule 29.08.2017
comment
Вы можете привязать цвет переднего плана элемента списка Control к тексту. и используйте конвертер, чтобы установить цвет.   -  person Ginger Ninja    schedule 29.08.2017
comment
Проблема в том, что я не хочу, чтобы весь элемент был установлен другим цветом, а только определенным словом/строкой. Если да, можете ли вы показать мне пример?   -  person Just Fair    schedule 29.08.2017


Ответы (1)


Вместо строки используйте TextBlock. Для всего элемента:

var text =  principalDB.mensagemRemetente + " (" + principalDB.mensagemData + ")" + ": " + mensagem;

var tb = new TextBlock();
tb.Text = text;

if(text.Contains("aproved"))
    tb.Foreground = Brushes.Green;

LstMensagem.Items.Add(tb);

Только для части элемента используйте свойство Inlines, чтобы добавить различные форматированные тексты:

var tb = new TextBlock();
tb.Inlines.Add(new Run { Foreground = Brushes.Green, Text = 
principalDB.mensagemRemetente});
tb.Inlines.Add(" (" + principalDB.mensagemData + ")" + ": " + mensagem);

LstMensagem.Items.Add(tb);
person dovid    schedule 28.08.2017
comment
звучит здорово! Я попробую завтра и дам вам знать как можно скорее. Спасибо! - person Just Fair; 29.08.2017
comment
@Iomed, это работает отлично, поэтому я проголосовал за ответ. Вы дали мне пример с использованием кода, и это было то, что я ищу. Большое спасибо. Кстати, есть ли способ выделить только это конкретное слово aproved , а не всю строку/элемент? - person Just Fair; 29.08.2017
comment
@BerBar, я не вижу вашего голоса ... для выделения только утвержденного слова вам нужно извлечь (методами IndexOf и Substring) текст до и после утвержденного слова и использовать встроенные строки, как я показал во втором фрагменте кода в примере - person dovid; 29.08.2017
comment
@iomed, конечно, потому что у меня недостаточно репутации SOF. Но я проголосовал и все еще говорю, что это не будет показано публично, потому что это. К сожалению :(. - person Just Fair; 29.08.2017
comment
@BerBar вам нужна репутация для vte, но вы можете принять ответ без репутации. чтобы принять ответ, нажмите на серую букву V рядом с моим ответом, заранее спасибо - person dovid; 29.08.2017