返回首页

|:智能感知能力丰富的文本框 {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。只要看看代码:
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;

    }

}
历史四月十二日,2011年:战后初期

回答

评论会员: 时间:2