richTextBox中如果取得夹在某行中间的某个run对象

ajqc 2011-11-21 04:29:52
因为某些特殊需要,我需要获取一个richTextBox中每一个run对象.它们有的是在单独一行中,这样的好取出.但有的切是处于某行中间.前面或后面有别的文本.以至于一下子找不出办法来取得这种run对象.打个比方.某个richTextBox的纯文本如下
123AAA456
它们全在一行中.其中AAA是一个单独的run.它的内容的xaml如下:
<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:wa="clr-namespace:WpfApplication1;assembly=WpfApplication1"><Paragraph><Run xml:lang="zh-cn">123456</Run></Paragraph><Paragraph><Run>AAA</Run></Paragraph></FlowDocument>
我现在想获得这个<Run>AAA</Run>对象,有没有什么好办法
...全文
174 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajqc 2011-11-24
  • 打赏
  • 举报
回复
to fallincloud
看了你的回贴.夜里1点忍不住,又仔细debug了一回,终于找出了问题:2个run之间如果有N(N>=1)个空格.那么就会自动被解析成3个run.如果之间1个空格都没有.会自动把前后2个run合并成1个,这就是悲剧之源了.而不是我之前以为的会自动把一行里的全部RUN给合并.所以你的例子能达到你的示范效果,而我的测试则总是达不到我的要求.差别原因也很简单:你的是自己写好了xaml.我的不是,我是一个空的richtextbox,然后从别的地方取过来的值赋给这个richtextbox.然后我对这richtextbox做了一些拖拽,复制粘贴,中间还有一个run是后台代码插入的.刚刚好我测试的第一个想法就是最特殊的特例,结果成了这样.呵呵,谢谢.
加以加你QQ吗
fallincloud 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ajqc 的回复:]

没用的,你上面给我贴的2节代码,和我现在正在写着的代码很类似.但就是没办法处理多个run在同一行时的怎么把run对象给取出来的问题
[/Quote]

打印信息:

Paragraph 1, Run's Text is 123456
Paragraph 2, Run's Text is AAA
Paragraph 2, Run's Text is
Paragraph 2, Run's Text is EEEE
Paragraph 2, Run's Text is
Paragraph 2, Run's Text is CCC
Paragraph 2, Run's Text is
Paragraph 2, Run's Text is DDD
Paragraph 3, Run's Text is AAA
Paragraph 3, Run's Text is
Paragraph 3, Run's Text is EE
Paragraph 3, Run's Text is
Paragraph 3, Run's Text is C
Paragraph 3, Run's Text is
Paragraph 3, Run's Text is D

XAML:

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True">
<Paragraph>
<Run>123456</Run>
</Paragraph>
<Paragraph>
<Run>AAA</Run>
<Run>EEEE</Run>
<Run>CCC</Run>
<Run>DDD</Run>
</Paragraph>
<Paragraph>
<Run>AAA</Run>
<Run>EE</Run>
<Run>C</Run>
<Run>D</Run>
</Paragraph>
</FlowDocument>


除了一些 让人困惑的空格外,所有Run都打印出来了。。
ajqc 2011-11-22
  • 打赏
  • 举报
回复
没用的,你上面给我贴的2节代码,和我现在正在写着的代码很类似.但就是没办法处理多个run在同一行时的怎么把run对象给取出来的问题
fallincloud 2011-11-21
  • 打赏
  • 举报
回复
示例程序参考:http://dl.dbank.com/c0s2jaoerdRichTextBoxTest
fallincloud 2011-11-21
  • 打赏
  • 举报
回复
还有一个方法



private static IEnumerable<Run> FindSpecaiRuns(RichTextBox source, string text)
{

if (source == null)
{
throw new ArgumentException();
}


if (string.IsNullOrEmpty(text))
yield return null;


if (source.Document == null)
yield return null;


Run run = null;
FlowDocument doc = source.Document;
int index = 0;
foreach (Paragraph item in doc.Blocks)
{
index++;
InlineCollection ic = item.Inlines;
Inline il = ic.FirstInline;
while (il != null)
{
run = il as Run;
if (run != null)
{
System.Diagnostics.Debug.Print(string.Format("Paragraph {0}, Run's Text is {1}", index, run.Text));
if (run.Text == text)
yield return run;

il = il.NextInline;
}
}
}
}
fallincloud 2011-11-21
  • 打赏
  • 举报
回复
试着用如下代码:


private static Run FindSpecaiRun(RichTextBox source, string text)
{
if (source == null)
{
throw new ArgumentException();
}

if (string.IsNullOrEmpty(text))
return null;

Run run = null;
if (source.Document == null)
return run;

FlowDocument doc = source.Document;

foreach (Paragraph item in doc.Blocks)
{
InlineCollection ic = item.Inlines;
Inline il = ic.FirstInline;
while (il != null)
{
run = il as Run;
if (run != null)
{
if (run.Text == text)
return run;

il = il.NextInline;
}
}
}

return run;
}
ajqc 2011-11-21
  • 打赏
  • 举报
回复
to fallincloud:
在这一行只有这个run时,是可以的.可以直接把Inline对象转成run,但这一行还有别的元素,那不行了,找了一下,没找出列举Inline对象的子元素的办法来

直接用name这样的方式不可行.因为我要操作的这内容不是我定的,从别的地方取来的,中间包含不确定个数的run对像
fallincloud 2011-11-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ajqc 的回复:]

加上name后怎么获取这run?
[/Quote]直接在cs使用该名字就是这个Run的对象了
fallincloud 2011-11-21
  • 打赏
  • 举报
回复
要在后台代码获取就遍历Paragraph查找啊,
RichTextBox有FlowDocument属性,
FlowDocument有个集合属性Blocks每一个Block就是一个Paragraph
Paragraph有Inlines集合属性,遍历Inlines中类型为Run的对象,Run有个Text的属性,根据匹配的Text就可以找到那个Run了。
ajqc 2011-11-21
  • 打赏
  • 举报
回复
加上name后怎么获取这run?
fallincloud 2011-11-21
  • 打赏
  • 举报
回复
不可以给那个Run取个名字么?

<Run x:Name="RunA">AAA</Run>

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧