如何在Silverlight中创建自定义文本框控件?

时间:2015-01-17 19:30:44

标签: c# wpf xaml silverlight

我正在尝试创建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" />

1 个答案:

答案 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}"/>