XAML-细化水印代码
本文关键字:代码 细化 XAML- | 更新日期: 2023-09-27 18:27:15
我正在为我的wpf应用程序创建一个登录页面,并希望在用户名和密码字段中添加水印。我可以通过复制代码来实现这一点,但这对我来说不是一个令人满意的解决方案。有没有一种方法可以将字符串值传递到Grid.resources部分中的水印绑定?
目标是重构这两个控件,使它们都可以使用下面的单一资源登录提示,我对此进行了研究,但缺少信息。感谢
<Grid.Resources>
<VisualBrush x:Key="LoginHint" Stretch="Uniform" AlignmentX="Left" AlignmentY="Center" >
<VisualBrush.Visual>
<Grid HorizontalAlignment="Left">
<TextBlock FontFamily="Corbel"
HorizontalAlignment="Left" VerticalAlignment="Center" Foreground="Gray" FontStyle="Italic" Opacity="0.3"
Text="Enter Username"/>
</Grid>
</VisualBrush.Visual>
</VisualBrush>
</Grid.Resources>
<TextBox FontSize="24" BorderBrush="#008AB8" BorderThickness="1" Grid.Row="1" x:Name="usernameTextBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="25">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=usernameTextBox,Path=Text}" Value="" >
<Setter Property="Background" Value="{StaticResource LoginHint}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<PasswordBox FontSize="24" BorderBrush="#008AB8" BorderThickness="1" Grid.Row="2" x:Name="passwordMarkTextBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="25">
<PasswordBox.Style>
<Style TargetType="{x:Type PasswordBox}">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=passwordMarkTextBox,Path=Text}" Value="" >
<Setter Property="Background" Value="{StaticResource LoginHint}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</PasswordBox.Style>
</PasswordBox>
我会创建一个自定义附加属性(例如WatermarkText
),然后创建新的控件模板,绑定到该值并将水印叠加在常规文本区域的顶部。使用触发器控制其可见性,仅在未输入文本或密码时显示。您可能需要一个单独的只读(计算)属性来控制其可见性,以便同时使用TextBox
和PasswordBox
。