我有一个 WPF 列表框,里面有一些自定义项。
当用户想要删除该项目时,发生的情况是他必须在删除后手动重新选择列表,因为列表“似乎”失去焦点或不存在选定的项目。
任何想法 ?
谢谢乔纳森
我有一个 WPF 列表框,里面有一些自定义项。
当用户想要删除该项目时,发生的情况是他必须在删除后手动重新选择列表,因为列表“似乎”失去焦点或不存在选定的项目。
任何想法 ?
谢谢乔纳森
我们总是通过在代码中设置所选项目来处理这个问题。如果它是列表中的最后一项,则将所选索引设为最后一项。否则,我们将其设置为已删除的后一个。
if (SnippetsList.Items.Count > index)
SnippetsList.SelectedIndex = index;
else
SnippetsList.SelectedIndex = SnippetsList.Items.Count - 1;
我也在努力解决这个问题(因此进行了此编辑)。解决方案是存储已删除的索引并保存以备后用。有点hack,但到目前为止我发现的最好的:
<Window x:Class="KeepFocusAfterDelete.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="200" Width="200">
<Grid>
<ListBox KeyUp="ListBox_KeyUp">
<ListBoxItem>1</ListBoxItem>
<ListBoxItem>2</ListBoxItem>
<ListBoxItem>3</ListBoxItem>
<ListBoxItem>4</ListBoxItem>
</ListBox>
</Grid>
</Window>
代码是
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace KeepFocusAfterDelete
{
public partial class MainWindow : Window
{
int prev = -1;
public MainWindow() { InitializeComponent(); }
private void ListBox_KeyUp(object sender, KeyEventArgs e)
{
var list = sender as ListBox;
switch (e.Key)
{
case Key.Delete:
prev = list.SelectedIndex;
var items = list.SelectedItems.Cast<object>().ToList();
foreach (var item in items) list.Items.Remove(item);
prev = list.Items.Count > prev ? prev : list.Items.Count - 1;
list.SelectedIndex = prev;
break;
case Key.Up:
if (-1 != prev)
{
list.SelectedIndex = prev - 1;
prev = -1;
}
break;
case Key.Down:
if (-1 != prev)
{
prev = list.Items.Count > prev + 1 ? prev + 1: list.Items.Count - 1;
list.SelectedIndex = prev;
prev = -1;
}
break;
}
}
}
}
选择项目“2”,按 Delete,然后按向下箭头。所选项目从项目“1”快速更改为项目“4”。
谢谢,-Ole