在WPF中设置文本框的默认文本

时间:2017-06-25 13:27:11

标签: wpf xaml textbox controltemplate

我需要所有文本框都有默认文本,所以我已经完成了this另一篇文章中的解释。我使用了Steve Greatrex提出的解决方案并标记为已接受。

它对我有用但现在我正在尝试改进它以在多个文本框中用作模板但是对于我的每个文本框我想设置自定义的不同默认文本。

由于模板默认文本设置为任何内容,例如"您的提示在这里"在上面的链接中,然后我绑定此模板的所有文本框都将具有相同的文本。

我想为每个文本框添加不同的默认文本,那么如何使用相同的controltemplate为所有文本框执行此操作?

在" Windows.Resources"我创建了一个样式,其中包含上面帖子中指出的模板:

<Style x:Key="DefaultText" TargetType="TextBox">
            <Setter Property="Template">
                <Setter.Value>

                       <!-- here the controltemplate from the above post -->

                </Setter.Value>
            </Setter>
</Style>

我以下列方式在文本框中使用它:

<TextBox Style="{StaticResource DefaultText}"/>

2 个答案:

答案 0 :(得分:0)

我已经通过以下方法替换了控制模板中textblock中的Text属性来解决它:

Text="{TemplateBinding Tag}" 

然后我从下面的任何文本框中调用它:

<TextBox Style="{StaticResource WatermarkedTextBox}"
         Tag="Type whatever here" />

您可以通过指定Tag属性为每个文本框选择默认文本。

此外,此解决方案不需要航空主题。

Clemens在此link中提出的解决方案也有效,它基于航空主题。

答案 1 :(得分:0)

使用自定义附加属性而不是没有任何特定语义的Tag

public static class TextBoxHelper
{
    public static readonly DependencyProperty DefaultTextProperty = DependencyProperty.RegisterAttached(
        "DefaultText",
        typeof(string),
        typeof(TextBoxHelper));

    [AttachedPropertyBrowsableForType(typeof(TextBox))]
    public static string GetDefaultText(FrameworkElement element)
    {
        return (string)element.GetValue(DefaultTextProperty);
    }

    public static void SetDefaultText(FrameworkElement element, string value)
    {
        element.SetValue(DefaultTextProperty, value);
    }
}

然后你可以在XAML中使用它:

xmlns:helpers="<your_namespace_with_helpers>"

<TextBox helpers:TextBoxHelper.DefaultText="..."/>

然后在您的ControlTemplate中,您可以设置Text,如下所示:

Text="{Binding Path=(helpers:TextBoxHelper.DefaultText), RelativeSource={RelativeSource TemplatedParent}}"

虽然这种方法比使用Tag属性更加冗长,但我建议你使用它,因为:

  1. 如果您的代码将由其他人维护,那么此人控制依赖Tag属性可能会包含任何内容,因为其类型为object,因此会出现意外情况。
  2. DefaultText附加属性具有严格的语义。任何人都可以说出只需要查看其名称和类型所需的内容。
  3. 经验法则总是尽量避免使用具有未定义语义的属性。