WPF xceed工具箱水印文本框使水印显示,直到第一个条目(wpf xceed toolkit w

2019-10-21 06:21发布

默认行为是当文本框获得焦点水印消失。 我想使水印消失内容仅当用户键入的第一个字符,然后如果文字被清除再现。 任何人有做到这一点的好办法?

Answer 1:

我已经调整了默认样式为您服务。 现在的水印显示了(稍暗)系统默认的“无效文本”的默认颜色,并以0.4水印的不透明度过渡时接收焦点,但没有内容。 一旦有了文字,水印完全消失。 看起来不错,我认为:

<LinearGradientBrush x:Key="TextBoxBorder" EndPoint="0,20" MappingMode="Absolute" StartPoint="0,0">
  <GradientStop Color="#ABADB3" Offset="0.05" />
  <GradientStop Color="#E2E3EA" Offset="0.07" />
  <GradientStop Color="#E3E9EF" Offset="1" />
</LinearGradientBrush>

<LinearGradientBrush x:Key="TextBox_MouseOver" EndPoint="0,1" StartPoint="0,0">
  <GradientStop Color="#5794BF" Offset="0.05" />
  <GradientStop Color="#B7D5EA" Offset="0.07" />
  <GradientStop Color="#C7E2F1" Offset="1" />
</LinearGradientBrush>

<LinearGradientBrush x:Key="TextBox_Focused" EndPoint="0,1" StartPoint="0,0">
  <GradientStop Color="#3D7BAD" Offset="0.05" />
  <GradientStop Color="#A4C9E3" Offset="0.07" />
  <GradientStop Color="#B7D9ED" Offset="1" />
</LinearGradientBrush>

<SolidColorBrush x:Key="TextBox_DisabledBorder" Color="#ADB2B5" />
<SolidColorBrush x:Key="TextBox_DisabledBackground" Color="#F4F4F4" />

<DataTemplate x:Key="DefaultWatermarkTemplate">
  <ContentControl Content="{Binding}" Foreground="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" Focusable="False" />
</DataTemplate>

<Style TargetType="{x:Type extToolkit:WatermarkTextBox}">
  <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
  <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
  <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}" />
  <Setter Property="BorderThickness" Value="1" />
  <Setter Property="Padding" Value="3" />
  <Setter Property="AllowDrop" Value="true" />
  <Setter Property="FocusVisualStyle" Value="{x:Null}" />
  <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst" />
  <Setter Property="Stylus.IsFlicksEnabled" Value="False" />
  <Setter Property="WatermarkTemplate" Value="{StaticResource DefaultWatermarkTemplate}" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type extToolkit:WatermarkTextBox}">
        <Grid>

          <Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="1" Background="{TemplateBinding Background}" />
          <Border x:Name="MouseOverVisual" Opacity="0" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{StaticResource TextBox_MouseOver}" CornerRadius="1" />
          <Border x:Name="FocusVisual" Opacity="0" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{StaticResource TextBox_Focused}" CornerRadius="1" />
          <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
          <ContentPresenter x:Name="PART_WatermarkHost"
                            Content="{TemplateBinding Watermark}"
                            ContentTemplate="{TemplateBinding WatermarkTemplate}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                            IsHitTestVisible="False"
                            Margin="{TemplateBinding Padding}"
                            Visibility="Collapsed" />

        </Grid>
        <ControlTemplate.Triggers>
          <MultiTrigger>
            <MultiTrigger.Conditions>
              <Condition Property="Text" Value="" />
            </MultiTrigger.Conditions>
            <MultiTrigger.Setters>
              <Setter Property="Visibility" TargetName="PART_WatermarkHost" Value="Visible" />
            </MultiTrigger.Setters>
          </MultiTrigger>
          <MultiTrigger>
            <MultiTrigger.Conditions>
              <Condition Property="IsKeyboardFocusWithin" Value="True" />
              <Condition Property="Text" Value="" />
            </MultiTrigger.Conditions>
            <MultiTrigger.EnterActions>
              <BeginStoryboard>
                <Storyboard>
                  <DoubleAnimation Storyboard.TargetName="PART_WatermarkHost" Storyboard.TargetProperty="Opacity" To=".33" Duration="0:0:0.2" />
                </Storyboard>
              </BeginStoryboard>
            </MultiTrigger.EnterActions>
            <MultiTrigger.ExitActions>
              <BeginStoryboard>
                <Storyboard>
                  <DoubleAnimation Storyboard.TargetName="PART_WatermarkHost" Storyboard.TargetProperty="Opacity" Duration="0:0:0.4" />
                </Storyboard>
              </BeginStoryboard>
            </MultiTrigger.ExitActions>
          </MultiTrigger>
        <Trigger Property="Text" Value="">
          <Trigger.EnterActions>
            <BeginStoryboard>
              <Storyboard>
                <DoubleAnimation Storyboard.TargetName="PART_WatermarkHost" Storyboard.TargetProperty="Opacity" Duration="0:0:0.4" />
              </Storyboard>
            </BeginStoryboard>
          </Trigger.EnterActions>
          <Trigger.ExitActions>
            <BeginStoryboard>
              <Storyboard>
                <DoubleAnimation Storyboard.TargetName="PART_WatermarkHost" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.2" />
              </Storyboard>
            </BeginStoryboard>
          </Trigger.ExitActions>
        </Trigger>
          <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="MouseOverVisual" Property="Opacity" Value="1" />
          </Trigger>
          <Trigger Property="IsFocused" Value="True">
            <Setter TargetName="FocusVisual" Property="Opacity" Value="1" />
          </Trigger>
          <Trigger Property="IsEnabled" Value="false">
            <Setter TargetName="Border"  Property="BorderBrush" Value="{StaticResource TextBox_DisabledBorder}" />
            <Setter TargetName="Border"  Property="Background" Value="{StaticResource TextBox_DisabledBackground}" />
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

在整个应用程序中应用此最简单的方法是到XAML拖放到Application.ResourcesApp.xaml 。 随意调整颜色和不透明度值。



文章来源: wpf xceed toolkit watermark text box make watermark display until first entry