wpf listview 中的 keydown 不起作用

发布于 2024-11-20 00:41:05 字数 111 浏览 5 评论 0原文

如果我使用 wpf 列表框并在没有数据模板的情况下填充一些项目,则用户可以通过键入前几个字母来选择一个项目。

如果您使用列表视图或数据模板,这将不再起作用。

一个人会怎样做呢?

If I use a wpf listbox and fill it with some items without datatemplate, the user can select an item by typing the first few letters.

If you use a listview or a datatemplate this doesn't work anymore.

How would one do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

他不在意 2024-11-27 00:41:05

挂钩 PreviewKeyDown 事件并循环访问项目。如果您遇到以按下的键开头的项目,请将其设置为已选择。

Hook into the PreviewKeyDown event and loop through the items. If you encounter an item that begins with the key that was pressed, set it as selected.

疏忽 2024-11-27 00:41:05

在列表中添加预览按键处理程序:

private void OnConfigRecordsPreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    e.Handled = Util.ScrollListBoxToLetter<CSVModel>(lvConfigRecords, e.Key.ToString(), i => i.HostName);
}

添加扩展方法以使 linq 工作:


public static List<T> CollectionToList<T>(this ItemCollection collection) where T : class
{
    var list = new List<T>();
    foreach (var item in collection)
    {
        if (item is T)
        {
            var typedItem = item as T;
            list.Add(typedItem);
        }
    }

    return list;
}

public static bool ScrollListBoxToLetter<T>(ListView listView, string key, Func<T, string> TextToMatch) where T : class
{
    if (string.IsNullOrWhiteSpace(key) || key.Length != 1 || !char.IsLetterOrDigit(key.First()))
    { return false; }

    var selectedItem = listView.Items.CollectionToList<T>().Select((item, id) => new { Item = item, Id = id })?.FirstOrDefault(item => (TextToMatch(item.Item)?.FirstOrDefault() ?? ' ').ToString().Trim().ToLower() == key.ToLower());

    if (selectedItem != null)
    {
        listView.SelectedItem = selectedItem.Item;
        listView.ScrollIntoView(selectedItem.Item);

        var item = listView.ItemContainerGenerator.ContainerFromIndex(selectedItem.Id) as ListViewItem;
        if (item != null)
            item.Focus();
    }

    return true;
}

Add preview key down handler on list:

private void OnConfigRecordsPreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    e.Handled = Util.ScrollListBoxToLetter<CSVModel>(lvConfigRecords, e.Key.ToString(), i => i.HostName);
}

Add extension method to make linq work:


public static List<T> CollectionToList<T>(this ItemCollection collection) where T : class
{
    var list = new List<T>();
    foreach (var item in collection)
    {
        if (item is T)
        {
            var typedItem = item as T;
            list.Add(typedItem);
        }
    }

    return list;
}

public static bool ScrollListBoxToLetter<T>(ListView listView, string key, Func<T, string> TextToMatch) where T : class
{
    if (string.IsNullOrWhiteSpace(key) || key.Length != 1 || !char.IsLetterOrDigit(key.First()))
    { return false; }

    var selectedItem = listView.Items.CollectionToList<T>().Select((item, id) => new { Item = item, Id = id })?.FirstOrDefault(item => (TextToMatch(item.Item)?.FirstOrDefault() ?? ' ').ToString().Trim().ToLower() == key.ToLower());

    if (selectedItem != null)
    {
        listView.SelectedItem = selectedItem.Item;
        listView.ScrollIntoView(selectedItem.Item);

        var item = listView.ItemContainerGenerator.ContainerFromIndex(selectedItem.Id) as ListViewItem;
        if (item != null)
            item.Focus();
    }

    return true;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文