WPF 標準コントロールデモアプリ › PasswordBox
PasswordBox Inputs
PasswordBox はパスワード入力専用のコントロールです。入力した文字はマスク文字で表示され、セキュリティのために SecureString として管理されます。TextBox と異なり、Password プロパティへの直接データバインドはサポートされていません。
概要
WPF の PasswordBox は、パスワードなどの機密情報を入力するための専用コントロールです。入力された文字は PasswordChar(デフォルト: ●)でマスクされ、クリップボードへのコピーもできません。
セキュリティ上の理由から、Password プロパティはデータバインドの対象として登録されていません(DependencyProperty ではなく通常の CLR プロパティ)。MVVM でパスワードを扱うには、PasswordChanged イベントをコードビハインドで処理するか、カスタムの添付ビヘイビアを使用します。
MaxLength プロパティで入力できる最大文字数を制限できます。パスワードポリシーに合わせて適切な上限を設定します。0(デフォルト)は無制限です。
CaretBrush、SelectionBrush、SelectionOpacity などの外観プロパティはほかの TextBox 系コントロールと同様に使用できます。
画面キャプチャ

デモしているプロパティ
以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。
| プロパティ | 設定値 | 説明 |
|---|---|---|
PasswordChar | char (デフォルト: ●) | マスク文字の種類を変更したい場合(例: 欧米風の * に変えたい)に設定します。入力文字の代わりに指定した文字が表示され、入力文字数だけマスク文字が並びます。デフォルト(●)は日本のアプリで一般的ですが、セキュリティポリシーや UI デザインに合わせて変更できます。はまりポイント: PasswordChar は char 型のため ViewModel にバインドできません(DependencyProperty ではありますが、セキュリティ上の理由で通常バインドは推奨されません)。マスク文字を動的に変更する場合はコードビハインドから直接設定してください。 |
MaxLength | int (0 = 無制限) | パスワードポリシーで最大文字数制限がある場合(例: 最大128文字)に設定します。設定した文字数に達すると、それ以降の入力が無音でブロックされます(エラー表示はされません)。0(デフォルト)は無制限です。はまりポイント: MaxLength は UI レベルのみの制限です。API やサーバーへの送信前にも必ずサーバー側でバリデーションを実施してください。クライアント側のみの制限は容易にバイパスされます。 |
CaretBrush | Brush | カスタムテーマや高コントラストモードで、テキストカーソル(キャレット)がテーマカラーと同化して見えにくくなる場合に設定します。指定した色でキャレットが描画されるようになり、入力位置が見やすくなります。はまりポイント: CaretBrush は Windows 10 以降の WPF テーマ(aero2)でのみ有効です。古い Windows テーマ環境では無視されることがあります。テーマ切り替えをサポートするアプリでは動作確認が必要です。 |
SelectionBrush | Brush | カスタムテーマのアクセントカラーに合わせた選択ハイライト色が必要な場合に設定します。テキスト選択時のハイライト色が指定した Brush で描画されます。SelectionOpacity と組み合わせることでテーマカラーを保ちながらアクセシブルなコントラスト比を維持できます。はまりポイント: SelectionBrush に不透明な明るい色を設定すると暗いテーマで視認性が低下することがあります。SelectionOpacity を調整してテキストと選択ハイライトのコントラストを確保してください。 |
SelectionOpacity | double (0.0-1.0) | 選択ハイライトの透明度を調整して、ハイライト下のテキストの視認性を確保したい場合に設定します。0.0(完全透明)から 1.0(完全不透明)の範囲で指定し、デフォルトは 0.4 です。はまりポイント: 0.0 に設定すると選択範囲が完全に見えなくなりアクセシビリティが著しく低下します。最低でも 0.2 以上に保ち、選択していることがわかる視覚フィードバックを維持してください。 |
IsInactiveSelectionHighlightEnabled | bool | パスワード確認フォームなど、複数の PasswordBox を並べて比較する場面で、フォーカスが移動してもどの範囲を選択していたかを視覚的に保持したい場合に True に設定します。True にするとフォーカスを失ったあとも選択ハイライトが維持されます。デフォルト(False)ではフォーカスを失うと選択ハイライトが消えます。はまりポイント: ほとんどのシナリオでは False(デフォルト)が適切です。True にすると複数のフィールドで同時に選択表示が残り、ユーザーが混乱する可能性があります。 |
XAML 使用例
<StackPanel>
<Label Content="パスワード:" Target="{Binding ElementName=pwBox}" />
<PasswordBox x:Name="pwBox"
MaxLength="128"
PasswordChar="●"
Width="200"
PasswordChanged="PasswordBox_PasswordChanged" />
</StackPanel>
<!-- コードビハインドでパスワードを取得 -->
<!-- private void PasswordBox_PasswordChanged(object s, RoutedEventArgs e) -->
<!-- { ViewModel.PasswordHash = Hash(((PasswordBox)s).Password); } -->主な使用例
- ログイン画面 — ユーザー名と組み合わせて認証フォームのパスワード入力欄として使用します。
- パスワード変更フォーム — 現在のパスワードと新しいパスワードを 2 つの PasswordBox で入力するフォームを実装します。
- 暗証番号入力 — PIN や暗証番号の入力フォームで MaxLength で桁数を制限します。
- API キーの入力 — 機密情報である API キーを入力するフォームでマスク表示にします。
- マスター パスワード — 保存された認証情報や暗号化ファイルを開くためのマスターパスワード入力に使用します。
ヒントとベストプラクティス
- Password を直接バインドしない —
Passwordはセキュリティ上の理由でバインドできません。PasswordChangedイベントか添付ビヘイビアでハッシュ化してから ViewModel に渡します。クリアテキストの文字列を ViewModel に保持するのは避け、必要な場合はSecureStringか直接ハッシュ値を扱ってください。 - パスワードをメモリに保持しない — PasswordBox は内部で
SecureStringを使用しています。取得したPassword文字列をフィールドや変数に長時間保存しないようにします。使用後は可能な限り早くクリアしてください。 - 確認入力には 2 つの PasswordBox を使う — パスワード変更フォームでは 2 つの PasswordBox を配置し、
PasswordChangedイベントで都度比較してリアルタイムに一致確認を行います。一致しない場合はエラーメッセージを表示して送信ボタンを無効化します。 - 表示/非表示の切り替えには工夫が必要 — 標準では表示/非表示の切り替えができません。TextBox と PasswordBox を重ねて
Visibilityで切り替える方法や、カスタムコントロールを作成する方法があります。切り替え時には TextBox にパスワードが一時的に平文表示されることをユーザーに明示してください。 - アクセシビリティ — PasswordBox の隣に Label を配置してスクリーンリーダーがフィールドの目的を読み上げられるようにします。
AutomationProperties.LabeledByやAutomationProperties.Nameを設定するとアクセシビリティがさらに向上します。 - MaxLength はサーバー側検証と合わせる —
MaxLengthで UI 上の文字数制限を設けても、サーバー側の検証と一致させることが重要です。UI 上の制限はあくまでユーザー体験向上のためであり、セキュリティ保証にはなりません。
関連コントロール
ソースコード
このデモ画面のソースコードは GitHub で公開しています。