рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдпрд╣ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлреИрд╢рдиреЗрдмрд▓ рднреА рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдкрд░ рдХреБрдЫ рдорджрдж рднреА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рд╕рдм рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╕реНрд╡реАрд░ рдХреА рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдмрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХреБрдЫ рднреА рджрд░реНрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдПрдХ рд╕рдВрдХреЗрдд рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдкрд╛рда рджрд░реНрдЬ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЯреВрд▓рдЯрд┐рдк рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рднрдЧрд╡рд╛рди рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЯреНрд░рд┐рдЧрд░реНрд╕ рдХреЛ Windows рд╕реНрдЯреЛрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ
ControlTemplate рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдкрдХреЛ рдпрд╣ рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдирдП рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рд╣рдо рдЖрдкрдХреЛ рдРрд╕реЗ рдШрдЯрдХ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓реЗрдВрдЧреЗ, рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХрд░реАрдм рдкрд╣реБрдВрдЪ рд░рд╣реЗ рд╣реИрдВред рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╣рд╕реНрдпреЛрджреНрдШрд╛рдЯрди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИред
рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рдирдпрд╛ рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рдирдИ рдЕрд╕реЗрдВрдмрд▓реА рдЬреЛрдбрд╝реЗрдВ (рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ -> рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреЛрдбрд╝реЗрдВ):
рдЗрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, -> рдирдпрд╛ рдЖрдЗрдЯрдо):
рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╕реАрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рдкреВрд░реНрд╡рдЬреЛрдВ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:
public sealed partial class WaterMarkedTextBox : TextBox
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЖрдзрд╛рд░ рдШрдЯрдХ рдХреА рдЬрдЧрд╣ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╣рдЯрд╛рдХрд░ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
рдЗрди рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛рдУрдВ рдиреЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдореЗрдВ рдЙрди рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА, рдЬрд┐рдирдХреЗ рдЖрдзрд╛рд░ рдореЗрдВ TextBox рдерд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддреА рд╣реИ рд╡рд╣ рд╣реИ рд╣рд┐рдВрдЯ рд╢реЛ рдХрд░рдиреЗ рдХреА рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдХрдореАред рд╣рдо рдЕрдкрдиреЗ рд╡рдВрд╢рдЬ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рд╕рдВрдХреЗрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
<TextBox.Template> <ControlTemplate TargetType="TextBox"> <Grid> <TextBox Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}" /> <TextBlock Text="{Binding WaterMark, RelativeSource={RelativeSource TemplatedParent}}" Foreground="Gray" Margin="5,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Collapsed" IsHitTestVisible="False"/> </Grid> </ControlTemplate> </TextBox.Template>
рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рджреГрд╢реНрдп рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдШрдЯрдХ рд▓реЛрдбрд┐рдВрдЧ рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВрдЧреЗ рдФрд░ рд╣рдо рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ:
public WaterMarkedTextBox() { this.InitializeComponent(); Loaded += WaterMarkedTextBox_Loaded; }
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрддреНрд╡ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ:
private bool _isFocused;
рдареАрдХ рд╣реИ, рд╣рдореЗрдВ рд╕рдВрдХреЗрдд рдкрд╛рда рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DependencyProperty рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
/// <summary> /// /// </summary> public string WaterMark { get { return (string)GetValue(WaterMarkProperty); } set { SetValue(WaterMarkProperty, value); } } /// <summary> /// Static part of dependency property WaterMark /// </summary> public static readonly DependencyProperty WaterMarkProperty = DependencyProperty.Register("WaterMark", typeof(string), typeof(WaterMarkedTextBox), new PropertyMetadata(""));
рдпрд╣реА рд╣реИ, рдШрдЯрдХ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛, рдЗрдирдкреБрдЯ рдлрд╝реЛрдХрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЙрд╕реЗ рдЦреЛрдирд╛:
void WaterMarkedTextBox_Loaded(object sender, RoutedEventArgs e) { var grid = (Grid)VisualTreeHelper.GetChild(this, 0); TextBox innerTextBox = (TextBox)grid.Children[0]; innerTextBox.GotFocus += WaterMarkedTextBox_GotFocus; innerTextBox.LostFocus += WaterMarkedTextBox_LostFocus; ChangeWatermarkTextVisibility(); } void WaterMarkedTextBox_LostFocus(object sender, RoutedEventArgs e) { _isFocused = false; ChangeWatermarkTextVisibility(); } void WaterMarkedTextBox_GotFocus(object sender, RoutedEventArgs e) { _isFocused = true; ChangeWatermarkTextVisibility(); }
рдареАрдХ рд╣реИ, рдПрдХ рд╕рдВрдХреЗрдд рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рддрд░реАрдХрд╛:
private void ChangeWatermarkTextVisibility() { var grid = (Grid)VisualTreeHelper.GetChild(this, 0); TextBlock watermarkText = (TextBlock)grid.Children[1]; if (!string.IsNullOrEmpty(Text) || _isFocused) { watermarkText.Visibility = Visibility.Collapsed; } else { watermarkText.Visibility = Visibility.Visible; } }
рдШреЛрд▓ рдХреЛ рдПрдХ рд╕рд╛рде рдорд┐рд▓рд╛рдХрд░ред
рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмреНрд▓реИрдВрдХ рдРрдк рдХреЛ рд▓рд┐рдпрд╛, рдлрд┐рд░ рдореИрдВрдиреЗ рдореБрдЦреНрдп рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛:
<Page x:Class="App11.MainPage" xmlns:MyControls="using:MyControls" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App11" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <StackPanel Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <TextBlock Text=" :" /> <MyControls:WaterMarkedTextBox WaterMark=" Enter" /> </StackPanel> </Page>
рдиреЗрдорд╕реНрдкреЗрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЯреВрд▓ рдкреИрдирд▓ рд╕реЗ рдлреЙрд░реНрдо рдкрд░ рдирдП рдШрдЯрдХреЛрдВ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реВрдВ:
рдЦреИрд░, рдпрд╣ рд╕рдм рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреА рдкрд╣рд▓реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдореЗрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдХрд░ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдХреЗред