wpf-为TextBox设置部分背景

最初方案

最开始我想的是放一个矩形,调整margin和width,盖住就好了。写完我感觉我傻逼了,因为这样的话,TextBox的内容是无法复制的。。。不过倒是get了如何用LinearGradientBrush填充单一色块。
在这里插入图片描述

<Grid Grid.Row="1" Height="200">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" Text="TTAGCCT" Margin="0" FontFamily="Courier New" FontSize="18.01" VerticalAlignment="Bottom"/>
    <TextBlock Grid.Row="1" Text="|||||||" Margin="0" FontFamily="Courier New" FontSize="18.01" VerticalAlignment="Top"/>
    <TextBox Grid.Row="2" Text="AATCGGA" Margin="0" FontFamily="Courier New" FontSize="18.01" VerticalAlignment="Top"/>
    <Rectangle Grid.Row="0" Grid.RowSpan="3" Visibility="Visible" x:Name="myRec" Opacity="0.35" Margin="24,0,0,0" >
        <Rectangle.Fill>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,0" >
                <GradientStop Color="LightBlue" Offset="0"/>
                <GradientStop Color="LightBlue" Offset="0.18"/>
                <GradientStop Color="White" Offset="0.18"/>
                <GradientStop Color="White" Offset="1.0"/>
                <LinearGradientBrush.Transform >
                    <TranslateTransform X="0.1"/>
                </LinearGradientBrush.Transform>
            </LinearGradientBrush>
        </Rectangle.Fill>
    </Rectangle>
    <Button Grid.Row="3" Content="click" Width="40"  Click="Button_Click"/>
</Grid>

最终方案

在后台改写TextBox的background,通过调整GradientStop控制位置和长度。start和end就根据控件的长度/字符的长度之类的自己调吧。。。
点击click后的效果

<Grid Grid.Row="1" Height="200">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <Border Grid.Row="0" Grid.RowSpan="5" Background="Bisque" />
    <TextBox x:Name="mybox" Grid.Row="0" Text="TTAGCCT" Margin="0" FontFamily="Courier New" FontSize="18.01" VerticalAlignment="Bottom"/>
    <TextBlock Grid.Row="1" Text="|||||||" Margin="0" FontFamily="Courier New" FontSize="18.01" VerticalAlignment="Top"/>
    <TextBox Grid.Row="2" Text="AATCGGA" Margin="0" FontFamily="Courier New" FontSize="18.01" VerticalAlignment="Top"/>
    <Button Grid.Row="3" Content="click" Width="40"  Click="Button_Click"/>
</Grid>

后台

private LinearGradientBrush GetBlockBackground(double start, double end) {
    LinearGradientBrush lgb = new LinearGradientBrush();
    // 只需要水平渐变
    lgb.StartPoint = new Point(0, 0);
    lgb.EndPoint = new Point(1, 0);
    // 左侧透明块
    GradientStop gs1 = new GradientStop();
    gs1.Color = Colors.Transparent;
    gs1.Offset = 0;
    lgb.GradientStops.Add(gs1);
    // 蓝色开始位置
    GradientStop gs2 = new GradientStop();
    gs2.Color = Colors.Transparent;
    gs2.Offset = start;
    lgb.GradientStops.Add(gs2);
    // 同一位置设置两种颜色的GradientStop
    GradientStop gs22 = new GradientStop();
    gs22.Color = Colors.LightBlue;
    gs22.Offset = start;
    lgb.GradientStops.Add(gs22);
    // 蓝色结束位置
    GradientStop gs3 = new GradientStop();
    gs3.Color = Colors.LightBlue;
    gs3.Offset = end;
    lgb.GradientStops.Add(gs3);
    // 同一位置设置两种颜色的GradientStop
    GradientStop gs33 = new GradientStop();
    gs33.Color = Colors.Transparent;
    gs33.Offset = end;
    lgb.GradientStops.Add(gs33);
    // 右侧结束
    GradientStop gs4 = new GradientStop();
    gs4.Color = Colors.Transparent;
    gs4.Offset = 1.0;
    lgb.GradientStops.Add(gs4);
    return lgb;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.mybox.Background = GetBlockBackground(0.026, 0.044);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF中,可以通过设置TextBox控件的水印文本来实现添加背景字符。 以下是一个示例: ```xaml <TextBox Text="Enter text here..." Foreground="Gray" IsEnabled="{Binding IsTextBoxEnabled}" Style="{StaticResource MyTextBoxStyle}"/> ``` 其中,Text属性设置了文本框中默认的提示文本,Foreground属性设置了提示文本的颜色。IsEnabled属性用于控制文本框是否可编辑。 另外,还需要定义一个样式来设置提示文本的样式: ```xaml <Style x:Key="MyTextBoxStyle" TargetType="TextBox"> <Style.Resources> <VisualBrush x:Key="WatermarkBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None"> <VisualBrush.Visual> <TextBlock Text="Enter text here..." Foreground="Gray"/> </VisualBrush.Visual> </VisualBrush> </Style.Resources> <Setter Property="Background" Value="White"/> <Setter Property="BorderBrush" Value="Gray"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Padding" Value="2"/> <Setter Property="Margin" Value="5"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TextBox}"> <Grid> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True"/> <Border Background="{StaticResource WatermarkBrush}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True" Opacity="{Binding Path=Text.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}"> </Border> <ScrollViewer Margin="0" x:Name="PART_ContentHost"/> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> </Trigger> <Trigger Property="IsKeyboardFocused" Value="True"> <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> ``` 在样式中,定义了一个VisualBrush作为提示文本的背景,使用了一个TextBlock作为VisualBrush的Visual元素,设置了文本和颜色。在控件模板中,使用了两个Border元素,第一个用于显示文本框的背景和边框,第二个用于显示提示文本,通过Opacity属性来控制其显示和隐藏。最后,在控件模板中添加了几个触发器来处理文本框的状态变化。 通过上述方式,就可以在WPF中实现文本框添加背景字符的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值