Silverlight中文本框的占位符行为

Silverlight中文本框的占位符行为,silverlight,Silverlight,Silverlight中的Textbox是否有html输入标记中类似占位符的属性? 我想向用户提供一些提示,说明此文本框的输入内容。。 例如: 加载页面时,文本框中有一个字符串,如“search here…”,当用户单击文本框时,该字符串将消失,如果用户没有在该文本框中插入内容,则该字符串将再次出现。以下是如何使用行为: 我对Johan的水印行为类做了一点修改/增强,因为它不考虑文本字段因绑定而发生更改的时间。(即,假设您有: <TextBox Text="{Binding Account

Silverlight中的Textbox是否有html输入标记中类似占位符的属性? 我想向用户提供一些提示,说明此文本框的输入内容。。 例如:
加载页面时,文本框中有一个字符串,如“search here…”,当用户单击文本框时,该字符串将消失,如果用户没有在该文本框中插入内容,则该字符串将再次出现。

以下是如何使用行为:


我对Johan的水印行为类做了一点修改/增强,因为它不考虑文本字段因绑定而发生更改的时间。(即,假设您有:

<TextBox Text="{Binding AccountNumber,Mode=TwoWay}">
    <i:Interaction.Behaviors>
        <Behaviors:Placeholder Text="Enter Account #..." Foreground="Gray" />
    </i:Interaction.Behaviors>
</TextBox>
现在,如果在代码中的某个地方执行类似“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;
    }
}
公共类占位符:行为
{
私人boolu has占位符;
私人画笔(前景);;
公共字符串文本{get;set;}
公共笔刷前景{get;set;}
受保护的覆盖无效附加()
{
_textBoxForeground=AssociatedObject.Foreground;
base.onatached();
如果(文本!=null)
设置占位符文本();
AssociatedObject.GotFocus+=GotFocus;
AssociatedObject.LostFocus+=LostFocus;
AssociatedObject.TextChanged+=TextChanged;
}
私有无效文本已更改(对象发送者,
textchangedventargs textchangedventargs)
{
if(string.IsNullOrWhiteSpace(AssociatedObject.Text)&&
FocusManager.GetFocusedElement()!=关联对象)
{
如果(文本!=null)
设置占位符文本();
}
}
私有void LostFocus(对象发送方,RoutedEventArgs e)
{
if(string.IsNullOrWhiteSpace(AssociatedObject.Text))
{
如果(文本!=null)
设置占位符文本();
}
}
private void GotFocus(对象发送方,RoutedEventArgs e)
{
如果(_haspocholder)
移除占位符文本();
}
私有void removePlaceholder文本()
{
AssociatedObject.Foreground=\u textBoxForeground;
AssociatedObject.Text=“”;
_haspholder=false;
}
私有void SetPlaceholderText()
{
AssociatedObject.前台=前台;
AssociatedObject.Text=文本;
_haspholder=true;
}
附加时受保护的覆盖无效()
{
base.OnDetaching();
AssociatedObject.GotFocus-=GotFocus;
AssociatedObject.LostFocus-=LostFocus;
}
}

html输入中的占位符标记是什么?不太清楚您想要实现什么非常简单…非常感谢您他们有一个问题-当我将其连接到文本框并运行程序时,它不会显示水印,除非我单击文本框并再次失去焦点。我不明白为什么会发生。请您帮助这让我明白了…谢谢…谢谢,这是绑定时更好的解决方案。请注意,此实现不幸有点缺陷。它会将
说明…
文本绑定到数据绑定值中,至少我是这样做的(注意:我正在使用一种特殊行为来延迟绑定,这可能会影响它-YMMV)。它还将使用不正确的占位符颜色呈现预填充文本。我正在寻找另一种解决方案,在另一个文本框的顶部显示一个文本块,当文本框接收到焦点时,该文本块将隐藏。
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;
    }
}