Member 7725461 Ответов: 4

Как сделать поле пароля, чтобы принимать обычный текст без маскировки


Могу ли я сделать поле пароля, чтобы принимать обычный текст, не маскируя его, если да, то как это сделать в wpf. У меня есть поле пароля, которое должно отображать текст "пароль" перед вводом пароля. А при вводе пароля он будет отображаться в виде замаскированного текста. Пожалуйста помочь.

Заранее спасибо

4 Ответов

Рейтинг:
27

DrNimnull

Привет,

посмотрите здесь на WPF Watermark PasswordBox:
http://stackoverflow.com/questions/1607066/wpf-watermark-passwordbox-from-watermark-textbox[^]

Надеюсь, это то, что вы ищете


Рейтинг:
2

Wlady

1. Создание пользовательских элементов управления с 2 элементы управления: текстовое поле и passwordcontrol. Одно видно, другое скрыто.
2. Установите флажок, чтобы чередовать их видимость.

Пользовательских элементов управления XAML-кода:

<usercontrol x:class="ITWPFControls.WpfPasswordControl" xmlns:x="#unknown">
                         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                         mc:Ignorable="d"
                         d:DesignHeight="35" d:DesignWidth="450"&gt;
    <grid horizontalalignment="Stretch" margin="3" name="stackPanel1" verticalalignment="Stretch" width="Auto" height="Auto">
        <grid.columndefinitions>
            <columndefinition width="100*" />
            <columndefinition width="Auto" />
        </grid.columndefinitions>
        <textbox height="Auto" name="TB1" verticalcontentalignment="Center" margin="2" padding="2" grid.column="0" />
        <passwordbox height="Auto" name="PWB1" verticalcontentalignment="Center" margin="2" padding="2" grid.column="0" visibility="Hidden" />
        <checkbox content="Masked" margin="3" name="CB1" height="Auto" width="Auto" horizontalalignment="Center" horizontalcontentalignment="Center" grid.columnspan="1" verticalcontentalignment="Top" grid.column="1" padding="3,0,3,3" verticalalignment="Center" click="CB1_Click" />
    </grid>
</usercontrol>




3. создать свойство "пароль пользовательского элемента управления это". Пароль получает свое значение из фактически видимого элемента управления

public string Password
{
    get
    {
        if (TB1.Visibility == System.Windows.Visibility.Visible) {
            return TB1.Text;
        } else if (PWB1.Visibility == System.Windows.Visibility.Visible) {
            return PWB1.Password;
        }
        return "";
    }
}



4. реализовать в пользовательских элементов управления по CS чередуя visiblility:

4.1. новое видимое берет свое значение от старого видимого
4.2. новое видимое получает свою каретку и фокус

private void CB1_Click(object sender, RoutedEventArgs e)
{
    string _Password = Password;
    TB1.Visibility = CB1.IsChecked == true ? System.Windows.Visibility.Hidden : System.Windows.Visibility.Visible;
    PWB1.Visibility = CB1.IsChecked == true ? System.Windows.Visibility.Visible : System.Windows.Visibility.Hidden;
    int _Selection = _Password.Length;
    if (_Selection > 0) {
        if (TB1.Visibility == System.Windows.Visibility.Visible) {
            TB1.Text = _Password;
            TB1.SelectionStart = _Selection;
            TB1.Focus();
        } else if (PWB1.Visibility == System.Windows.Visibility.Visible) {
            PWB1.Password = _Password;
            MethodInfo _MI = PWB1.GetType().GetMethod("Select", BindingFlags.Instance | BindingFlags.NonPublic);
            if (_MI != null) {
                _MI.Invoke(PWB1, new object[] { _Selection, 0 });
            }
            PWB1.Focus();
        }
    }
}


Рейтинг:
1

Venkatesh Mookkan

Напишите пользовательский PasswordBox вашей собственной спецификации. Написание пользовательского элемента управления в WPF очень легко и просто.

Примеры:

Создание пользовательского элемента управления WPF, Часть 1[^]

Создание пользовательского элемента управления WPF, Часть 2[^]

Примечание: это примеры того, как написать пользовательский элемент управления в WPF.

или попробуйте следующий стиль, установите HintTextBoxStyle в PasswordBox и дайте свое сообщение в теге.

<Style x:Key="HintLabel" TargetType="{x:Type TextBlock}">
        <Setter Property="IsHitTestVisible" Value="False" />
        <Setter Property="FontStyle" Value="Italic" />
        <Setter Property="FontSize" Value="11" />
        <Setter Property="Margin" Value="2,2,0,0" />
        <Setter Property="Visibility" Value="Hidden" />
        <Setter Property="Foreground" Value="Gray" />
        <Setter Property="FontFamily" Value="Aial" />
    </Style>

    <SolidColorBrush x:Key="ListBorder" Color="#FF7F9DB9"/>

    <Style x:Key="HintTextBoxStyle"

                   TargetType="{x:Type TextBox}">
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
            <Setter Property="BorderBrush" Value="{StaticResource ListBorder}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="Padding" Value="2"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid Width="Auto" Height="Auto">
                        <Border x:Name="Bd" SnapsToDevicePixels="true" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3,3,3,3" BorderBrush="#FF757575" Margin="0,0,0,0"

                                Background="{TemplateBinding Background}">                            
                            <Grid>
                                <ScrollViewer x:Name="PART_ContentHost" Margin="0,0,0,0"

                                                  SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                                <TextBlock x:Name="PART_SearchHintLabel"

                                           Style="{StaticResource HintLabel}"

                                           Text="{TemplateBinding Tag}"

                                           Visibility="Collapsed" />
                            </Grid>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter Property="BorderBrush" TargetName="Bd" Value="#FF7AA639"/>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="BorderBrush" TargetName="Bd" Value="#FF7AA639"/>
                        </Trigger>
                        <Trigger Property="UIElement.IsEnabled">
                            <Setter Property="Panel.Background" TargetName="Bd">
                                <Setter.Value>
                                    <DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
                                </Setter.Value>
                            </Setter>
                            <Setter Property="TextElement.Foreground">
                                <Setter.Value>
                                    <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
                                </Setter.Value>
                            </Setter>
                            <Trigger.Value>
                                <s:Boolean>False</s:Boolean>
                            </Trigger.Value>
                        </Trigger>                        
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsFocused" Value="False" />
                                <Condition Property="Text" Value="" />
                            </MultiTrigger.Conditions>
                            <Setter TargetName="PART_SearchHintLabel"

                                            Property="Visibility"

                                            Value="Visible" />
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsFocused" Value="False" />
                                <Condition Property="Text" Value="{x:Null}" />
                            </MultiTrigger.Conditions>
                            <Setter TargetName="PART_SearchHintLabel"

                                            Property="Visibility"

                                            Value="Visible" />
                        </MultiTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>



Отметьте это как ответ, если это полезно


Member 7725461

Не могли бы вы привести мне пример для того же самого

Venkatesh Mookkan

Обновлен ответ

Venkatesh Mookkan

Снова обновил ответ

Sandeep Mewara

Хороший ответ и продолжение. 5!

Рейтинг:
1

Marko97IT

Это очень просто сделать.
Во-первых, вы должны добавить PasswordChar значение в ваш, безусловно, самый простой:

<PasswordBox Name="PasswordHidden" PasswordChar="*"/>

Далее под тегом PasswordBox вы должны добавить текстовое поле со значением `Visibility`, установленным в Hidden:
<TextBox Name="PasswordUnmask" Visibility="Hidden"/>

И триггер для отображения / скрытия пароля, например простой текст или кнопка. В моем случае я использую простой текст.
<TextBlock Name="ShowPassword"/>

Далее вам нужно добавить 3 различных события в триггерный элемент, например (это допустимо для текстового блока или изображения, если вы хотите использовать кнопку, Вы должны выбрать другие события):
<TextBlock x:Name="ShowPassword" Text="SHOW" PreviewMouseDown="ShowPassword_PreviewMouseDown" PreviewMouseUp="ShowPassword_PreviewMouseUp" MouseLeave="ShowPassword_MouseLeave"/>

Эти события называются "PreviewMouseDown", "PreviewMouseUp" и "MouseLeave", но вы можете выбрать подходящее событие для вашей ситуации.
Теперь в вашем коде вам нужно запрограммировать функции:
private void ShowPassword_PreviewMouseDown(object sender, MouseButtonEventArgs e) => ShowPasswordFunction();
private void ShowPassword_PreviewMouseUp(object sender, MouseButtonEventArgs e) => HidePasswordFunction();
private void ShowPassword_MouseLeave(object sender, MouseEventArgs e) => HidePasswordFunction();

private void ShowPasswordFunction()
{
    ShowPassword.Text = "HIDE";
    PasswordUnmask.Visibility = Visibility.Visible;
    PasswordHidden.Visibility = Visibility.Hidden;
    PasswordUnmask.Text = PasswordHidden.Password;
}
 
private void HidePasswordFunction()
{
    ShowPassword.Text = "SHOW";
    PasswordUnmask.Visibility = Visibility.Hidden;
    PasswordHidden.Visibility = Visibility.Visible;
}


CHill60

Это показывает/не показывает пароль. Это не то, о чем просил ОП.