以编程方式选择下一个列表框项目。

4

我正在尝试编写两个按钮来模拟上下箭头键的行为,这意味着当我按上按钮时,它会在我的列表框中向上移动一个项目,以此类推。我编写了以下代码:

private void mainlistup(object sender, System.Windows.RoutedEventArgs e)
{
    if (listBox_Copy.SelectedIndex != -1 &&
        listBox_Copy.SelectedIndex < listBox_Copy.Items.Count &&
        listBox_Copy.SelectedIndex !=1)
    {
        listBox_Copy.SelectedIndex = listBox_Copy.SelectedIndex - 1;
    }
}

private void mainlistdown(object sender, System.Windows.RoutedEventArgs e)
{
    if (listBox_Copy.SelectedIndex < listBox_Copy.Items.Count &&
       listBox_Copy.SelectedIndex != -1)
    {
        listBox_Copy.SelectedIndex = listBox_Copy.SelectedIndex + 1;
    }
}

这个方法是有效的,但是当点击按钮时,该项会失去选择...选择索引已经正确设置(其他数据绑定的项绑定到所选项显示正确的值),但是列表框中的项不再高亮显示。如何将所选项设置为高亮显示?

2个回答

5
您的 ListBox 可能刚失去了焦点。在设置 SelectedIndex 后,请执行以下操作:
listBox_Copy.Focus();

谢谢!你知道我怎样才能让列表框在选择了一个不可见的项目后自动滚动吗? - internetmw
@internetwjm:你可能正在寻找 ListBox.TopIndex。详情请参见此处:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.listbox.topindex.aspx - Hans Olsson
System.Windows.Controls.Listbox没有topindex的定义...?我需要包含某种引用吗? - internetmw
从快速谷歌搜索来看,BringIntoView 可能是你需要的,但我没有使用过 WPF,所以可能不正确。 - djdd87
谢谢!我搜索了一段时间,似乎listBox_Copy.ScrollIntoView(listBox_Copy.SelectedItem);是解决方案! - internetmw

2
如GenericTypeTea所说,这很可能与失去焦点有关。但另一个问题是你的代码过于复杂,不允许你上移到顶部的项目。我建议将其更改为以下内容:
移动到上方
if (listBox_Copy.SelectedIndex > 0)
{ 
     listBox_Copy.SelectedIndex = listBox_Copy.SelectedIndex - 1; 
}

向下移动

if (listBox_Copy.SelectedIndex < listBox_Copy.Items.Count - 1)
{
     listBox_Copy.SelectedIndex = listBox_Copy.SelectedIndex + 1;
}            

是的,这样更好。只添加 if(listbox_copy.selectedindex == 0){listbox_copy.focus();} 因为如果选择了第一项并按上键,它会再次移除焦点。 - internetmw
个人而言,我不会费心将Focus()方法封装在if语句中。我会在每次按钮点击时都执行它来实现上下移动。 - djdd87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接