返回首页

{A}{S0}简介
{A2}我写了如何在Microsoft Outlook中搜索灵感。想象一下,你有一个WPF应用程序中的ListView和您正在寻找一个在个别项目的文本。这将是有益的,突出显示文本的。在本演示中使用的代码可以调整它的地方适当使用TextBox控件显示和突出显示的文本。背景
这是假设你有C#和WPF的基本知识。此应用程序是用来代替文字TextBlock控制项,内联的属性和类的运行,通过它我们可以改变文本属性(如前景,背景,字号等)的财产。使用代码
创建一个ListView和TextBlock搜索。在ListView的即时搜索添加一个TextBox的TextChanged事件。

<DockPanel LastChildFill="True">      

  <StackPanel  HorizontalAlignment="Left" DockPanel.Dock="Top">           

              <Label Name="labelSearch" Content="Search"/>  

              <TextBox Name="textboxsearch" Width="309" 

			TextChanged="textboxsearch_TextChanged"

                >            

              </TextBox>

 </StackPanel> 

       <ListView Name="listview" Width="310" DockPanel.Dock="Top" 

	HorizontalAlignment="Left" FontWeight="Bold" FontSize="16" AlternationCount="2"

       	ItemContainerStyle="{StaticResource AlternateItemStyle}">

            <ListView.View>          

          <GridView>     

           <GridViewColumn Header="First Name" 

		DisplayMemberBinding="{Binding Path=FirstName}">

           </GridViewColumn>     

           <GridViewColumn Header="Last Name" 

		DisplayMemberBinding="{Binding Path=LastName}">

           </GridViewColumn

          </GridView>    

        </ListView.View>

        </ListView>

    </DockPanel> 

使用TextChanged事件,发现所有的递归方法FindListViewItem ListViewItem的项目。 VisualTreeHelper类GetChildrenCount将带来数儿童对象。{C}
如果DependecyObject类型的ListViewItem,使用递归的方法HighlightText TextBlock对象中的ListViewItem查找{A3}
private void HighlightText(Object itx)

        {

            if (itx != null)

            {

                if (itx is TextBlock)

                {

                   ..

                    }

                        else

                        {

                          ...

                        }

                    }

                    return;

                }

                else

                { 

                   ...

                }

            }

        }

如果对象是TextBlock的类型,创建一个新的实例正则表达式。
(参数RegExOptions.IgnoreCase忽略大写和小写字母。)
插入括号,你将达到进入该领域的文本的分工,这将包括在搜索文本。
 regex = new Regex("(" + textboxsearch.Text + ")", RegexOptions.IgnoreCase);

在TextBlock中的文字分割成一个字符串数组援助RegEx.Split。清除与Inlines.Clear原来的文本。
tb.Inlines.Clear(); 

,并再次在foreach循环,创造比较RegEx.Match的搜索字词字段表达式的文本。
foreach (var item in substrings)  

{

if (regex.Match(item).Success)

?/pre>



If identical, then use the Run class, create new Inline element, add text, change the background color, and add text to TextBlock with Inlines.Add methods. Otherwise, just add text.

Run runx = new Run(item);



runx.Background = Brushes.Red;



tb.Inlines.Add(item);

全面的背景改变文本的代码:{A4}
foreach (var item in substrings)

                    {

                        if (regex.Match(item).Success)

                        {

                            Run runx = new Run(item);

                            runx.Background = Brushes.Red;

                            tb.Inlines.Add(runx);

                        }

                        else

                        {

                            tb.Inlines.Add(item);

                        }

                    }

现在我们可以启动该项目,并尝试搜索。结论
此应用程序不创建任何特殊的效果,当您突出显示文本,但我认为它可以作为一个灵感。
我希望你发现它有用和感谢阅读。历史8月20日,2010年:战后初期|一月Vilášek

回答

评论会员:游客 时间:2012/01/26
喜谢谢你的代码,它的工作,但是我有addapted它的工作与一个TreeView和一个texblock(会喜欢了一个TextBox工作!)和小文件,它的工作原理非常好,但对较大的文本它是约3秒钟,暂停的应用程序!所以有什么办法可以加快跟进?codeprelang="c#"spanclass="code-keyword"public/spanspanclass="code-keyword"void/spanFindTreeViewItem(DependencyObjectobj){spanclass="code-keyword"for/span(spanclass="code-keyword"int/spani=spanclass="code-digit"0/span;i<VisualTreeHelper.GetChildrenCount(obj);i++){TreeViewItemlv=objspanclass="code-keyword"as/spanTreeViewItem;spanclass="code-keyword"if/span(lv!=spanclass="code-keyword"null/span){HighlightText(lv);}FindTreeViewItem(VisualTreeHelper.GetChild(objspanclass="code-keyword"as/spanDependencyObject,i));}}/pre/code codeprelang="c#"spanclass="code-keyword"private/spanspanclass="code-keyword"void/spanHighlightText(spanclass="code-SDKkeyword"Object/spanitx){spanclass="code-keyword"if/span(itx!=spanclass="code-keyword"null/span){spanclass="code-keyword"if/span(itxspanclass="code-keyword"is/spanTextBlock){regex=spanclass="code-keyword"new/spanRegex(spanclass="code-string""/spanspanclass="code-string"("/span+textboxsearch.Text+spanclass="code-string""/spanspanclass="code-string")"/span,RegexOptions.IgnoreCase);TextBlocktb=itxspanclass="code-keyword"as/spanTextBlock;spanclass="code-keyword"if/span(textboxsearch.Text.Length==spanclass="code-digit"0/span){spanclass="code-keyword"string/spanstr=tb.Text;tb.Inlines.Clear();tb.Inlines.Add(str);spanclass="code-keyword"return/span;}spanclass="code-keyword"string/span[]substrings=regex.Split(tb.Text);tb.Inlines.Clear();spanclass="code-keyword"foreach/span(spanclass="code-keyword"var/spanitemspanclass="code-keyword"in/spansubstrings){spanclass="code-keyword"if/span(regex.Match(item).Success){Runrunx=spanclass="code-keyword"new/spanRun(item);runx.Background=Brushes.CornflowerBlue;tb.Inlines.Add(runx);}spanclass="code-keyword"else/span{tb.Inlines.Add(item);}}spanclass="code-keyword"return/span;}spanclass="code-keyword"else/span{spanclass="code-keyword"for/span(spanclass="code-keyword"int/spani=spanclass="code-digit"0/span;i<VisualTreeHelper.GetChildrenCount(itxspanclass="code-keyword"as/spanDependencyObject);i++){HighlightText(VisualTreeHelper.GetChild(itxspanclass="code-keyword"as/spanDependencyObject,i));}}}}/pre/code
muthuprakash
评论会员:游客 时间:2012/01/26
您好,我有一个疑问。我填充我的ListView。我给一个搜索文本和突出,但在ListView时突出显示我的ListView的内容重新排序和几个内容被截断。需要你的帮助。IAM使用VirtualizingStackPanel.VirtualizationMode="回收"
muthuprakash
评论会员:游客 时间:2012/01/26
嗨,你必须送我你的代码或截图汉斯
muthuprakash
评论会员:游客 时间:2012/01/26
将非常thankfull如果我能得到一个答案
muthuprakash
评论会员:游客 时间:2012/01/26
您好最简单的方法是:在ListView设置VirtualizingStackPanel.IsVirtualizing="真"VirtualizingStackPanel.VirtualizationMode="再造"汉斯修改上周五,4月22日,2011下午02:37
会员1551426
评论会员:游客 时间:2012/01/26
太感谢你了..它工作正常,现在.​​.....但我有一个疑问。要清除搜索文本发送string.empty突出IAM使用相同的代码。是否有任何其他方式明确突出...非常感谢您的关注.....{BR}
会员1551426
评论会员:游客 时间:2012/01/26
您好,我的问题是我的ListView是完全不突出。IAM使用相同的源代码。只有UI上显示的行似乎加以强调。其他行不突出,甚至当我向下滚动
。DnGutierrez
评论会员:游客 时间:2012/01/26
感谢您的代码但是,当在ListView公顷的很多项目,我怎么能滚动的项目,使文本中发现可以看得见?BR}的问候,罗伯托|DnGutierrez:
感谢
。您可以使用:
listview.Items.MoveCurrentToPosition(X)
其中x是第一个选择的项目的位置和
listview.ScrollIntoView(listview.Items.CurrentItem)
滚动到当前位置。
希望这会帮助
评论会员:。zameb 时间:2012/01/26
Mmmmhhh ....{ BR}我是一个小糊涂... (不是很能够
在现实世界中,我有两种情况:
1。选择的项目是不visibile
2。有更多的项目符合条件,但是当手动滚动列表视图的项目未被选中。你可以试试你的代码增加了数百个项目。

你能帮助我吗?
非常感谢你!
Roerto
评论会员:克里斯托夫braendle 时间:2012/01/26
???虚拟化在ListView设置为"默认情况下将其关闭,然后按
LT;的ListView
&# 160;VirtualizingStackPanel.IsVirtualizing ="FALSE"GT
LT / ListViewwgt;