有一个带有图像的列表框。用户用鼠标在ListBox中选择一张图片,将键盘上的箭头在列表中向右移动(From Image,当前元素的Source用于增加)。在当前实现中,不设置为当前索引的位置。使用当前正确的索引,它将选择从移动的图像中设置为 +1,如果您将其设置为 hard ContainerFromIndex(3)
,它还会以相同的方式将其设置为 +1,在另一个方向上设置为 -1。怎么看不到0,在+1和-1之间。
ListBoxPhotos.Items.Insert(Index + 2, img);
ListBoxPhotos.Items.RemoveAt(Index);
ListBoxPhotos.SelectedItem = null;
ListBoxPhotos.SelectedIndex = Index + 1;
ListBoxItem listBoxItem = ListBoxPhotos.ItemContainerGenerator.ContainerFromIndex(Index) as ListBoxItem;
listBoxItem.Focus();
<ListBox
SelectionChanged="ListBoxItemClick"
SelectionMode="Single"
x:Name="ListBoxPhotos"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
VerticalAlignment="Center"
Background="#FF5CB57A"
BorderBrush="{x:Null}" KeyDown="StackPanel_KeyDown">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" KeyDown="StackPanel_KeyDown"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
这个选项做它需要做的,它只是显示一个MessageBox,这里不需要。每次显示并且焦点更改或某些属性时。我无法弄清楚哪个属性正在改变。如果已定义,则可以在没有 MessageBox 的情况下以编程方式调用它。
for (int i = 0; i < ListBoxPhotos.Items.Count; i++)
{
object yourObject = ListBoxPhotos.Items[i];
ListBoxItem lbi = (ListBoxItem)ListBoxPhotos.ItemContainerGenerator.ContainerFromItem(yourObject);
if (lbi.IsFocused)
{
MessageBox.Show("Item at index " + i.ToString() + " has the focus.");
break;
}
ListBoxPhotos.SelectedIndex = Index + 1;
ListBoxItem listBoxItem = ListBoxPhotos.ItemContainerGenerator.ContainerFromIndex(ListBoxPhotos.SelectedIndex - 1) as ListBoxItem;
listBoxItem.Focus();
}
单击按钮时移动集合元素并不像看起来那么困难。
我将基于集合
ObservableCollection
和数据绑定做一个例子。据我了解,您不熟悉 MVVM 设计模式,并且您拥有窗口类中的所有代码。因此,我将在那里向您展示数据上下文设置。下面的代码将需要一个帮助类来使用命令(它们在 WPF 中使用而不是事件处理程序)。
和一个小清单
窗口类需要这样修改
这里:
INotifyPropertyChanged
,使接口可以动态更新。ObservableCollection<string>
- 带有来自的图像路径的集合Source
。SelectedItem
, 选中的列表框元素附在此处SelectedIndex
转换SelectedItem
为其索引(假设集合中的所有字符串都是唯一的且不重复)MoveCommand
- 按下键时调用的命令这是标记
当您按下键盘上的箭头时,元素会按预期向右或向左移动。焦点仍然在选定的元素上。
可以使用修饰符指定键
InputBindings
,例如Key="Right" Modifiers="Ctrl"
.请注意,控件甚至没有名称
x:Name
,这里不需要它们。重点如下。它
ListBox
具有在列表中左右滚动的标准行为。它需要重新加载。我没有,并且发生了冲突。目前,您可以像这样解决它:Grid
定义一个KeyDown
名为OnKeyDownHandler
.最终代码:
链接到另一个答案