WPF RichTextBox:在运行时用UI控件替换文本
我需要开发一个类似messenger的文本框,其中某些令牌将被UI控件替换。 例如,如果用户键入WPF RichTextBox:在运行时用UI控件替换文本,wpf,richtextbox,Wpf,Richtextbox,我需要开发一个类似messenger的文本框,其中某些令牌将被UI控件替换。 例如,如果用户键入:-),则应将其替换为笑脸图像 我以前使用过WPF的RichTextBox,我了解TextPointer和TextContent的概念 我只是想知道:如何用UI控件替换TextRange?刚刚想出了方法:-) 享受吧 刚刚想好怎么做:-) 享受吧 这里是另一个选项(语法格式化程序是我的,根据您的语法实现您自己的): private void ReplaceTokensWithControl(运行) {
:-)
,则应将其替换为笑脸图像
我以前使用过WPF的RichTextBox
,我了解TextPointer
和TextContent
的概念
我只是想知道:如何用UI控件替换
TextRange
?刚刚想出了方法:-)
享受吧
刚刚想好怎么做:-) 享受吧 这里是另一个选项(语法格式化程序是我的,根据您的语法实现您自己的):
private void ReplaceTokensWithControl(运行)
{
var text=run.text;
bool inToken=false;
var startIndex=0;
var-endIndex=0;
for(var i=0;i0&!(Char.IsWhiteSpace(text[i-1])| SyntaxFormatter.TextControlSpecialTokens.Contains(text[i-1]))
{
endIndex=i-1;
字符串标记=text.Substring(startIndex,endIndex-startIndex+1);
字符串tokenContext=text.Substring(0,startIndex);
if(SyntaxFormatter.IsTextControlToken(token,tokenContext))
{
var textBefore=run.Text.Substring(0,startIndex);
var runBefore=新运行(textBefore);
run.ContentStart.paragration.Inlines.InsertBefore(run,runBefore);
runAfter=null;
if(endIndex+1
这里是另一个选项(语法格式化程序是我的,根据您的语法实现您自己的):
private void ReplaceTokensWithControl(运行)
{
var text=run.text;
bool inToken=false;
var startIndex=0;
var-endIndex=0;
for(var i=0;i0&!(Char.IsWhiteSpace(text[i-1])| SyntaxFormatter.TextControlSpecialTokens.Contains(text[i-1]))
{
endIndex=i-1;
字符串标记=text.Substring(startIndex,endIndex-startIndex+1);
字符串tokenContext=text.Substring(0,startIndex);
if(SyntaxFormatter.IsTextControlToken(token,tokenContext))
{
var textBefore=run.Text.Substring(0,startIndex);
var runBefore=新运行(textBefore);
run.ContentStart.paragration.Inlines.InsertBefore(run,runBefore);
runAfter=null;
if(endIndex+1
很抱歉,忘记了方法的最后一节::-)
。。。
玩得开心!如果有评论,请留言
-Gili对不起,忘记了方法的最后一部分::-) 。。。 玩得开心!如果有评论,请留言 -吉利
public static void ReplaceTextRangeWithUIControl(this RichTextBox textBox, TextRange textRange)
{
if (textRange.Start.Parent is Run)
{
var run = textRange.Start.Parent as Run;
var runBefore =
new Run(new TextRange(run.ContentStart,textRange.Start).Text);
var runAfter =
new Run(new TextRange(textRange.End,run.ContentEnd).Text);
textRange.Start.Paragraph.Inlines.Add(runBefore);
textRange.Start.Paragraph.Inlines.Add(new TextBlock() { Background = Brushes.Green, Text = textRange.Text });
textRange.Start.Paragraph.Inlines.Add(runAfter);
textRange.Start.Paragraph.Inlines.Remove(run);
textBox.CaretPosition = runAfter.ContentEnd;
}
}
private void ReplaceTokensWithControl(Run run)
{
var text = run.Text;
bool inToken = false;
var startIndex = 0;
var endIndex = 0;
for (var i = 0; i < text.Length; i++)
{
if (Char.IsWhiteSpace(text[i]) | SyntaxFormatter.TextControlSpecialTokens.Contains(text[i]))
{
if (i > 0 && !(Char.IsWhiteSpace(text[i - 1]) | SyntaxFormatter.TextControlSpecialTokens.Contains(text[i - 1])))
{
endIndex = i - 1;
string token = text.Substring(startIndex, endIndex - startIndex + 1);
string tokenContext = text.Substring(0, startIndex);
if (SyntaxFormatter.IsTextControlToken(token, tokenContext))
{
var textBefore = run.Text.Substring(0, startIndex);
var runBefore = new Run(textBefore);
run.ContentStart.Paragraph.Inlines.InsertBefore(run, runBefore);
Run runAfter = null;
if (endIndex + 1 < run.Text.Length)
{
var textAfter = run.Text.Substring(endIndex + 1, run.Text.Length - (endIndex + 1));
runAfter = new Run(textAfter);
run.ContentStart.Paragraph.Inlines.InsertAfter(runBefore, runAfter);
}
runBefore.ContentStart
.Paragraph
.Inlines
.InsertAfter(runBefore,new InlineUIContainer(SyntaxFormatter.GetTokenTextControl(text, tokenContext)));
run.ContentStart.Paragraph.Inlines.Remove(run);
if (runAfter != null)
ReplaceTokensWithControl(runAfter);
return;
}
}
}
else
{
if (!inToken)
{
inToken = true;
startIndex = i;
}
}
}
var lastWord = text.Substring(startIndex, text.Length - startIndex);
if (SyntaxFormatter.IsTextToken(lastWord))
{
var tag = new SyntaxTokenProperties();
tag.StartPosition = run.ContentStart.GetPositionAtOffset(startIndex, LogicalDirection.Forward);
tag.EndPosition = run.ContentStart.GetPositionAtOffset(endIndex + 1, LogicalDirection.Backward);
tag.Word = lastWord;
}
}