XAML - 细化水印代码

时间:2014-10-21 13:11:10

标签: c# wpf xaml binding

我正在为我的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>

1 个答案:

答案 0 :(得分:0)

我将创建一个自定义附加属性(例如,WatermarkText),然后创建新的控件模板,该模板绑定到该值并将水印叠加在常规文本区域的顶部。使用触发器来控制其可见性,仅在未输入文本或密码时显示。您可能需要一个单独的只读(计算)属性来控制其可见性,以便同时使用TextBoxPasswordBox