Как сделать из textbox passwordbox

Обновлено: 07.07.2024

У меня есть форма входа в систему с двумя текстовыми полями, одно для имени пользователя и одно для пароля.

Я использовал textbox для ввода пароля, однако я хотел бы замаскировать символы так, чтобы вместо того, чтобы показывать буквы, он показывал символ (*) или точку пароля.

Я не могу изменить textbox на поле пароля, так как это вызывает ошибки.

2 ответа

Как лучше всего поймать ключ return в PasswordBox? (WPF/XAML) У меня есть поле TextBox и поле PasswordBox в моей форме входа в систему (для ввода имени пользователя и пароля). У меня также есть кнопка входа в систему, которая вызывает метод, выполняющий процесс проверки входа в систему. Мне нужно.

Как использовать элемент управления passwordbox с виртуальной клавиатурой с помощью WPF? С помощью элемента управления textbox довольно просто просто переместить каретку в следующую текстовую позицию; не так обстоит дело с passwordbox,который не выставляет позицию каретки. Должен ли я просто.

Я бы предложил использовать PasswordBox и переписать ваш код, чтобы работать с этим, а не придумывать обходной путь. Я не совсем уверен, какую ошибку вы получаете, но вы можете получить значение PasswordBox почти так же, как получить значение/текст из TextBox.

Внутри файла xaml:-

И код за страницей.

Похожие вопросы:

Есть ли какие-либо изменения, чтобы сделать TextBox использовать символы пароля вместо использования passwordbox в wpf ?

Я должен преобразовать TextBox XAML в PasswordBox XAML. Главная проблема-

. Есть какие-нибудь подсказки, как это можно сделать? Спасибо!

Как лучше всего поймать ключ return в PasswordBox? (WPF/XAML) У меня есть поле TextBox и поле PasswordBox в моей форме входа в систему (для ввода имени пользователя и пароля). У меня также есть.

Как использовать элемент управления passwordbox с виртуальной клавиатурой с помощью WPF? С помощью элемента управления textbox довольно просто просто переместить каретку в следующую текстовую.

Я использую водяной знак textbox, как в водяном знаке TextBox в WPF

Я хочу, чтобы текст TextBox отображался так же, как текст PasswordBox. Есть ли какой-нибудь способ, которым я могу это сделать? Я думаю, что стиль TextBox может сработать. Я попытался стилизовать.

Я пытаюсь сделать проверку для PasswordBox . Для проведения валидации я перешел по этой ссылке , которая показывает, как проводить валидацию на TextBox . Проблема возникает с PasswordBoxes .

Уже в WinForm мы устанавливаем свойство на TextBox , и это легко меняет стиль текста на пароль. Я думаю, что это было действительно хорошее решение, потому что все способы в TextBox и PasswordBox.

Есть две формы, у каждой формы есть свой textbox. Эти формы активны. Как значение textbox второй формы скопировать в textbox первой формы при каком-то событии?

Самый простой вариант это использовать public переменную.
Для этого в проекте создаём класс, а классе public переменную :

using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;

namespace ChangeTextBoxs
<
class MyClass
<
public static string strTextChangeN < get ; set ; >
>
>

namespace ChangeTextBoxs
<
public partial class Form1 : Form
<
public Form1 ( )
<
InitializeComponent ( ) ;
frm2 = new Form2 ( ) ;
>
Form2 frm2 ;

private void btnShowForm2_Click ( object sender, EventArgs e )
<
frm2 . Show ( ) ;
>

private void textBox1_TextChanged ( object sender, EventArgs e )
<
MyClass . strTextChangeN = textBox1 . Text ;
>

private void textBox1_DoubleClick ( object sender, EventArgs e )
<
textBox1 . Text = MyClass . strTextChangeN ;
>

namespace ChangeTextBoxs
<
public partial class Form2 : Form
<
public Form2 ( )


private void textBox1_TextChanged ( object sender, EventArgs e )
<
MyClass . strTextChangeN = textBox1 . Text ;
>

private void textBox1_DoubleClick ( object sender, EventArgs e )
<
textBox1 . Text = MyClass . strTextChangeN ;
>

Теперь при DoubleClick на textBox'ах текст будет меняться соответственно выбранного textBox'а.


Результат примерно так:

Разработчик Offline Client

ICQ: 204447456

ICQ: 373-509-101

Private Sub Form_Load()
ReDim aTest(0)
'вместо того, что ниже, кинь на форму текстовые поля например
'txtQuestion, txtFirstAnswer, при нажатии на кнопку cmdPutInformation (скажем Сохранить)
'из соответсвующих текстовый полей заноси информацию в структуру Test, например
'Test.Question=txtQuestion.Text или Test.FirstAnswer=txtFirstAnswer.Text
With Test
.Question = "Первый вопрос"
.FirstAnswer = "первый вариант ответа для 1 вопроса"
.SecondAnswer = "второй вариант ответа для 1 вопроса"
.ThridAnswer = "третий вариант ответа для 1 вопроса"
.CorrectAnswer = "правильный ответ для 1 вопроса"
End With
End Sub

Хотя конечно при таком варианте можно обойтись и без использования массива. Для случайного выбора вопроса можно сделать так:

Правда в этом случае придется отслеживать был или нет уже этот вопрос. Если решишь работать с массивом, то перемешать его можно так:

 im atemp(0 To 1) As testdb
SeconCount = Second(Time)
For i = 1 To SeconCount * 300
Randomize
Ind = Int(Rnd * (UBound(aTest)))
If Ind >= 0 Then
If Ind Mod 2 = 0 Then
atemp(0) = aTest(Ind)
atemp(1) = aTest(UBound(aQuestion))
aTest(Ind) = atemp(1)
aTest(UBound(aTest)) = atemp(0)
Else
atemp(0) = aTest(Ind)
atemp(1) = aTest(0)
aTest(Ind) = atemp(1)
aTest(0) = atemp(0)
End If
End If
Next i

З.Ы. Если что то не понятно, или я что то наколбасил, напиши… Надеюсь помого!

Sunday, May 3, 2015

Custom TextBox and PasswordBox in WPF


TabIndex="1" HorizontalAlignment="Center" KeyDown="txtUser_KeyDown_1"
Name="txtUser" VerticalAlignment="Top"
BorderBrush="" Foreground="White" HorizontalContentAlignment="Left"
VerticalContentAlignment="Center"
FontSize="12" FontStyle="Italic"
FontFamily="HelveticaNeue-Light,HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica, Arial,Lucida Grande,sans-serif"
Background="Transparent" Text=""
Template="">

TabIndex="1" HorizontalAlignment="Center" KeyDown="txtPwd_KeyDown_1"
Name="txtPassword" VerticalAlignment="Center"
BorderBrush="" Foreground="White"
HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
FontSize="12" FontStyle="Italic"
FontFamily="HelveticaNeue-Light,HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica, Arial,Lucida Grande,sans-serif"
Background="Transparent" ToolTip="Password">

Сегодня мы будем создавать интересный контрол, представляющий собой TextBox и встроенной кнопкой:


Такие контролы используются, в основном, в программах, работающих с базами данных. Однако, путем универсализации его функционала, его ареал использования можно существенно расширить.

Кроме того, мы хотим иметь возможность в коде формы, на которой расположен данный контрол, управлять его выполнением. Например, интерактивно отключить выполнение события выбора без замораживания самого контрола, и т.д.

Создаем новый User Control. Я, для простоты, буду называть все классы, свойства и т.д. теми же именами, которые использовал в библиотеке. Вы можете использовать любые собственные имена.

Для начала, в режиме дизайнера форм рисуем контрол. Я в работе использую не Visual Studio, а SharpDevelop, поэтому внешний вид каких-то элементов среды может отличаться от таковых в VS, но, я думаю, в целом все достаточно похоже.

Нам необходимо стандартный холст UserControl растянуть так, как будет в итоге выглядеть наш контрол:



Далее, нам нужно разместить на холсте стандартный TextBox со свойством Dock равным Fill. TextBox займет собой весь холст по ширине, а по высоте - насколько позволит высота строки. Настраиваем TextBox по своему вкусу, устанавливаем тип рамки, шрифт, кегль, цвет текста и т.д.
Затем размещаем на холсте поверх TextBox кнопку или, как в моем случае, Label с установленным значением рамки, заливкой фона, текстом ". " и свойством Cursor со значением Hand. Получится та же кнопка. Мне вариант с Label нравится больше, субъективно лучше выглядит. В итоге получаем следующее:



Обзываем TextBox - CompoentTB, а Label - ComponentLB.


У Label-кнопки необходимо установить свойство Anchor в значения Top и Right, чтобы кнопка была жестко привязана к верхнему правому углу и не двигалась при изменении размера контрола.



Так же необходимо установить у кнопки значения MaximumSize и MinimumSize в значения, равные Size, чтобы она ни при каких обстоятельствах не меняла размер.

По сути, визуальная составляющая контрола готова. Переходим в код.

Перво-наперво, я хочу, чтобы моя кнопка визуально реагировала на нажатия мышью. Пишем в коде конструктора класса обработчики событий MouseDown и MouseUp в виде простых лямбда-выражений:


Т.е., при нажатии кнопки мыши цвет Label устанавливается в LightSalmon, а при отпускании - в Snow. Теперь Label стал совсем как настоящая кнопка.

Теперь я хочу вынести из контрола кое-какие параметры встроенного TextBox. В частности, я хочу, чтобы можно было при создании контрола установить значения свойств Multiline и ReadOnly TextBox'a. Создаем свойства класса контрола:

Небольшое отступление по использованию атрибутов в данном коде. Поскольку мы создаем визуальный компонент, нам необходимо сделать так, чтобы некоторые особо важные свойства контрола мы могли редактировать не в коде, а в режиме дизайнера форм. Для этого перед необходимыми свойствами мы указываем атрибуты Description (устанавливает описание свойства в PropertyGrid дизайнера форм) и Category (в котором указываем, к какой категории необходимо отнести свойство). Если кастомных свойств у нас немного (в данном контроле их будет всего четыре), удобно создать свою категорию, которая, за счет первого символа подчеркивания, еще и выводится в PropertyGrid первой. Удобно!


После создания необходимых свойств нам нужно каким-то образом применять устанавливаемые в них значения к встроенному TextBox. Создадим универсальный метод обновления TextBox:


Каждый раз при вызове данного метода свойства Multiline и ReadOnly встроенного TextBox устанавливаются равными соответствующим им свойствам контрола. Кроме того, поскольку при установке ReadOnly в true TextBox автоматически меняет заливку на серую. В методе мы насильно перекрашиваем TextBox каждый раз обратно в белый. Можно сделать и по другому, но пока и так сойдет. Далее, мы вызываем метод каждый раз, когда необходимо обновить состояние TextBox:


Настало время закончить с тюнингом и начать претворять в жизнь самый главный функционал. Для начала нам нужно свойство, в котором мы можем указать, какой из режимов работы контрола нам необходим. Создадим перечисление:


Соответственно, используя каждый из элементов перечисления, мы направляем контрол по одному из путей реализации функционала. Создадим свойство с типом данных ActionType:


Реализуем выполнение контрола с Action = ActionType.SelectObject. По логике действий, контрол должен открыть какую-то форму, подцепиться к событию FormClosing, получить какой-то объект и вывести строковое представление полученного объекта в текстовое поле контрола. Создадим два новых свойства, на этот раз - неинтерактивных:



и внесем небольшое изменение в метод ReloadComponent():


Логика такова - при перезагрузке контрола в ComponentTB.Text записываем строковое представление SelectedObject, либо, если SelectedObject не установлен - то записываем пустую строку.
Все готово для обработки главного события контрола - выбора через нажатие на кнопку. Сначала создадим метод-обработчик:


Логика такова: если свойство SelectForm установлено, то открывается форма. Какая форма будет открыта, контрол не знает. К событию FormClosing подключаем лямбда-выражение, которое перед закрытием дочерней формы проверяет у нее свойство Tag и, если оно установлено, то устанавливает его значение в значение свойства SelectedObject контрола. Таким образом, дочерняя форма должна возвращать в свойстве Tag какой-то объект. Как это сделать, мы увидим в самом конце.
Осталось только подключить метод Select в качестве обработчика события Click кнопки:


На данном этапе контрол уже умеет открывать дочернюю форму и получать от нее какой-то объект. Однако этого мало, необходимо расширить функционал для поддержки всех типов действий. Создадим интерактивное свойство Filter для действий OpenFile и SaveFile:


Расширим метод Select() для поддержки всех необходимых действий:


Самое основное мы сделали. Мы создали четыре интерактивных свойства, и обработку нажатия на кнопку. Осталось совсем немного: создать два события, одно из которых должно выполняться до основного обработчика, а второе - после. Причем событие, выполняющееся до основного обработчика, должно уметь остановить его выполнение.


Метод-инициатор события BeforeSelect возвращает булево значение, указывающее основному обработчику, выполняться ему или нет. Внесем изменения в основной обработчик:


Таким образом, если OnBeforeSelect() вернет true, основной обработчик выполняться не будет.
Все, контрол успешно закончен. Можно проверять на форме. Создадим форму и четыре наших новых контрола: ksSelectObject, ksOpenFile, ksSaveFile и ksSelectDirectory:



В соответствии с названиями устанавливаем каждому из контролов значения Action.

Читайте также: