Поместите текстовое поле поверх поля пароля, а затем используйте небольшую привязку данных и анимацию. Этот фрагмент XAML позволит текстовому полю быть видимым до тех пор, пока продолжается набор текста, но как только набор текста прекратится, текстовое поле исчезнет, оставив только поле пароля с отображением символов пароля.
<Window.Resources>
<Storyboard x:Key="Storyboard1">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="textBox">
<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
<EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="1"/>
<EasingDoubleKeyFrame KeyTime="0:0:1.2" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="TextBoxBase.TextChanged" SourceName="textBox">
<StopStoryboard BeginStoryboardName="Storyboard1_BeginStoryboard"/>
<BeginStoryboard x:Name="Storyboard1_BeginStoryboard" Storyboard="{StaticResource Storyboard1}"/>
</EventTrigger>
</Window.Triggers>
<PasswordBox x:Name="passwordBox"/>
<TextBox x:Name="textBox"
Text="{Binding ElementName=passwordBox, Path=Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Opacity="100"/>
Вы можете поиграться с KeyTimes в анимации, чтобы получить задержку, которую вы предпочитаете. Вы также можете изменить настройки шрифта в текстовом поле, чтобы печатный текст и символы пароля выстраивались в ряд лучше.
EDIT
Если вы хотите отобразить только последний символ, набранный в виде обычного текста:
Эта ситуация немного отличается и требует большей сложности. В этом сценарии используется только текстовое поле в окне, а не поле пароля.
<TextBox Name="tbxPwd" Margin="20,0"
Text="{Binding Path=DisplayedPwd}" />
В вашем коде для окна (или в вашем классе ViewModel) вам понадобятся два свойства, ActualPwd
и DisplayedPwd
. Текстовое поле привязано к свойству DisplayedPwd
.
В коде позади вам понадобится следующий код:
Private Sub tbxPwd_PreviewKeyDown(sender As Object, e As System.Windows.Input.KeyEventArgs) _
Handles tbxPwd.PreviewKeyDown
If e.Key = Key.Back Then
If ActualPwd.Length > 0 Then
//Remove the last character.
ActualPwd = ActualPwd.Substring(0, ActualPwd.Length - 1)
ShowLastCharacter()
tbxPwd.CaretIndex = DisplayedPwd.Length
End If
End If
End Sub
Private Sub tbxPwd_PreviewTextInput(sender As Object, e As System.Windows.Input.TextCompositionEventArgs) _
Handles tbxPwd.PreviewTextInput
ActualPwd &= e.Text
e.Handled = True
ShowLastCharacter()
tbxPwd.CaretIndex = DisplayedPwd.Length
End Sub
Private Sub ShowLastCharacter()
Dim lastChar As Char = ActualPwd.Substring(ActualPwd.Length - 1)
//Reset the displayed pwd.
DisplayedPwd = ""
For i As Int32 = 0 To ActualPwd.Length - 2
DisplayedPwd &= "•"
Next
DisplayedPwd &= lastChar
End Sub
Метод tbxPwd_PreviewTextInput используется для извлечения символа, набранного пользователем. Метод tbxPwd_PreviewKeyDown используется для извлечения ключа BackSpace или любой другой клавиши управляющего символа, которую вы хотите обнаружить.
В этом коде нет задержки, поэтому он всегда отображает последний символ строки пароля в виде открытого текста. Должно быть достаточно легко добавить некоторый код вместе с таймером, чтобы после некоторой задержки изменить последний символ на символ pwd.
Приведенный выше код не был тщательно отлажен, поэтому могут возникнуть проблемы, если пользователь удаляет весь свой пароль, чтобы начать все сначала.
Совет: Alt + 0149 отображает символ пароля «bullet».