Как обновить передний.Цвет метки при изменении ее текста … кодом C # в WPF

#c# #wpf #visual-studio #winforms

#c# #wpf #visual-studio #winforms

Вопрос:

У меня есть динамическое содержимое для метки в WPF. Как я могу изменить цвет переднего плана метки при изменении текста метки, у меня есть код для Winform, но он мне нужен для WPF .. Код Winform на стороне конструктора

 this.lblSolar.Name= "lblSolar";
this.lblSolar.TextChanged   = new System.EventHandler(this.LblSolar_TextChanged);
  

Код функции text_Changed

 private void LblSolar_TextChanged(object sender, EventArgs e)
{
var solarCurrent= Convert.ToDouble(_sValues[(int)ValueOfRTC.SupplyCurrent]);
if (supplyCurrent < 1)
{
lblSupply.ForeColor= Color.Yellow;
}
else
{
// Assigning other colors.....
}
}
  

Но я не смог найти свойство «TextChanged» в WPF XAML .. тогда каково решение?
Заранее спасибо

Ответ №1:

Используйте текстовое поле вместо метки

vb.net

 Private Sub TextBox1_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextBox1.TextChanged
    TextBox1.Foreground = Brushes.Yellow
End Sub
  

C#

  private void TextBox1_TextChanged(object sender, TextChangedEventArgs e) {
    TextBox1.Foreground = Brushes.Yellow;
}
  

Комментарии:

1. зачем вам нужна метка?

Ответ №2:

В WPF метка — это не только элемент управления для представления текста. Это ContentPresenter, который также может отображать все виды элементов управления, отличные от текста. Таким образом, у него нет события изменения текста. Вообще говоря, вы не должны использовать события таким же образом при использовании WPF, как вы делали с winforms. Вам действительно следует подумать о том, чтобы начать использовать шаблон MVVM, поскольку это значительно облегчит вашу жизнь в долгосрочной перспективе (после грубого начала).

Однако, если вы настаиваете на том, чтобы в событиях usng для этого вам нужно использовать текстовое поле … НО вы можете сделать текстовое поле похожим на метку, подобную этой:

 this.lblSolar.Name= "lblSolar";
this.lblSolar.TextChanged   = new System.EventHandler(this.LblSolar_TextChanged);
this.lblSolar.BorderThickness = 0;
this.lblSolar.Background = System.Drawing.Color.Transparent;
this.lblSolar.IsReadOnly = True; 
  

Ответ №3:

То, что сказал Денис, верно. Если вы все еще хотите достичь этого с помощью Label, вы можете просто создать свой собственный элемент управления label, который предоставляет событие ContentChanged, подобное этому.

 public class MyLabel : Label
{
    static MyLabel()
    {
        ContentProperty.OverrideMetadata(typeof(MyLabel),
            new FrameworkPropertyMetadata(
                new PropertyChangedCallback(OnContentChanged)));
    }

    private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MyLabel lbl = d as MyLabel;
        if (lbl.ContentChanged != null)
        {
            DependencyPropertyChangedEventArgs args = new DependencyPropertyChangedEventArgs( ContentProperty, e.OldValue, e.NewValue);
            lbl.ContentChanged(lbl, args);
        }
    }

    public event DependencyPropertyChangedEventHandler ContentChanged;
}
  

Вы можете использовать это в XAML следующим образом.

 <local:MyLabel Content="Sample" ContentChanged="MyLabel_ContentChanged"/>