#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"/>