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

如何在C# Xamarin Android项目中添加RichTextBox或替代控件?

解决方案:Xamarin Android 替代 RichTextBox 并实现行内容获取

首先,Xamarin Android 并没有直接对应 Windows Forms 中 RichTextBox 的原生控件,但我们可以通过原生控件改造或轻量方案来满足你的核心需求——获取文本行内容(替代 .Lines 属性),同时完成新歌更新提醒的功能。下面是具体的方案和代码适配建议:

一、原生控件替代方案(无需第三方库)

1. 使用 EditText(支持编辑+多行)

如果需要保留文本编辑能力,把 EditText 设置为多行模式即可,然后通过字符串分割模拟 .Lines 属性的效果:

  • 在布局文件(.axml)中添加控件:
<EditText
    android:id="@+id/editText1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textMultiLine"
    android:minLines="5" />
  • 代码中处理行内容:
// 替代 RichTextBox1.Clear()
editText1.Text = string.Empty;

// 设置爬取到的文本
editText1.Text = parsedResult;

// 模拟 .Lines[0] 获取第一行内容
var lines = editText1.Text.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
if (lines.Length > 0)
{
    var firstLine = lines[0];
    // 后续的新歌检查逻辑...
}

2. 使用 TextView(仅显示+多行)

如果只需要展示文本无需编辑,TextView 更轻量,同样支持多行显示和行内容获取:

  • 布局中添加控件:
<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxLines="10"
    android:scrollbars="vertical" />
  • 行内容处理方式和 EditText 完全一致,通过 Text.Split 分割换行符得到行数组即可。

二、核心逻辑的 Xamarin Android 适配

你的核心需求是定时爬取网页、检查新歌、触发提醒,需要适配 Android 的线程规则和音频播放方式:

1. 线程更新UI的修正

Android 不允许后台线程直接更新UI,必须通过 RunOnUiThread 操作,替代原来的 CheckForIllegalCrossThreadCalls = false:

private void ThreadTask1()
{
    string link = "http://example.com/music-today.php";
    int timeToWait = 300;
    int checkId = 0;
    HtmlAgilityPack.HtmlDocument doc = null;
    HtmlWeb web1 = new HtmlWeb();

    while (true)
    {
        string parsedResult = "";
        web1.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)";
        web1.UsingCache = false;
        web1.UseCookies = true;
        doc = web1.Load(link);
        HtmlNode div = doc.DocumentNode.SelectSingleNode("//div[@class='latest-song14']");

        if (div != null)
        {
            parsedResult = div.InnerText.Trim();
            // 切换到UI线程更新控件
            RunOnUiThread(() =>
            {
                editText1.Text = parsedResult;
                var lines = editText1.Text.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
                if (lines.Length > 0)
                {
                    var firstLine = lines[0];
                    if (!firstLine.Contains("dj"))
                    {
                        // 触发提醒音效
                        PlayAlarmSound();
                    }
                    else
                    {
                        checkId++;
                        textViewStatus.Text = $"No new song yet. Try ({checkId})";
                    }
                }
            });
        }

        System.Threading.Thread.Sleep(timeToWait * 1000);
    }
}

// 启动后台线程
private void MainActivity_OnCreate(object sender, EventArgs e)
{
    Thread trd1 = new Thread(ThreadTask1);
    trd1.IsBackground = true;
    trd1.Start();
}

2. 音频提醒的适配

替代 Windows 的 Computer.Audio.Play,使用 Android 的 MediaPlayer 播放音效:

private async void PlayAlarmSound()
{
    while (true)
    {
        // 播放提醒音效(需将Alarm01.wav放入Resources/Raw文件夹)
        var mediaPlayer = MediaPlayer.Create(this, Resource.Raw.Alarm01);
        mediaPlayer.Start();
        await Task.Delay(700);
        mediaPlayer.Release();

        mediaPlayer = MediaPlayer.Create(this, Resource.Raw.Alarm01);
        mediaPlayer.Start();
        await Task.Delay(700);
        mediaPlayer.Release();

        mediaPlayer = MediaPlayer.Create(this, Resource.Raw.Alarm01);
        mediaPlayer.Start();
        await Task.Delay(5000);
        mediaPlayer.Release();
    }
}

注意:需将 Alarm01.wav 放入项目的 Resources/Raw 文件夹(无则创建),并设置其生成操作为 AndroidResource。

三、富文本控件的第三方方案(可选)

如果确实需要富文本编辑能力(比如字体样式、颜色),可以考虑以下第三方库:

  • Syncfusion Xamarin Rich Text Editor:支持完整的富文本编辑和格式化,可通过API获取文本行内容。
  • Telerik UI for Xamarin RichTextEditor:功能类似,提供成熟的富文本处理能力。

这些控件需要安装对应NuGet包,具体使用可参考官方文档。

内容的提问来源于stack exchange,提问作者wins-flower1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:45:22