我正在尝试创建Silverlight自定义文本框。我希望文本框的背景根据其中的值进行更改。如果它低于零则变为红色,当它大于零时变为白色。
我怎样才能做到这一点?
我创建了一个简单的类和一个用户控件,但我还无法实现目标。这是代码
自定义文本框代码
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" />
答案 0 :(得分: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}"/>