|:智能感知能力丰富的文本框
{A}简介
天前,我开发了一个小应用程序,其中有一个小的功能,可以根据用户的输入,这是最像Visual Studio IDE弹出一个列表。这是一个很酷的的功能,这将使您的应用程序更加用户友好。我提取的代码片段,然后建立一个自定义控件扩展RichTextBox类, 并添加一些依赖属性,现在你可以使用这个项目的自定义控制,添加智能感知轻松。
最后的结果是如下:如何使用控制
好了,让我们来谈谈如何使用这个自定义控件。这是非常非常简单的添加到您的RichText框这种控制的IntelliSense。正如你可以看到在以后的文章中,我添加了两个属性,以自定义的RichTextBox,这是ContentAssistSource和ContentAssistTriggers。让我们来看看XAML代码的第一:<rabbit:RichTextBoxEx Name="richTextBoxEx1"
AutoAddWhiteSpaceAfterTriggered="{Binding IsChecked,ElementName=chkAutoAddWhitespace}"
ContentAssistTriggers="{Binding ContentAssistTriggers}"
ContentAssistSource="{Binding ContentAssistSource}" />
它是非常非常简单,权利?你只需要在代码隐藏列表中绑定两个属性,首先是ContentAssistTriggers,这将触发的IntelliSense用户类型的字符,以丰富的文本框时,第二个是ContentAssistSource,这是该项目的字符列表将用于智能感知。如何实施的Intellisense
可以智能感知如何实施?首先,我们需要添加一个ListBox自订控制项,并把它添加到丰富的文本框的父,这应该是quot; Gridquot;这里。{C}
正如你可以在上面看到,我们增加了一些事件到ListBox,如PreviewKeyDown和MouseDoubleClick,其实他们处理用户的输入时的IntelliSense弹出。你可以找到我在我的源代码中的事件。
再其次,我们应该重写RichTextBox的OnTextInput方法,该方法将被调用,当用户输入一个丰富的文本框中的字符。在此方法中,我们检查是否用户输入触发字符,如果情况属实,我们将弹出的IntelliSense,这实际上是设置ListBox的知名度可见。正如你可以看到下面的代码片段中,我们不只能显示在ListBox,但过滤的内容也根据用户的输入协助源,然后设置ListBox中的ItemSource到过滤列表中。protected override void OnTextInput(System.Windows.Input.TextCompositionEventArgs e)
{
base.OnTextInput(e);
if (IsAssistKeyPressed == false && e.Text.Length == 1)
{
if (ContentAssistTriggers.Contains(char.Parse(e.Text)))
{
ResetAssistListBoxLocation();
IsAssistKeyPressed = true;
FilterAssistBoxItemsSource();
return;
}
}
if (IsAssistKeyPressed)
{
sbLastWords.Append(e.Text);
FilterAssistBoxItemsSource();
}
}
第三,我们应该覆盖的方法OnPreviewKeyDown。在此方法中,我们检查是否用户按下回车键,空格或制表符,如果他们按这些键和协助的内容列表框是可见的,插入选定的项目,这实际上是字符串,丰富的文本框。protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
{
if (!IsAssistKeyPressed)
{
base.OnPreviewKeyDown(e);
return;
}
ResetAssistListBoxLocation();
if (e.Key == System.Windows.Input.Key.Back)
{
if (sbLastWords.Length > 0)
{
sbLastWords.Remove(sbLastWords.Length - 1, 1);
FilterAssistBoxItemsSource();
}
else
{
IsAssistKeyPressed = false;
sbLastWords.Clear();
AssistListBox.Visibility = System.Windows.Visibility.Collapsed;
}
}
//enter key pressed, insert the first item to richtextbox
if ((e.Key == Key.Enter || e.Key == Key.Space || e.Key == Key.Tab))
{
AssistListBox.SelectedIndex = 0;
if (InsertAssistWord())
{
e.Handled = true;
}
}
if (e.Key == Key.Down)
{
AssistListBox.Focus();
}
base.OnPreviewKeyDown(e);
}
到现在为止,我们的自定义丰富的文本框有智能感知能力。您必须havenbsp;
注意到,我打电话给名为FilterAssistBoxItemsSource方法,是的,这是其中一个最重要的方法,有助于显示的intellisense。只要看看代码:
历史四月十二日,2011年:战后初期private void FilterAssistBoxItemsSource()
{
IEnumerable<string> temp = ContentAssistSource.Where
(s => s.ToUpper().StartsWith(sbLastWords.ToString().ToUpper()));
AssistListBox.ItemsSource = temp;
AssistListBox.SelectedIndex = 0;
if (temp.Count() == 0)
{
AssistListBox.Visibility = System.Windows.Visibility.Collapsed;
}
else
{
AssistListBox.Visibility = System.Windows.Visibility.Visible;
}
}