2012-06-11 70 views
0

我有一個顯示搜索結果列表的ListView。爲了方便起見,我想將F8綁定到搜索按鈕,以便用戶可以在鍵盤上按F8並執行搜索。使用KeyUp捕獲功能鍵時,將焦點放在ListView上

我在做這樣的事情:

private void UserControl_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.F8) 
    { 
     btnSearch.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
     lvResults.SelectedIndex = 0; 
     lvResults.Focus(); 
    } 
} 

btnSearch實際上是設置索引和集中本身。如果用戶點擊按鈕(或製表符並點擊空間),則設置焦點。如果我刪除selectedindex並在這裏集中,我會得到相同的行爲(所以這段代碼實際上是在重做,並且不需要)。使用此代碼,如果我點擊F8,則會選中第一行,但焦點仍然保留在我按F8時所處的文本框中。這是不可取的,因爲用戶希望能夠上/下箭頭來選擇他們想要的結果。

注意:如果我把焦點設置到另一個控件(不是列表視圖),它工作正常。另外,如果我嘗試將所選項目投射到ListViewItem中,則會出現錯誤,因爲在此情況下它是DataRowView。我也嘗試刪除btnSearch中的代碼並直接調用它,並且這也具有相同的結果。

所以,它正確地選擇行,但列表視圖沒有重點,而如果我點擊按鈕,它會。如果我設置另一個控件以獲得焦點,那麼可以工作,而不是此列表視圖。

+0

您是否嘗試過添加:'e.Handled = true'來確保別的東西沒有按鍵並嘗試處理它。在我的頭頂,我認爲文本框重新竊取了焦點,因爲它正在處理用戶控制處理程序觸發後的F8按鍵。 – CodingGorilla

+0

是的,對不起,試過了。 – jmlumpkin

+0

嘗試使用'FocusManager.SetFocusedElement' http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.setfocusedelement.aspx。您需要首先調用FocusManager.GetFocusScope,然後在調用SetFocusedElement時使用返回的FocusScope。 – CodingGorilla

回答

0

下面是一個測試項目的zip文件,其中的代碼工作正常;這只是一個垃圾測試項目,當我試圖幫助解決SO問題時,我會進行測試,因此忽略項目中的其他內容。 http://sdrv.ms/LuNKQt

此外,我會建議閱讀:http://julmar.com/blog/mark/?p=52,它有很多關於WPF重點的很好的信息。

最後,您可以使用Snoop(http://snoopwpf.codeplex.com/releases/view/73187)來嘗試監視程序並嘗試查看到底發生了什麼。