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

C#技术问询:从含图片变量加载TextBlock内容及表情添加实现

在WPF TextBlock中从包含图片的变量加载内容方案

看起来你已经在WPF里实现了TextBlock追加文本和表情的基础功能,做得很不错!针对你提出的「从包含图片的变量中加载TextBlock内容」的需求,我整理了几个实用的方案:

首先先把你提到的现有基础代码整理出来,方便后续方案的衔接:

// 你已实现的文本追加函数
private void AddTextToString(TextBlock block, string txt) 
{ 
    var textRun = new Run(txt); 
    textRun.BaselineAlignment = BaselineAlignment.Center; 
    block.Inlines.Add(textRun); 
}

// 假设你配套的表情追加函数(基于Icons字典)
private void AddEmojiToString(TextBlock block, string emojiKey) 
{
    if (Icons.TryGetValue(emojiKey, out BitmapImage emojiImage))
    {
        var imageInline = new System.Windows.Controls.Image
        {
            Source = emojiImage,
            Width = 20, // 可根据需求调整尺寸
            Height = 20,
            VerticalAlignment = VerticalAlignment.Center
        };
        block.Inlines.Add(imageInline);
    }
}

// 你的Icons字典(字符串映射BitmapImage)
private Dictionary<string, BitmapImage> Icons = new Dictionary<string, BitmapImage>();

方案1:解析带表情标记的文本变量(最常用场景)

如果你有一个混合了普通文本和表情标记的字符串变量(比如"Hi there 😊 今天也要加油 🎉",或者自定义标记格式"Hi there [smile] 今天也要加油 [cheer]"),可以通过解析文本片段,自动区分并追加内容:

public void LoadContentFromMarkedText(TextBlock block, string contentWithMarkers)
{
    // 先清空TextBlock原有内容
    block.Inlines.Clear();
    
    // 这里用正则拆分文本和表情标记(示例用[]包裹表情键)
    // 如果你的标记是其他格式(比如:smile:),修改正则即可
    var segments = Regex.Split(contentWithMarkers, @"(\[[^\]]+\])");
    
    foreach (var segment in segments)
    {
        if (string.IsNullOrWhiteSpace(segment))
            continue;
            
        // 判断当前片段是表情标记还是普通文本
        if (segment.StartsWith("[") && segment.EndsWith("]"))
        {
            var emojiKey = segment.Trim('[', ']');
            AddEmojiToString(block, emojiKey);
        }
        else
        {
            AddTextToString(block, segment);
        }
    }
}

方案2:直接加载富文本片段变量

如果你的变量本身就是Paragraph或InlineCollection类型(已经包含了Run文本和Image内联元素),可以直接复制内容到目标TextBlock:

public void LoadFromRichContentVariable(TextBlock block, Paragraph richContent)
{
    block.Inlines.Clear();
    // 遍历富文本的内联元素,逐个添加到TextBlock
    foreach (var inline in richContent.Inlines.ToList())
    {
        block.Inlines.Add(inline);
    }
}

提示:如果是完整的FlowDocument,可以先获取它的Blocks中的Paragraph元素再处理。


方案3:序列化/反序列化保存的内容

如果你的内容是之前序列化存储的(比如把TextBlock的Inlines保存为XAML或JSON),可以通过反序列化重新加载:

先实现序列化(保存内容)

public string SerializeTextBlockContent(TextBlock block)
{
    // 将TextBlock的内联元素序列化为XAML字符串
    return XamlWriter.Save(block.Inlines);
}

再实现反序列化(加载内容)

public void LoadFromSerializedContent(TextBlock block, string serializedContent)
{
    block.Inlines.Clear();
    var inlines = (InlineCollection)XamlReader.Parse(serializedContent);
    foreach (var inline in inlines)
    {
        block.Inlines.Add(inline);
    }
}

注意:如果你的BitmapImage是内存中的图片,序列化时需要先转换为Base64字符串,加载时再转回BitmapImage,避免资源引用丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:37:14