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