如何在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
相关产品推荐
相关产品推荐

