Xaml 如何更改uwp RichEditBox中某些子字符串的格式?

Xaml 如何更改uwp RichEditBox中某些子字符串的格式?,xaml,uwp,richeditbox,winui,Xaml,Uwp,Richeditbox,Winui,我正在尝试使用UWP中的RichEditBox构建一个“标记化”URL文本框。基本上,我想要一个如下所示的URL栏: 这张照片来自中国。请注意,与其他字符相比,方括号包围的子字符串具有特定的格式。这正是我试图实现的功能,但我似乎不知道如何在RichEditBox中实现它 我所尝试的: 使用regex查找不同的子字符串,但我不知道如何在RichEditBox中查找这些子字符串的索引位置。似乎没有可用的Find或IndexOf方法 我还尝试在每次引发TextChanged事件时更新文本格式。然而,

我正在尝试使用UWP中的RichEditBox构建一个“标记化”URL文本框。基本上,我想要一个如下所示的URL栏:

这张照片来自中国。请注意,与其他字符相比,方括号包围的子字符串具有特定的格式。这正是我试图实现的功能,但我似乎不知道如何在RichEditBox中实现它

我所尝试的:

  • 使用regex查找不同的子字符串,但我不知道如何在RichEditBox中查找这些子字符串的索引位置。似乎没有可用的
    Find
    IndexOf
    方法
  • 我还尝试在每次引发TextChanged事件时更新文本格式。然而,我正在努力解决这个问题,因为您需要了解其他字符,以确定是否应该格式化子字符串。管理此状态信息很麻烦,因为当您同时开始删除或添加多个字符时,事情会变得很奇怪
下面是我为上面列出的第二种方法尝试的一些代码

private void RichEdditBox\u TextChanged(对象发送方,RoutedEventArgs e)
{
如果(发送方为RichEditBox r)
{
字符串oldText=_text;
r、 Document.GetText(TextGetOptions.None,out string newText);
如果(oldText==newText)返回;
int
textLength=newText.Length,
selectionLength=r.Document.Selection.Length,
selectionStart=r.Document.Selection.StartPosition;
var currentStart=selectionStart-2;
bool-isEnd=false;
如果(Math.Abs(textLength-oldText?.Length±0)>1)
{
重组数据集(r);
}
如果(currentStart>=0&&newText[selectionStart-1]='{'&&newText[currentStart]='{')
{
如果(!\u startList.Contains(currentStart))\u startList.Add(currentStart);
}
如果(currentStart>=0&&newText[selectionStart-1]='}'&&newText[currentStart]='}')
{
isEnd=真;
如果(!\u endList.Contains(currentStart))\u endList.Add(currentStart);
}
如果(i结束)
{
var previousEnd=_endList.Where(x=>xxpreviousEnd).DefaultIfEmpty(-1).Max();
突出显示(r,匹配开始,currentStart+2);
}
_文本=新文本;
}
}
私有无效重新格式化数据集(RichEditBox r)
{
_惊吓者;
_endList.Clear();
r、 Document.GetText(TextGetOptions.None,out string text);
var range=r.Document.GetRange(0,text.Length-1);
range.CharacterFormat.BackgroundColor=Windows.UI.Colors.Transparent;
r、 Document.ApplyDisplayUpdates();
var startIndex=text.IndexOf(“{”,0);
var endIndex=text.IndexOf(“}}”,0);
而(开始索引>-1 | |结束索引>-1)
{
如果(startIndex>-1&&endIndex>-1&&endIndex>startIndex+2)
{
突出显示(r、起始索引、结束索引+2);
}
如果(开始索引>-1)
{
_STARTIST.Add(startIndex);
startIndex=text.IndexOf(“{{”,startIndex+1);
}
如果(endIndex>-1)
{
_endList.Add(endIndex);
endIndex=text.IndexOf(“}}”,endIndex+1);
}
}
}
专用空白突出显示(RichEditBox r,整数开始,整数结束)
{
如果(开始<0 | |结束<0)返回;
var range=r.Document.GetRange(开始、结束);
range.CharacterFormat.BackgroundColor=Windows.UI.Colors.LightBlue;
r、 Document.ApplyDisplayUpdates();
}
私有列表_startList=新列表();
私有列表_endList=新列表();
私有字符串_文本;

我测试了您的代码,它看起来是正确的,但我不知道为什么要清除
\u startList
\u endList
,当添加新文本时,它将重新突出显示所有文本。