为TreeViewItem添加前后导航按钮并解决越界问题
解决TreeViewItem导航边界溢出问题
你的问题很典型——导航逻辑没做边界校验,当选中最后一项时再点前进,index + 1就会超出集合的最大索引,直接触发索引越界异常。其实只需要在执行选中操作前加个简单的判断就行,我给你两种优化方案:
方案一:基于你现有代码修改
保留你原来的foreach逻辑,只在选中下一项前判断是否已经到了最后一项:
private void MainUser_button_next_Click(object sender, RoutedEventArgs e) { int index = 0; foreach (TreeViewItem i in TreeviewUsers.Items) { if (i.Equals(MainTreeView.SelectedItem)) { break; } index++; } // 核心:判断下一个索引是否在合法范围内 if (index + 1 < TreeviewUsers.Items.Count) { (TreeviewUsers.Items[index + 1] as TreeViewItem).IsSelected = true; } // 可选:如果想给用户提示,可以加这段 // else // { // MessageBox.Show("已经是最后一项啦,无法继续前进"); // } }
对应的后退按钮也需要做类似的边界判断,避免选中第一项后再点后退出错:
private void MainUser_button_prev_Click(object sender, RoutedEventArgs e) { int index = 0; foreach (TreeViewItem i in TreeviewUsers.Items) { if (i.Equals(MainTreeView.SelectedItem)) { break; } index++; } if (index > 0) { (TreeviewUsers.Items[index - 1] as TreeViewItem).IsSelected = true; } // 可选提示 // else // { // MessageBox.Show("已经是第一项啦,无法继续后退"); // } }
方案二:用IndexOf简化代码
WPF的ItemsCollection自带IndexOf方法,可以直接获取选中项的索引,省去foreach循环的冗余,代码更简洁:
private void MainUser_button_next_Click(object sender, RoutedEventArgs e) { // 直接获取当前选中项的索引,找不到返回-1 int currentIndex = TreeviewUsers.Items.IndexOf(MainTreeView.SelectedItem); // 先判断索引有效,再判断下一个索引是否在范围内 if (currentIndex != -1 && currentIndex + 1 < TreeviewUsers.Items.Count) { (TreeviewUsers.Items[currentIndex + 1] as TreeViewItem).IsSelected = true; } }
后退按钮同理:
private void MainUser_button_prev_Click(object sender, RoutedEventArgs e) { int currentIndex = TreeviewUsers.Items.IndexOf(MainTreeView.SelectedItem); if (currentIndex != -1 && currentIndex > 0) { (TreeviewUsers.Items[currentIndex - 1] as TreeViewItem).IsSelected = true; } }
这样修改后,不管点前进还是后退到边界,都不会再报错了。如果需要给用户反馈,还可以加上提示框或者状态文本,提升体验~
内容的提问来源于stack exchange,提问作者Ginjo
相关产品推荐
相关产品推荐

