2015-01-17 2 views
0

Я пытаюсь создать текстовое поле Silverlight. Я хочу, чтобы фон текстового поля изменялся в зависимости от значения в нем. Он становится красным, если он находится под нулем, и он возвращается в белый цвет, когда он больше нуля.Как создать настраиваемое текстовое поле в Silverlight?

Как я могу это достичь?

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

Пользовательские TextBox

public class CustomTB: TextBox 
{ 
    protected override void OnTextInputUpdate(TextCompositionEventArgs e) 
    { 
     double val; 
     if (double.TryParse(e.Text, out val)) 
     { 
      e.Handled = true; 
     } 
    } 
} 

управления пользователя C# код

public partial class AlabdCustomTextBox : UserControl 
    { 
    public AlabdCustomTextBox() 
    { 
     InitializeComponent(); 
    } 
    private void CustomTB_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     double value; 
     if (double.Parse(customTB.Text) < 0) 
     { 
      customTB.Background = new SolidColorBrush(Colors.Red); 
     } 

     else 
     { 
      customTB.Background = new SolidColorBrush(Colors.White); 
     } 

     BindingExpression binding = this.GetBindingExpression(TextBox.TextProperty); 
     if (null != binding) 
     { 
      binding.UpdateSource(); 
     } 
    } 
} 

Пользователь управления XAML Код

<cc:CustomTB Name="customTB" Background="White" Text="{Binding Screen.ComparisonItems.SelectedItem.AdditionalCost}" TextChanged="CustomTB_TextChanged" /> 

ответ

2

Вы можете сделать это с помощью стандартного TextBox.

Просто привяжите цвет фона к длине текста через преобразователь, который возвращает red, когда значение меньше нуля и white в остальное время.

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    if (value == null) 
     return System.Windows.Media.Color.White; 

    if ((int)value < 0) 
     return System.Windows.Media.Color.Red; 

    return System.Windows.Media.Color.White; 
} 

Тогда в XAML:

<TextBox Text="{Binding Value, Mode=TwoWay}" 
     Background="{Binding Value, Mode=TwoWay, Converter={StaticResource myConverter}}" /> 

Где myConverter является преобразователь, созданный выше.

Это приведет к запуску преобразователя и при необходимости изменит цвет фона при изменении значения - когда текстовое поле теряет фокус.

Если вы хотите, чтобы сделать эту проверку на каждое нажатие клавиши вы можете добавить обработчик «KeyUp» для каждого текстового окна или просто подкласс TextBox класса и добавить переопределение для OnKeyDown метода:

class MyTextBox : TextBox 
{ 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     decimal value = 0; 
     if (Decimal.TryParse(this.Text, out value)) 
     { 
      if (value < 0) 
      { 
       this.Background = System.Windows.Media.Color.Red; 
      } 
      else 
      { 
       this.Background = System.Windows.Media.Color.White; 
      } 
     } 
     base.OnKeyDown(e); 
    } 
} 

Затем вы использовали бы это вместо стандартного TextBox, вам не нужен другой слой UserControl:

<MyControls:MyTextBox Text={Binding Value, Mode TwoWay}"/> 
Смежные вопросы