65.9K
CodeProject 正在变化。 阅读更多。
Home

类似 Apple 的菜单搜索框

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.63/5 (4投票s)

2008年4月10日

CPOL

2分钟阅读

viewsIcon

35871

downloadIcon

462

一个用于搜索菜单的搜索框。

引言

你可能见过 Apple 菜单中的搜索框,无论是来自 Mac OS X 本身,还是像我一样,从图片中看到的。我认为这是一个很酷的功能,所以我开发了一个可扩展的 WPF 控件,用于搜索所有菜单项。

搜索框运行时的截图

背景

该项目主要由两个类组成,MenuSearchBoxBaseMenuSearchBoxMenuSearchBoxBase 是抽象的,不包含匹配和收集项目以及显示结果的代码,而仅包含用于此的抽象函数。MenuSearchBox 是菜单搜索框的基本实现。

搜索过程分为 4 个步骤

  1. 清除
    protected abstract void ClearResults();

    在此步骤中,清除显示的搜索结果。请注意:当之前没有显示任何结果时,也会调用此函数。

  2. 收集
     protected abstract IEnumerable<Control> Collect(); 

    在此步骤中,收集要搜索的菜单项。通常,这些是包含搜索框的菜单的所有菜单项。

  3. 匹配
    protected abstract double Match(Control control, string search);

    此函数将为前一步收集的每个控件调用。结果是一个匹配分数,描述了控件与用户输入的搜索内容匹配的程度。匹配分数为 0 表示控件与搜索不匹配;这些结果将不会显示。

  4. 显示
    protected abstract void DisplayResults(IEnumerable<Control> results);

    此函数显示已收集且匹配分数大于 0 的结果。结果按匹配分数预排序;匹配分数在该函数中不可访问。

使用代码

由于可以将不仅仅是 MenuItem,还可以将任何控件插入到菜单中,因此只需在 XAML 文件中引用程序集并创建命名空间定义后,就可以将搜索框插入到菜单中。

<Window x:Class="Demo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:msb="clr-namespace:MenuSearch;assembly=MenuSearchBox">
    <!-- Namespace definiton -->
    
    <Menu>
        <MenuItem Header="Help">
            <msb:MenuSearchBox /><!--Search box defintion-->
        </MenuItem>
    </Menu>
    
</Window>

关注点

WPF 中的克隆?

因为我没有找到在 WPF 中克隆控件的方法(如果有,请告诉我),所以我不得不将所有控件移动到结果列表中,并在关闭菜单后将它们移回去。这要求我将包含搜索框的子菜单中的项目从搜索中排除,否则看起来会很奇怪,因为控件会消失并在结果列表中显示。

历史

星期四,4 月 10 日(我的生日:):文章发布。

© . All rights reserved.