PasswordBox C# WPF

177
20 декабря 2017, 19:21

Здрастувуйте! Как сделать чтобы при выборе CheckBox пароль скрывался и наоборот, все никак не могу понять.

Answer 1

Как вам уже сказали, такой функциональности нет у PasswordBox. Но я предложу решение-костыль, которое как-то реализовал. У нас есть TextBox, PasswordBox, CheckBox и Button.

<TextBox Name="pwdTextBox" Grid.Column="2" HorizontalAlignment="Left" Margin="409,576,0,0" VerticalAlignment="Top" Width="170" Visibility="Hidden"/>
<PasswordBox Name="pwdPasswordBox" Grid.Column="2" HorizontalAlignment="Left" Margin="409,576,0,0" VerticalAlignment="Top" Width="170"/>
<CheckBox Name="checkBoxPwd" Content="Show password" Grid.Column="2" HorizontalAlignment="Left" Margin="452,547,0,0" VerticalAlignment="Top" Click="CheckBox_Click"/>
<Button Content="Submit" Grid.Column="2" HorizontalAlignment="Left" Margin="452,617,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
  • TextBox - тут будет виден пароль
  • PasswordBox - тут будет скрыт пароль
  • CheckBox - переключатель видимости пароля
  • Button - кнопка для отображения пароля в окне

Главное условие - это расположение TextBox и PasswordBox в одном и том же месте с одними и теми же координатами. Просто установить одинаковые значения. TextBox изначально убдет скрыт. Обработчик клика на CheckBox будет таким:

private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    var checkBox = sender as CheckBox;
    if (checkBox.IsChecked.Value)
    {
        pwdTextBox.Text = pwdPasswordBox.Password; // скопируем в TextBox из PasswordBox
        pwdTextBox.Visibility = Visibility.Visible; // TextBox - отобразить
        pwdPasswordBox.Visibility = Visibility.Hidden; // PasswordBox - скрыть
    }
    else
    {
        pwdPasswordBox.Password = pwdTextBox.Text; // скопируем в PasswordBox из TextBox 
        pwdTextBox.Visibility = Visibility.Hidden; // TextBox - скрыть
        pwdPasswordBox.Visibility = Visibility.Visible; // PasswordBox - отобразить
    }
}

Ну а по нажатию на кнопку отобразим наш пароль, это для наглядности:

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    var passrod = checkBoxPwd.IsChecked.Value ? pwdTextBox.Text : pwdPasswordBox.Password;
    MessageBox.Show(passrod);
}

Данный пример польносью рабочий. Да, костыль, но это самое простое решение.

Ссылка на очень похожий ответ с большого SO: showing password characters on some event for passwordbox можно еще Focus добавить, как сделано там.

Answer 2

Как отмечено выше, хоть непосредственно такого функционала у PasswordBox нет, (!)но возможно реализовать несколько костыльное решение через собственную всплывающую подсказку самого PasswordBox'а, которая есть объект (а не только лишь строчка) -- создадим System.Windows.Controls.ToolTip, настроим его и по установке/сбросу галочки в CheckBox'е будем заполнять/очищать подсказку PasswordBox'у, например так:

private void checkBox_Click(object sender, RoutedEventArgs e)//на установку/снятие галочки
{
    if (checkBox.IsChecked == true)
    {
        ToolTip tooltip = new ToolTip();
        tooltip.BorderBrush = null;//нет границы
        tooltip.HasDropShadow = false;//не отбрасывать тень
        tooltip.Placement = System.Windows.Controls.Primitives.PlacementMode.Relative;//поверх элемента
        tooltip.StaysOpen = true;//оставаться открытым
        tooltip.Content = passwordBox.Password;//собственно текст подсказки = незамаскированный пароль
        passwordBox.ToolTip = tooltip;//установка
    }
    else
    {
        passwordBox.ToolTip = null;//сброс
    };
}

конечно, над оформление ещё стоит поработать :) и лучше такой спец. ToolTip создавать единственный раз вместе с окном пароля.

READ ALSO
BlockingCollection - как не блокировать поток

BlockingCollection - как не блокировать поток

Применение BlockingCollection, используя подход, когда элементы вытаскиваются из очереди(например ConcurrentQueue), используя метод Take в цикле - всегда блокирует...

238
Теги в движке Unity3D

Теги в движке Unity3D

Можно ли на один игровой объект поставить два тега? Если можно, то как?

173
Не могу добавить DataSource в С#

Не могу добавить DataSource в С#

ПриветНе могу добавить DataSource в С# так как у меня нету этой кнопки

277
Создание экземпляров System.Web.UI.UserControl

Создание экземпляров System.Web.UI.UserControl

Задача создавать программно экземпляры объектов класса UserControl для заполнения ими таблицы GridView

226