Как установить текст водяного знака в текстовом поле водяного знака

#c# #.net #wpf #silverlight

#c# #.net #wpf #silverlight

Вопрос:

У меня есть шаблон, подобный этому,

 <Style x:Key="WaterMarkTextBoxStyle" BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Grid>
                    <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    <TextBlock x:Name="textBlock" Opacity="0.345" Text="Enter Text Here" TextWrapping="Wrap" Visibility="Hidden" />
                </Grid>

                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsFocused" Value="False" />
                            <Condition Property="Text" Value="" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Visibility" TargetName="textBlock" Value="Visible" />
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  

Кажется, это довольно хорошо работает как текстовое поле водяного знака в WPF, но как я могу изменить, каким будет текст водяного знака?

Выше жестко задано значение Text = ‘Введите текст здесь’.

Если я использую вышеуказанное следующим образом,

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

На самом деле я не могу установить, что такое текст водяного знака.

Идеи?

Ответ №1:

Используйте прикрепленное свойство зависимости:

 public static class Watermark
{
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.RegisterAttached( "Text",
                                             typeof(Boolean),
                                             typeof(Watermark),
                                             new FrameworkPropertyMetadata() );

    public static void SetText( UIElement element, Boolean value )
    {
        element.SetValue( TextProperty, value );
    }

    public static Boolean GetText( UIElement element )
    {
        return (Boolean)element.GetValue( TextProperty );
    }
}
  

Затем для вашего контроля вы бы сделали что-то вроде:

 <TextBox Style="{StaticResource WaterMarkTextBoxStyle}" Watermark.Text="Search" />
  

Затем ваш стиль необходимо будет привязать к DP:

 <TextBlock x:Name="textBlock" Opacity="0.345"
           Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:Watermark.Text)}"
           TextWrapping="Wrap" Visibility="Hidden" />