Поведение-заполнитель для текстового поля в Silverlight - PullRequest
2 голосов
/ 30 января 2012

Есть ли какое-либо свойство для Textbox в Silverlight как заполнитель в теге ввода HTML? Я хочу дать пользователю подсказку, что это текстовое поле принимает в качестве входных данных. Например: Когда страница загружена, в TextBox есть строка типа «search here ...», и как только пользователь нажимает на TextBox, строка исчезает, и она появляется снова, если пользователь не вставил что-то, как только пользователь щелкнул мышью. это текстовое поле.

Ответы [ 2 ]

2 голосов
/ 29 октября 2012

Я сделал небольшое изменение / улучшение класса поведения водяных знаков Йохана, потому что он не учитывает изменения текстового поля из-за привязки.(то есть, допустим, у вас было:

<TextBox Text="{Binding AccountNumber,Mode=TwoWay}">
    <i:Interaction.Behaviors>
        <Behaviors:Placeholder Text="Enter Account #..." Foreground="Gray" />
    </i:Interaction.Behaviors>
</TextBox>

А затем в вашей модели представления:

    public string AccountNumber
    {
        get { return _accountNumber; }
        set { _accountNumber = value;
        RaisePropertyChanged("AccountNumber");
        }
    }

Теперь поведение обновляет водяной знак, если вы делаете что-то вроде "AccountNumber = string.Empty"где-то в вашем коде:

public class Placeholder : Behavior<TextBox>
{
    private bool _hasPlaceholder;
    private Brush _textBoxForeground;

    public String Text { get; set; }
    public Brush Foreground { get; set; }

    protected override void OnAttached()
    {
        _textBoxForeground = AssociatedObject.Foreground;

        base.OnAttached();
        if (Text != null)
            SetPlaceholderText();
        AssociatedObject.GotFocus += GotFocus;
        AssociatedObject.LostFocus += LostFocus;
        AssociatedObject.TextChanged += TextChanged;     
    }

    private void TextChanged(object sender, 
        TextChangedEventArgs textChangedEventArgs)
    {
        if (string.IsNullOrWhiteSpace(AssociatedObject.Text) &&
            FocusManager.GetFocusedElement() != AssociatedObject)
        {
            if (Text != null)
                SetPlaceholderText();
        }
    }

    private void LostFocus(object sender, RoutedEventArgs e)
    {
        if (string.IsNullOrWhiteSpace(AssociatedObject.Text))
        {
            if (Text != null)
                SetPlaceholderText();
        }
    }

    private void GotFocus(object sender, RoutedEventArgs e)
    {
        if (_hasPlaceholder)
            RemovePlaceholderText();
    }

    private void RemovePlaceholderText()
    {
        AssociatedObject.Foreground = _textBoxForeground;
        AssociatedObject.Text = "";
        _hasPlaceholder = false;
    }

    private void SetPlaceholderText()
    {
        AssociatedObject.Foreground = Foreground;
        AssociatedObject.Text = Text;
        _hasPlaceholder = true;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.GotFocus -= GotFocus;
        AssociatedObject.LostFocus -= LostFocus;
    }
}
1 голос
/ 30 января 2012

Вот как это сделать с помощью поведения:

http://weblogs.asp.net/jdanforth/archive/2010/09/17/silverlight-watermark-textbox-behavior.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...