我試圖實現相當於WinForms ListView
及其View
屬性設置爲View.List
。從視覺上看,以下工作正常。我的Listbox
中的文件名從頂部到底部,然後換行到新列。ListBox + WrapPanel箭頭鍵導航
這裏是基本的XAML我的工作:
<ListBox Name="thelist"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding}"
ScrollViewer.VerticalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True"
Orientation="Vertical" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
然而,默認的箭頭鍵導航不換行。如果選擇了列中的最後一項,則按向下箭頭不會轉到下一列的第一項。
我試圖處理KeyDown
事件是這樣的:
private void thelist_KeyDown(object sender, KeyEventArgs e) {
if (object.ReferenceEquals(sender, thelist)) {
if (e.Key == Key.Down) {
e.Handled = true;
thelist.Items.MoveCurrentToNext();
}
if (e.Key == Key.Up) {
e.Handled = true;
thelist.Items.MoveCurrentToPrevious();
}
}
}
這將產生最後的列來首次在下一列的行爲,我想,但也產生一種奇妙的左側和向右箭頭處理。任何時候使用向上/向下箭頭從一列到下一個/上一個向後,使用左側或右側箭頭鍵將選擇移動到恰好在包裹發生之前選擇的項目的左側或右側。
假設列表中填充了字符串「0001」到「0100」,每列有10個字符串。如果我使用向下箭頭鍵從「0010」到「0011」,然後按右箭頭鍵,選擇移動到「0020」,剛好在「0010」的右側。如果選擇「0011」並使用向上箭頭鍵將選擇移至「0010」,則按下右箭頭鍵將選擇移至「0021」(在「0011」的右側,按左箭頭鍵移動選擇設置爲「0001」。
任何幫助實現所需的列,包裹布局和方向鍵導航,將不勝感激。
(編輯轉移到我自己的答案,因爲它在技術上是一個答案。)
太棒了,這對我有很大的幫助。 ;) – Inferis 2009-03-16 20:55:36