2011-05-10 97 views
0

我有这样的一个模板,如何设置水印文本水印文字

<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> 

我不能实际设置水印的文字是什么。

想法?

回答

4

使用附加的依赖属性:

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" />