2011-05-10 92 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" />