Так исторически сложилось, что необходимо использовать TextBox для ввода логина и пароля. Как правильно организовать замену символов в текстовом поле ввода пароля. Набросал код.
public class TextToPasswordCharConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var str = new string('*', value?.ToString().Length ?? 0);
return str;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//throw new NotImplementedException();
return new object();
}
}
Свойство пароля во вью модели
public string PasswordField
{
get => passwordValue;
set
{
passwordValue = value;
OnPropertyChanged();
}
}
Наблюдатель
public abstract class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected void SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
field = value;
OnPropertyChanged(propertyName);
}
}
}
Разметка
<TextBox Grid.Row="0" Grid.Column="0" TextWrapping="Wrap" Margin="140,174,30,10">
<TextBox.Text>
<Binding Path="PasswordField" ValidatesOnDataErrors="True" Converter="{StaticResource TextToPasswordCharConverter}" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Код работает, но вопрос в том, что не знаю как правильно реализовать конвертер. Сейчас он при вводе одного символа пишет в поле 13 символов сразу '' и удалить их не возможно клавишей backSpace. А необходимо при вводе символа печатать в текстовое поле всегда символ '', и возможность его стирать.
Сделал немного проще. Скачал шрифт passdot.ttf. Добавил его в ресурсы приложения, подключил в разметке,
FontFamily="pack://application:,,,/Resources/#password"
где запретил копирование, вырезание и вставку.
<TextBox Grid.Row="0" Grid.Column="0" VerticalContentAlignment="Center"
TextWrapping="Wrap" Margin="140,174,30,10"
FontFamily="pack://application:,,,/Resources/#password"
CommandManager.PreviewExecuted="OnPreviewExecuted"
ContextMenu="{x:Null}">
<TextBox.Text>
<Binding Path="PasswordField" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
<TextBox.InputBindings>
<!--Disable CTRL+C -->
<KeyBinding Command="ApplicationCommands.NotACommand"
Key="C"
Modifiers="Control" />
</TextBox.InputBindings>
</TextBox>
Пока для теста во вью прокинул событие, после заменю на команду.
/// <summary>
/// Forbid Copy, Cut, Paste
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnPreviewExecuted(object sender, ExecutedRoutedEventArgs e)
{
if (e.Command == ApplicationCommands.Copy ||
e.Command == ApplicationCommands.Cut ||
e.Command == ApplicationCommands.Paste)
e.Handled = true;
}
С password box пока заморачиваться не стал. Дальше захеширую строку в поле. Что бы в памяти текст не хранить.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть картинка для экрана игры, но она с полями (счет, уровень и тп)
Нужно сделать сброс dataGridView1 в начальное состояние, те удалить все строки и вставить новые изначальные