【问题标题】:How to get the highlighted text in a PasswordBox如何在 PasswordBox 中获取突出显示的文本
【发布时间】:2016-10-10 20:12:44
【问题描述】:

我有一个密码框,我正在向其中添加一个“显示密码”按钮(如图所示):

密码文本框的相关 XAML 如下所示:

                <Border VerticalAlignment="Center" Grid.Row="2" Margin="2" Grid.Column="1" 
                    BorderThickness="1" 
                    BorderBrush="Black" 
                    Background="White">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <PasswordBox Name="txtPassword" Grid.Column="0" MaxLength="100" Margin="2" BorderThickness="0" GotFocus="txtPassword_GotFocus" PasswordChanged="txtPassword_PasswordChanged" />
                    <TextBox Name="txtVisiblePassword" Grid.Column="0" MaxLength="100" Margin="2" BorderThickness="0" Visibility="Collapsed" Height="22" />
                    <Button Grid.Column="1" Style="{StaticResource LightHoverButton}" x:Name="btnShowPassword" PreviewMouseDown="btnShowPassword_PreviewMouseDown" PreviewMouseUp="btnShowPassword_PreviewMouseUp">
                        <Image Source="{StaticResource ShowPassword_128}" Style="{StaticResource Image_16}" Margin="3,0" />
                    </Button>
                </Grid>
            </Border>

后面的相关代码:

    private void txtPassword_PasswordChanged(object sender, RoutedEventArgs e)
    {
        //Can show password is set to false if the password being displayed has been 
        //placed there automatically because the password is being remembered
        if (canshowpassword == false && string.IsNullOrEmpty(txtPassword.Password))
            canshowpassword = true;
        if (canshowpassword)
            btnShowPassword.Visibility = string.IsNullOrEmpty(txtPassword.Password) ? Visibility.Collapsed : Visibility.Visible;
        else
            btnShowPassword.Visibility = Visibility.Collapsed;
    }

我遇到的问题是,有一个“记住密码”选项,我不希望用户能够看到密码,除非密码文本框已至少“清除”所有文本一次(以防止用户查看自动输入的全部或部分密码)。上面的代码很接近,但是,如果用户选择所有文本然后按一个键开始一个新密码,则“空”密码不会通过密码更改事件和“显示密码”按钮出现不会变得可见。用户必须删除所有文本,然后再次开始输入。我想抓住用户选择所有文本并开始输入的情况。

如果我预览 Key down 事件,PasswordBox 上没有“SelectedText”属性,所以我不知道如何提前知道密码是否会在添加新文本之前被清除。

有没有办法知道 PasswordBox 密码已被清除,和/或知道是否选择了所有文本?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    这是一个非常棘手的问题。他们不会公开披露这些信息,但你可以通过一些反思来了解它。这有点令人讨厌,因为他们试图用内部类和私有属性隐藏所有东西,但是你去吧:

            TextSelection selection = (TextSelection)typeof(PasswordBox).GetProperty("Selection", BindingFlags.Instance | BindingFlags.NonPublic).GetMethod.Invoke(textBox, null);
    
            Type tTextRange = selection.GetType().GetInterfaces().Where(x => x.Name == "ITextRange").FirstOrDefault();
    
            object oStart = tTextRange.GetProperty("Start").GetMethod.Invoke(selection, null);
            object oEnd = tTextRange.GetProperty("End").GetMethod.Invoke(selection, null);
    
            MethodInfo mi = oStart.GetType().GetProperty("Offset", BindingFlags.Instance | BindingFlags.NonPublic).GetMethod;
    
            int nStart = (int)mi.Invoke(oStart, null);
            int nEnd = (int)mi.Invoke(oEnd, null);
    
            System.Diagnostics.Debug.WriteLine(nStart + " ==> " + nEnd);
    

    当然,你应该缓存一些反射的东西,但我会把它留给你 :)。

    注意:您需要在 textBox_PreviewKeyDown() 中获取开始和结束。当您到达 PasswordChanged 时,选择已经明显丢失。如果你想检查整个密码是否被选中,你会检查 0 ==> len。

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多