XAMLでこれを行うには:
擬似コード:
<TextBox Text="{Binding Password}" Type="Password"/>
ユーザーがパスワードを入力するときに星または点が表示されるようにします。
さまざまな例 試してみましたPasswordCharおよびPasswordBoxしかし、これらを機能させることはできません。
例えば here のようにこれを行うことができます:
<PasswordBox Grid.Column="1" Grid.Row="1"
PasswordChar="*"/>
しかし、ボタンがクリックされたときにバインドされたTextBoxに値を送信できるように、TextプロパティをViewModelにバインドしたいのですが(コードビハインドでは機能しません)、次のようにします。
<TextBox Grid.Column="1" Grid.Row="0"
Text="{Binding Login}"
Style="{StaticResource FormTextBox}"/>
<PasswordBox Grid.Column="1" Grid.Row="1"
Text="{Binding Password}"
PasswordChar="*"
Style="{StaticResource FormTextBox}"/>
ただし、PasswordBoxにはTextプロパティがありません。
PasswordBoxでパスワードを取得または設定するには、Passwordプロパティを使用します。といった
string password = PasswordBox.Password;
私が知っている限り、これはデータバインディングをサポートしていないため、コードビハインドに値を設定し、それに応じて更新する必要があります。
Passwordboxコントロールをパラメーターとしてログインコマンドに送信します。
_<Button Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=PasswordBox}"...>
_
その後、ビューモデルでCType(parameter, PasswordBox).Password
を呼び出すことができます。
ここにPasswordBoxをバインドする方法があります: PasswordBox Databinding
ありがとう、コーディ、とても助かりました。 C#でDelegate Commandを使用している男性向けの例を追加しました。
<PasswordBox x:Name="PasswordBox"
Grid.Row="1" Grid.Column="1"
HorizontalAlignment="Left"
Width="300" Height="25"
Margin="6,7,0,7" />
<Button Content="Login"
Grid.Row="4" Grid.Column="1"
Style="{StaticResource StandardButton}"
Command="{Binding LoginCommand}"
CommandParameter="{Binding ElementName=PasswordBox}"
Height="31" Width="92"
Margin="5,9,0,0" />
public ICommand LoginCommand
{
get
{
return new DelegateCommand<object>((args) =>
{
// Get Password as Binding not supported for control-type PasswordBox
LoginPassword = ((PasswordBox) args).Password;
// Rest of code here
});
}
}
Tasnim Fabihaが述べたように、ドット/アスタリスクのみを表示するためにTextBoxのフォントを変更することが可能です。しかし、私は彼のフォントを見つけることができませんでした...私はあなたに私の実例を与えます:
<TextBox Text="{Binding Password}"
FontFamily="pack://application:,,,/Resources/#password" />
コピー&ペーストだけでは機能しません。まず、前述のフォント「password.ttf」リンクをダウンロードする必要があります: https://github.com/davidagraf/passwd/blob/master/public/ttf/password.ttf 次に、それをプロジェクトのResourcesフォルダーにコピーします(Project-> Properties-> Resources-> Add resource-> Add existing file)。次に、ビルドアクションをリソースに設定します。
この後、ドットのみが表示されますが、そこからテキストをコピーすることができます。そのため、次のようにCTRL + Cショートカットを無効にする必要があります。
<TextBox Text="{Binding Password}"
FontFamily="pack://application:,,,/Resources/#password" >
<TextBox.InputBindings>
<!--Disable CTRL+C -->
<KeyBinding Command="ApplicationCommands.NotACommand"
Key="C"
Modifiers="Control" />
</TextBox.InputBindings>
</TextBox>
TextBox
コントロールのPasswordBox
プロパティに次の値を追加するだけで、FontFamily
をカスタムTextBox
として作成できます。
<TextBox
Text="{Binding Password}"
FontFamily="ms-appx:///Assets/PassDot.ttf#PassDot"
FontSize="35"/>
私の場合、これは完全に機能します。これにより、実際のテキストの代わりにドットが表示されます(ただし、スター(*)ではありません)。
ビューモデル内でプロパティを設定するために、ビューのコードビハインドから以下を行いました。 MVVMパターンを本当に「破壊」するかどうかはわかりませんが、その最良かつ最も複雑でないソリューションが見つかりました。
var data = this.DataContext as DBSelectionViewModel;
data.PassKey = txtPassKey.Password;
PasswordBoxを使用する場合の問題は、SecureStringで動作するため、MVVMにあまり馴染みがないため、それを文字列にバインドするためにシムが必要なことです。クリップボードも使用できません。これらはすべて理由がありますが、そのレベルのセキュリティは必要ないかもしれません。クリップボードで機能する別のアプローチを次に示します。 TextBoxのテキストと背景を透明にし、その下のTextBlockにテキストをバインドします。このテキストブロックは、指定されたコンバーターを使用して文字を*に変換します。
<Window.Resources>
<local:TextToPasswordCharConverter x:Key="TextToPasswordCharConverter" />
</Window.Resources>
<Grid Width="200">
<TextBlock Margin="5,0,0,0" Text="{Binding Text, Converter={StaticResource TextToPasswordCharConverter}, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" FontFamily="Consolas" VerticalAlignment="Center" />
<TextBox Foreground="Transparent" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" FontFamily="Consolas" Background="Transparent" />
</Grid>
そして、ここに値コンバーターがあります:
class TextToPasswordCharConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return new String('*', value?.ToString().Length ?? 0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
ビューモデルのTextプロパティがINotifyPropertyChangedを実装していることを確認してください