You need to enable JavaScript to run this app. WPF中如何在Button_Click事件下实现「●」后输入文本在TextBlock中变色?
优惠活动
大模型
产品
解决方案
定价
更多

WPF中如何在Button_Click事件下实现「●」后输入文本在TextBlock中变色?

需求说明

想要实现项目符号「●」之后的剩余文本单独变色的效果:交互逻辑为用户在TextBox输入框内输入文本,点击按钮触发Button_Click事件,处理后的结果展示在TextBlock控件中。当前编写的代码无法达到预期效果,需要排查代码错误、遗漏的实现步骤。

你贴出的原始代码

TextBlock inputTxt = new TextBlock();

private void Button_Click(object sender, RoutedEventArgs e)
{
  if (txtBox != null)
  {
    if (txtBox.Text.StartsWith("●"))
      {
        inputTxt.Text = txtBox.Text.Substring(2);
        inputTxt.Foreground = Brushes.Blue;

        txtBlock.Text = bullet + inputTxt.Text;
      }
      else txtBlock.Text = txtBox.Text;
  }
}

预期效果参考:
效果示例图


代码存在的核心问题

  • 单独实例化的inputTxtTextBlock是游离对象,从未被添加到界面的可视元素树中,给它设置的蓝色字体属性根本不会渲染到界面上。最后只是把inputTxt的纯文本值拼到了txtBlock.Text属性里,所有设置好的格式完全丢失,只拿到了无格式的纯字符串。
  • TextBlock的Text属性仅支持存储纯字符串,直接给该属性赋值会清空TextBlock内部所有带格式的内联元素,根本无法实现「同一行文本不同颜色」的效果。
  • 字符串截取逻辑有误:「●」是单个字符,在字符串中占1个索引位置,写的Substring(2)会从索引位置2开始截取,相当于把「●」之后紧跟的第一个字符也一并切掉了。
  • 代码中引用的bullet变量未在贴出的逻辑片段中明确定义,和实际输入的项目符号字符没有做匹配校验,容易出现取值不匹配的问题。

修正后的实现方案

要实现TextBlock的部分文本变色,需要借助TextBlock的Inlines集合,把不同格式的内容拆分为独立的Run元素逐一添加,具体代码如下:

private void Button_Click(object sender, RoutedEventArgs e)
{
    // 每次渲染前清空原有内容,避免历史文本残留
    resultTxtBlock.Inlines.Clear();
    string inputContent = txtBox.Text;

    if (inputContent.StartsWith("●"))
    {
        // 项目符号保持默认字体颜色
        resultTxtBlock.Inlines.Add(new Run("●"));
        // 截取项目符号后的文本,单独设置为蓝色
        string remainingText = inputContent.Substring(1);
        resultTxtBlock.Inlines.Add(new Run(remainingText)
        {
            Foreground = Brushes.Blue
        });
    }
    else
    {
        // 无项目符号时直接渲染普通文本
        resultTxtBlock.Inlines.Add(new Run(inputContent));
    }
}

内容的提问来源于stack exchange,提问作者Dôn Kayt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.15 14:06:04