wpf xceed工具包水印文本框使水印显示直到第一次输入

2024-04-26

默认行为是当文本框获得焦点时水印消失。我想让水印内容仅在用户键入第一个字符时消失,然后在清除文本后重新出现。有人有好的方法来实现这一点吗?


我已经为你调整了默认样式。现在,水印默认显示为(稍暗)默认系统“非活动文本”颜色,并且当水印接收焦点但没有内容时,水印的不透明度会转换为 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.Resources在你的App.xaml。随意调整颜色和不透明度值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wpf xceed工具包水印文本框使水印显示直到第一次输入 的相关文章

随机推荐