请耐心等待我提出挑战。我的目标是,我想使用具有
水印支持和密码字符支持的
TextBox
。这就是目标。到目前为止,实现这一目标有点喜剧,而且只是部分解决方案。
PasswordBox
,这是一个开始,但它不包括 watermark 支持。
然后我也在考虑 Syncfusion
SfTextBoxExt
,这对于 水印支持来说非常好,但显然没有密码字符屏蔽。
作为 Syncfusion 解决方法,我已成功嵌入密码点字体 Resource。大多数情况下,我对结果并不不满意。唯一的问题是,这是挑战:字体也适用于水印!
除非我能以某种方式触发字体。理想情况下,如果可能的话,我想直接触发
Text
属性。如果有必要,也许我会引入一个 Length 或 Empty 只读附加属性,但是对于这个前景的思考开始变得有点奇怪。不要介意如何用触发的风格来连接它。
这就是挑战。我想知道是否有一种相对干净、非侵入性的方法可以触发并相应地设置字体系列,具体取决于
Text
属性。
一种可能的方法。可能还有其他更清洁的方法。
<Style x:Key="PasswordFont" TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Text, RelativeSource={RelativeSource Self}, Converter={StaticResource StringLengthEmpty}}" Value="True">
<Setter Property="FontFamily" Value="{StaticResource ControlFontFamilyDefault}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Text, RelativeSource={RelativeSource Self}, Converter={StaticResource StringLengthEmpty}}" Value="False">
<Setter Property="FontFamily" Value="{StaticResource PasswordDots}"/>
</DataTrigger>
</Style.Triggers>
</Style>
public class StringLengthEmptyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
value is null || (value is string text && text.Length == 0);
}
为了简洁起见,
IValueConverter
显然没有完全实现,ConvertBack
除了满足接口之外是不必要的。
可以微调转换器,也许只是返回字符串长度,然后仅当所述长度仅零或一时才响应;即避免对任何长度的字符串设置过于激进的字体。比如这个。但到目前为止,这是一个很好的开始。
应得的信用,有点基于这个例子。还有其他的,直接基于 TextBox,但原理非常相似。