如何在XAML中执行此操作:
伪码:
<TextBox Text="{Binding Password}" Type="Password"/>
以便用户在输入密码时看到星号或点。
我已尝试various examples建议使用 PasswordChar 和 PasswordBox ,但无法使用这些功能。
e.g。我可以按here所示的方式执行此操作:
<PasswordBox Grid.Column="1" Grid.Row="1"
PasswordChar="*"/>
但我当然希望将Text属性绑定到我的ViewModel,这样我就可以在单击按钮时发送绑定TextBox的值(不使用后面的代码),我想这样做:
<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属性。
答案 0 :(得分:32)
要在PasswordBox中获取或设置密码,请使用Password属性。如
string password = PasswordBox.Password;
据我所知,这不支持数据绑定,所以你必须在代码隐藏中设置值,并相应地更新它。
答案 1 :(得分:10)
将passwordbox控件作为参数发送到login命令。
<Button Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=PasswordBox}"...>
然后,您可以在视图模型中调用CType(parameter, PasswordBox).Password
。
答案 2 :(得分:9)
这里有一种绑定PasswordBox的方法:PasswordBox Databinding
答案 3 :(得分:5)
谢谢Cody,这非常有帮助。我刚刚为在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
});
}
}
答案 4 :(得分:3)
您只需将以下值添加到TextBox
控件的PasswordBox
属性即可将FontFamily
设为自定义TextBox
。
<TextBox
Text="{Binding Password}"
FontFamily="ms-appx:///Assets/PassDot.ttf#PassDot"
FontSize="35"/>
在我的情况下,这完美无缺。这将显示点代替实际文本(不是星号(*))。
答案 5 :(得分:2)
正如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现有文件)。然后将其“构建操作”设置为:资源。
在此之后,您将仅看到点,但是您仍然可以从中复制文本,因此需要禁用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>
答案 6 :(得分:1)
我在Views codebehind中执行了以下操作,以在视图模型中设置我的属性。不确定它是否真的&#34;符&#34; MVVM模式,但它找到了最好和最不复杂的解决方案。
var data = this.DataContext as DBSelectionViewModel;
data.PassKey = txtPassKey.Password;
答案 7 :(得分:0)
使用PasswordBox的问题是,由于它与SecureString配合使用,因此它不是非常友好的MVVM,因此需要使用垫片将其绑定到String。您也不能使用剪贴板。尽管所有这些东西都是有原因的,但您可能不需要这种安全级别。这是适用于剪贴板的另一种方法,没什么花哨的。使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
答案 8 :(得分:0)
此代码肯定会帮助您
<PasswordBox x:Name="Password" InputScope="Password" />
谢谢!