You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现WPF TextBox默认灰色文本999.999.999.999,修改后变黑?

嘿,这个需求很常见,我给你两种实用的实现方式,你可以根据自己的开发习惯选:

方法一:纯XAML+转换器(MVVM友好)

这种方式不需要后台写太多逻辑,通过样式触发器和值转换器来控制文本颜色:

首先,你需要添加一个值转换器,用来判断文本是否是默认的提示内容:

public class IsNotDefaultIpConverter : IValueConverter
{
    // 判断当前文本是否不是默认的"999.999.999.999"
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var inputText = value as string;
        return !string.Equals(inputText, "999.999.999.999", StringComparison.Ordinal);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException(); // 这里不需要反向转换
    }
}

然后在窗口/页面的资源里声明这个转换器:

<Window.Resources>
    <local:IsNotDefaultIpConverter x:Key="IsNotDefaultIpConverter"/>
</Window.Resources>

最后修改你的TextBox,添加样式触发器:

<TextBox x:Name="address_textBox" Height="19" Margin="246,107,166,0" 
         TextWrapping="Wrap" Text="999.999.999.999" VerticalAlignment="Top" Width="128">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <!-- 默认设置灰色 -->
            <Setter Property="Foreground" Value="Gray"/>
            <Style.Triggers>
                <!-- 当文本不是默认值时,切换为黑色 -->
                <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Self}, 
                             Converter={StaticResource IsNotDefaultIpConverter}}" 
                             Value="True">
                    <Setter Property="Foreground" Value="Black"/>
                </DataTrigger>
                <!-- 获得焦点时强制黑色,方便用户输入 -->
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Foreground" Value="Black"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

方法二:后台事件处理(快速上手)

如果不想写转换器,直接通过事件处理来控制更直观:

先修改XAML,绑定几个事件:

<TextBox x:Name="address_textBox" Height="19" Margin="246,107,166,0" 
         TextWrapping="Wrap" Text="999.999.999.999" VerticalAlignment="Top" Width="128"
         GotFocus="AddressTextBox_GotFocus" 
         LostFocus="AddressTextBox_LostFocus"
         TextChanged="AddressTextBox_TextChanged"/>

然后在后台代码里实现事件逻辑:

private void AddressTextBox_GotFocus(object sender, RoutedEventArgs e)
{
    var textBox = sender as TextBox;
    if (textBox != null && textBox.Text == "999.999.999.999")
    {
        // 获得焦点时清空默认文本,切换黑色
        textBox.Text = string.Empty;
        textBox.Foreground = Brushes.Black;
    }
}

private void AddressTextBox_LostFocus(object sender, RoutedEventArgs e)
{
    var textBox = sender as TextBox;
    if (textBox != null)
    {
        // 失去焦点时如果文本为空或等于默认值,恢复提示样式
        if (string.IsNullOrWhiteSpace(textBox.Text) || textBox.Text == "999.999.999.999")
        {
            textBox.Text = "999.999.999.999";
            textBox.Foreground = Brushes.Gray;
        }
    }
}

private void AddressTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    var textBox = sender as TextBox;
    if (textBox != null && textBox.Text != "999.999.999.999")
    {
        // 用户修改内容后,强制文本黑色
        textBox.Foreground = Brushes.Black;
    }
}

两种方法都能实现你的需求:默认提示文本灰色,用户输入后切换黑色。方法一更适合MVVM架构,方法二更适合快速开发~

内容的提问来源于stack exchange,提问作者user9250176

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:21:16