2015-09-14 54 views
3

當列表視圖具有焦點時,回車鍵的默認行爲是選擇第一個元素listview,向上和向下箭頭鍵滾動列表視圖。我試圖防止這種默認行爲,並掛鉤我的自定義邏輯。防止在XAML/C#中的ListView的Return(Enter),向上和向下箭頭鍵的默認行爲(Windows 10)

我能夠使用的KeyDown的列表視圖如下實施訪問鍵:

背後的辦法代碼:

CoreWindow.GetForCurrentThread().KeyDown += KeyDownHandler; 

MVVM方法:

<ListView SelectedIndex="{Binding IsSelected, Mode=TwoWay}"/> 

觸發該keydown屬性:

<core:EventTriggerBehavior EventName="KeyDown"> 
     <core:InvokeCommandAction Command="{x:Bind VMDataContext.KeyDownCommand}" /> 
    </core:EventTriggerBehavior> 

並用行爲來滾動列表視圖來選擇指數的滾動條:

<corebehaviors:ListViewScrollBehaviour SelectedIndex="{x:Bind IsSelected, Mode=OneWay}"/> 

以上處理器越來越觸發時ListView控件沒有焦點。當列表視圖具有焦點時,箭頭向上,向下和Enter鍵的默認行爲被觸發,而不是我附加的行爲。有沒有辦法阻止默認行爲?

回答

5

考慮擴展ListView控件並覆蓋OnKeyDown處理程序。

public class ExtendedListView : ListView 
{ 
    protected override void OnKeyDown(KeyRoutedEventArgs e) 
    { 
     if (e.Key == VirtualKey.Enter || e.Key == VirtualKey.Up || e.Key == VirtualKey.Down) 
     { 
      return; 
     } 

     base.OnKeyDown(e); 
    } 
} 
+0

謝謝賈斯汀!它非常適用於Enter鍵而不是Up和Down。這很奇怪,因爲斷點沒有被上下箭頭鍵擊中。我也嘗試覆蓋OnKeyUp函數並觀察到相同的行爲。 –

+0

嗯,所有三個鍵都在我的測試項目中工作。 –

+0

順便說一句,你可能想在某些情況下調用'e.Handled = true;'而不是'return'。 –

1

試試這個

CoreWindow.GetForCurrentThread().KeyDown += new KeyEventHandler(ListView_KeyDown); 

private void ListView_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
     //do ur stuff 
} 

這將是一個更好的方法來與PreviewKeyDown事件工作KeyDown

+0

ListView_KeyDown(CoreWindow sender,KeyEventArgs args)只能接受CoreWindow和KeyEventArgs的參數。我也無法使用PreviewKeyDown。不知道這是否適用於WinRT應用程序。 –

1

Enter鍵,而不是爲所謂的VirtualKey(點擊鏈接查看MSDN文檔)。這應該完成它:

 private void UIElement_OnKeyDown(object sender, KeyRoutedEventArgs e) 
     { 
      if (e.Key == VirtualKey.Enter) 
      { 

      } 
     } 

希望這會有所幫助。

+0

如上所述,當Enter按鈕被按下時,輸入的這個keydown事件不會觸發ListView。相反,它是打開ListView的第一個項目 –

+0

是否有可能重寫ListView的默認行爲按Enter鍵? –

+0

我想你的意思是選擇第一個項目「打開第一個項目......如果你在ListView本身執行它,它應該工作導航到另一個頁面。但是,你必須考慮到,如果沒有預先選擇項目(例如使用箭頭鍵),它會一直進入第一個項目,如果選擇了另一個,它應該使用這個項目 – MSicc

相關問題