WPF PasswordBox теряет ноль символов из пароля

Привет Кто-нибудь может помочь мне в этом, пожалуйста? Мне поручено исправить ошибку в процедуре входа в систему в WPF (с которой у меня нет предыдущего опыта!) Проблема, похоже, заключается в том, что элемент управления PasswordBox игнорирует нули во введенном пароле. Я проверил, когда пароль меняется, и проверил введенное значение - оно определенно отбрасывает символы "0". Примером паролей должно быть "password012", но из Passwordbox возвращается "password12", аналогично "0password", возвращает "пароль". Запись имени пользователя (элемент управления TextBox) выглядит нормально.

Кто-нибудь может посоветовать, как побороть это пожалуйста? Код XAML здесь

<TextBox VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,10,0,48" Foreground="DarkSlateGray" Grid.Column="1" Grid.Row="1" Text="{Binding Username}" Name="txtUsername" Height="26" HorizontalContentAlignment="Center" Style="{StaticResource RoundTextBoxStyle}" Width="200" IsUndoEnabled="False" Effect="{StaticResource TextBoxDropShadow}" FontFamily="{StaticResource TextBoxDescrptionFontFamily}" FontSize="{StaticResource TextBoxDescriptionFontSize}" GotFocus="TxtBoxGotFocus" ToolTip="Enter your Username." Background="{StaticResource TextBoxBackground}"/>
<PasswordBox Grid.Column="1" Foreground="#FF2F4F4F" Margin="0,0,0,-36" VerticalAlignment="Center" Grid.Row="1" HorizontalAlignment="Center" Height="26" HorizontalContentAlignment="Center"  MaxLength="0" w:PasswordBoxBinder.Attach="True" Style="{StaticResource RoundTextBoxStyle}" w:PasswordBoxBinder.Password="{Binding Path=Password, Mode=TwoWay}" Effect="{StaticResource TextBoxDropShadow}" Width="{Binding ElementName=txtUsername, Path=Width}" ToolTip="Enter your Password." GotFocus="PbxGotFocus" FontFamily="{StaticResource TextBoxDescrptionFontFamily}" FontSize="{StaticResource TextBoxDescriptionFontSize}" Background="{StaticResource TextBoxBackground}" PasswordChanged="PasswordBox_PasswordChanged"  />

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

    private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
    {
        // ... Display Password in Title.
        //     A bad design decision.
        var box = sender as PasswordBox;
        this.Title = "Password typed: " + box.Password;
    }

Код для PasswordBoxBinder находится здесь и является частью исходного кода: открытый статический класс PasswordBoxBinder {

    //test
    public static readonly DependencyProperty PasswordProperty =
        DependencyProperty.RegisterAttached("Password",
        typeof(string), typeof(PasswordBoxBinder),
        new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

    public static readonly DependencyProperty AttachProperty =
        DependencyProperty.RegisterAttached("Attach",
        typeof(bool), typeof(PasswordBoxBinder), new PropertyMetadata(false, Attach));

    private static readonly DependencyProperty IsUpdatingProperty =
       DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
       typeof(PasswordBoxBinder));


    public static void SetAttach(DependencyObject dp, bool value)
    {
        dp.SetValue(AttachProperty, value);
    }

    public static bool GetAttach(DependencyObject dp)
    {
        return (bool)dp.GetValue(AttachProperty);
    }

    public static string GetPassword(DependencyObject dp)
    {
        return (string)dp.GetValue(PasswordProperty);
    }

    public static void SetPassword(DependencyObject dp, string value)
    {
        dp.SetValue(PasswordProperty, value);
    }

    private static bool GetIsUpdating(DependencyObject dp)
    {
        return (bool)dp.GetValue(IsUpdatingProperty);
    }

    private static void SetIsUpdating(DependencyObject dp, bool value)
    {
        dp.SetValue(IsUpdatingProperty, value);
    }

    private static void OnPasswordPropertyChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        var passwordBox = sender as PasswordBox;
        if (passwordBox != null)
        {
            passwordBox.PasswordChanged -= PasswordChanged;

            if (!GetIsUpdating(passwordBox))
            {
                passwordBox.Password = (string)e.NewValue;
            }
            passwordBox.PasswordChanged += PasswordChanged;
        }
    }

    private static void Attach(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        var passwordBox = sender as PasswordBox;

        if (passwordBox == null)
            return;

        if ((bool)e.OldValue)
        {
            passwordBox.PasswordChanged -= PasswordChanged;
        }

        if ((bool)e.NewValue)
        {
            passwordBox.PasswordChanged += PasswordChanged;
        }
    }

    private static void PasswordChanged(object sender, RoutedEventArgs e)
    {
        var passwordBox = sender as PasswordBox;
        SetIsUpdating(passwordBox, true);
        if (passwordBox != null)
        {
            SetPassword(passwordBox, passwordBox.Password);
            SetIsUpdating(passwordBox, false);
        }
    }
}

Некоторый код, который я нашел в модели View (Большое спасибо Den).

private static bool KhKeyIntercepted(KeyBoardHook.KeyboardHookEventArgs e)
    {
       if (e.KeyCode < 65 || e.KeyCode > 90) //a - z
        {
            if (e.KeyCode > 47 && e.KeyCode < 57) // 0-9
                return true;

            if (e.KeyCode == 220
                || e.KeyCode == 191
                || e.KeyCode == 189
                || e.KeyCode == 160
                || e.KeyCode == 161
                || e.KeyCode == 8
                || e.KeyCode == 9) //slsah, minus, left and right shift, tab and backspace
                return true;

            return false;
        }
        return true;
    }

1 ответ

Вы были в правой части стадиона. Это процедура подключения клавиатуры в View Model. Он игнорирует коды клавиш ниже 48. Теперь я изменил его (и добавил комментарий), чтобы игнорировать ниже 47. ASCII 48 - это символ "0". Большое спасибо за вашу помощь в получении меня там. Я, должно быть, пару раз просматривал этот фрагмент кода, пока ты не включил свет.

Другие вопросы по тегам