рд╣рдо Win8 / RT, рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рд╡рд┐рд╖рдп


рджрд░рдЕрд╕рд▓, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди, рдЬрд┐рд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЕрдкрдирд╛ рдХреАрдорддреА рд╕рдордп рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ:
WinRT XAML рдЯреВрд▓рдХрд┐рдЯ рдиреЗ рдЕрдкрдиреЗ рдмреЛрд░реНрдб рдкрд░ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рд░рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕реАрдорд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдХрд▓рд░ рд╕реНрдХреАрдо) рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдкрд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕ рдЕрдкрд╕реЗрдЯ рдХреА рдХрдореАред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рда рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рд╕рд░рд▓ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ 30 рдорд┐рдирдЯ рдХрд╛ рд╕рдордп рдмрдЪрд╛рдПрдЧрд╛ред) рдпрджрд┐ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╡рд┐рдЪрд╛рд░


рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ: рдкрд╛рда рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдФрд░ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХред (рдкрд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рдХреНрд░рдорд╢рдГ)ред рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЛ рдЪрд╛рд▓рд╛рдХреА рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
рдкреНрд░рд╕реНрддреБрдд рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдВрдбреЛрдЬ 8 / рдЖрд░рдЯреА рдХреЗ рд▓рд┐рдП рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред

WatermarkTextBox.xaml

<UserControl x:Class="Test.Controls.WatermarkTextBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Test.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="50" d:DesignWidth="400"> <Border x:Name="brd" Background="#FFE0E0E0" VerticalAlignment="Stretch" Padding="15,5" > <Grid> <TextBlock x:Name="tbWatermark" TextWrapping="Wrap" Foreground="#FF646464" IsHitTestVisible="False" Padding="0" FontSize="14.667" VerticalAlignment="Center" Margin="0" /> <TextBox x:Name="tb" LostFocus="LostFocus" GotFocus="GotFocus" Background="{x:Null}" FontSize="11" TextChanged="Tb_OnTextChanged" Margin="0" VerticalAlignment="Center" BorderThickness="0" Padding="0" /> </Grid> </Border> </UserControl> 


WatermarkTextBox.cs

  public sealed partial class WatermarkTextBox : UserControl { public WatermarkTextBox() { InitializeComponent(); } private void LostFocus(object sender, RoutedEventArgs e) { CheckWatermark(); brd.Background = new SolidColorBrush(Color.FromArgb(255, 224, 224, 224)); } public void CheckWatermark() { var passwordEmpty = string.IsNullOrEmpty(tb.Text); tbWatermark.Opacity = passwordEmpty ? 100 : 0; tb.Opacity = passwordEmpty ? 0 : 100; } private void GotFocus(object sender, RoutedEventArgs e) { tbWatermark.Opacity = 0; tb.Opacity = 100; brd.Background = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255)); } private void Tb_OnTextChanged(object sender, TextChangedEventArgs e) { Text = tb.Text; } #region DependencyProperty /// <summary> /// Watermark /// </summary> public string Watermark { get { return (string)GetValue(WatermarkProperty); } set { SetValue(WatermarkProperty, value); } } public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register("Watermark", typeof(string), typeof(WatermarkTextBox), new PropertyMetadata("", WatermarkChanged)); private static void WatermarkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var controll = (WatermarkTextBox)d; var val = (string)e.NewValue; controll.tbWatermark.Text = val; } /// <summary> /// TextSize /// </summary> public int TextSize { get { return (int)GetValue(TextSizeProperty); } set { SetValue(TextSizeProperty, value); } } public static readonly DependencyProperty TextSizeProperty = DependencyProperty.Register("TextSize", typeof(int), typeof(WatermarkTextBox), new PropertyMetadata(0, TextSizeChanged)); private static void TextSizeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var controll = (WatermarkTextBox)d; var val = (int)e.NewValue; if (val < 10){val = 10;} controll.tb.FontSize = val; controll.tbWatermark.FontSize = val; } /// <summary> /// Text /// </summary> public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(WatermarkTextBox), new PropertyMetadata("", TextChanged)); private static void TextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var controll = (WatermarkTextBox)d; var val = (string)e.NewValue; if (val == null) { controll.tb.Text = ""; return; } controll.tb.Text = val; } #endregion } 


WatermarkPasswordBox.xaml

 UserControl x:Class="Test.Controls.WatermarkPasswordBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Border x:Name="brd" Background="#FFE0E0E0" VerticalAlignment="Stretch" Padding="15,5"> <Grid> <TextBlock x:Name="tbWatermark" TextWrapping="Wrap" Foreground="#FF646464" IsHitTestVisible="False" Padding="0" FontSize="14.667" VerticalAlignment="Center" Margin="0" /> <PasswordBox x:Name="pb" LostFocus="PasswordLostFocus" GotFocus="PasswordGotFocus" Background="{x:Null}" FontSize="11" PasswordChanged="Pb_OnPasswordChanged" Margin="0" VerticalAlignment="Center" BorderThickness="0" Opacity="0" Padding="0" /> </Grid> </Border> </UserControl> 


WatermarkPasswordBox.cs

  public sealed partial class WatermarkPasswordBox : UserControl { public WatermarkPasswordBox() { this.InitializeComponent(); } private void PasswordLostFocus(object sender, RoutedEventArgs e) { CheckWatermark(); brd.Background = new SolidColorBrush(Color.FromArgb(255, 224, 224, 224)); } public void CheckWatermark() { var passwordEmpty = string.IsNullOrEmpty(pb.Password); tbWatermark.Opacity = passwordEmpty ? 100 : 0; pb.Opacity = passwordEmpty ? 0 : 100; } private void PasswordGotFocus(object sender, RoutedEventArgs e) { tbWatermark.Opacity = 0; pb.Opacity = 100; brd.Background = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255)); } private void Pb_OnPasswordChanged(object sender, RoutedEventArgs e) { Password = pb.Password; } #region DependencyProperty /// <summary> /// Watermark /// </summary> public string Watermark { get { return (string)GetValue(WatermarkProperty); } set { SetValue(WatermarkProperty, value); } } public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register("Watermark", typeof(string), typeof(WatermarkPasswordBox), new PropertyMetadata("", WatermarkChanged)); private static void WatermarkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var controll = (WatermarkPasswordBox)d; var val = (string)e.NewValue; controll.tbWatermark.Text = val; } /// <summary> /// Password /// </summary> public string Password { get { return (string)GetValue(PasswordProperty); } set { SetValue(PasswordProperty, value); } } public static readonly DependencyProperty PasswordProperty = DependencyProperty.Register("Password", typeof(string), typeof(WatermarkPasswordBox), new PropertyMetadata("", PasswordChanged)); private static void PasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var controll = (WatermarkPasswordBox)d; var val = (string)e.NewValue; if (val == null) { controll.pb.Password = ""; return; } controll.pb.Password = val; } /// <summary> /// TextSize /// </summary> public int TextSize { get { return (int)GetValue(TextSizeProperty); } set { SetValue(TextSizeProperty, value); } } public static readonly DependencyProperty TextSizeProperty = DependencyProperty.Register("TextSize", typeof(int), typeof(WatermarkPasswordBox), new PropertyMetadata(0, TextSizeChanged)); private static void TextSizeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var controll = (WatermarkPasswordBox)d; var val = (int)e.NewValue; if (val < 10) { val = 10; } controll.pb.FontSize = val; controll.tbWatermark.FontSize = val; } #endregion } 


рдФрд░ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 <controls:WatermarkTextBox x:Name="WatermarkTextBox " Text="{Binding Login, Mode=TwoWay}" Watermark="Login" Grid.Row="2" Margin="10,0" TextSize="18"/> <controls:WatermarkPasswordBox x:Name="WatermarkPasswordBox" Watermark="Password" Password="{Binding Password, Mode=TwoWay}" Grid.Row="4" Margin="10,0" TextSize="18" /> 


рдмрд╕ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рд▓рд╛рдЗрди рдордд рднреВрд▓рдирд╛:

 xmlns:controls="using:Test.Controls" 


рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдкреНрд░рд╛рдкреНрддрд┐ рдкрд░, GotFocus / LostFocus рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ / рдкрд╛рд╕рд╡рд░реНрдб рдЗрдирдкреБрдЯ рдХреА рд╢реБрд░реБрдЖрдд / рдЕрдВрдд рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рда рдпрд╛ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ (CheckWatermark рд╡рд┐рдзрд┐) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЙрдкрдпреБрдХреНрдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд╛рда / рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЕрдкрдиреЗ рдмрдирд╛рдП рдЧрдП DependencyProperty (Tb_OnTextChanged / Pb_OnTextChanged рддрд░реАрдХреЛрдВ) рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред DependencyProperty рдХреА рдПрдХ рдЫреЛрдЯреА рд╕реВрдЪреА рдореЗрдВ рдкрд╛рда рд╡реЙрдЯрд░рдорд╛рд░реНрдХ, рдореБрдЦреНрдп рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХрд╛ рдкрд╛рда, рд▓реЗрдмрд▓ рдХрд╛ рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░ рдФрд░ рдкрд╛рда рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╣рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ

рдХрд┐рд╕реА рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред 10 рдорд┐рдирдЯ рдмрд┐рддрд╛рдП, рд▓реЗрдХрд┐рди рдкреВрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рдорд┐рд▓рд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрд┐рд╕реА рдХрд╛ рд╕рдордп рдмрдЪрд╛рдпрд╛ред

рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВ рдПрдХ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдкреНрд░реЙрдкрд░реНрдЯреА рдЬреЗрдирд░реЗрдЯрд░ рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рдордп рдХреА рднреА рдмрдЪрдд рд╣реЛрдЧреАред

рдЙрджреНрджреЗрд╢реНрдп / рдкрдХреНрд╖рдкрд╛рддреА рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдЕрджреНрдпрддрди


рд╢реАрд░реНрд╖ рдмрд╛рдПрдБ - рд╡реЙрдЯрд░рдорд╛рд░реНрдХрдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕
рдирд┐рдЪрд▓рд╛ рдмрд╛рдПрдБ - рд╡реЙрдЯрд░рдорд╛рд░реНрдХрдкрд╛рд╕рд╡рд░реНрдб
рд╢реАрд░реНрд╖ рджрд╛рдПрдВ - рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╡реЙрдЯрд░рдорд╛рд░реНрдХрдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕
рдиреАрдЪреЗ рджрд╛рдИрдВ рдУрд░ - рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдФрд░ рдлрд╝реЛрдХрд╕ рдХреЗ рд╕рд╛рде рд╡реЙрдЯрд░рдорд╛рд░реНрдХрдкреНрд░рд╛рд╕рд╡рд░реНрдбрдмреЙрдХреНрд╕ред

Source: https://habr.com/ru/post/In179605/


All Articles