2008-10-21 46 views
4

我有一個滾動視圖內的畫布。我將一個keydown事件處理程序附加到scrollview。對於大多數鍵,處理程序被調用。silverlight keydown事件不會觸發箭頭鍵

但是,對於箭頭鍵,處理程序不會被調用。相反,scrollview會以適當的方向滾動。

我還附加了一個keyup處理程序的滾動視圖和keyup確實被稱爲箭頭鍵。

有沒有辦法在這裏得到箭頭鍵按下事件?

回答

1

我發現這個愚蠢的黑客使其工作。將scrollview設置爲不是tabstop可以避免吃掉關鍵事件......但是後來我在頁面上又出現了另一個文本框,突然之間一直突然關注,因爲scrollview沒有了。所以我通過讓一個不可見的文本框獲得焦點來解決這個問題。

scrollView.IsTabStop = false; 

invisibleTextBox.Foreground = new SolidColorBrush(Colors.Transparent); 
invisibleTextBox.Background = new SolidColorBrush(Colors.Transparent); 
Canvas.SetZIndex(invisibleTextBox, -1000); 
invisibleTextBox.KeyDown += new KeyEventHandler(HandleKeyDown); 
invisibleTextBox.KeyUp += new KeyEventHandler(HandleKeyUp); 

編輯:我也不得不將文本框從畫布上移開,因爲儘管看不見,它的輪廓仍然顯示出來。

第2編輯:我使用了一個文本框,因爲這是我發現的第一件可以捕獲KeyDown事件的東西。但是,UserControl可以。所以使用UserControl代替不可見的文本框可能會更好。如果需要,可以在UserControl上調用Focus()。

0

這是一個可能的答案 - 我還沒有機會測試這個。儘管過去我也遇到類似的麻煩,但是在控制權消耗事件之前,你可以先看看它們。有幾件事你可以嘗試:

  1. 使用PreviewKeyDown事件,我認爲這就是它的名字。它可以讓你在事件被控制器消耗之前得到事件。
  2. 嘗試使用mblandfo的建議,但如果你這樣做了,你可能會將所有東西都包裝在用戶控件中,以隱藏你在其他代碼中所做的事情。
  3. 爲Canvas對象添加一個關鍵處理程序,您可以在那裏捕捉事件,並通過自己的事件「冒泡」。

除了1)所有這些都算作黑客,真的,但祝你好運,我希望他們中的一個適合你! 「

-1

」使用PreviewKeyDown事件,我認爲這就是它的名稱,它可以讓你在事件被控件佔用之前得到它。「

This Works。只要將事件參數設置爲「Handled = true」,ScrollViewer(或ListBox)就不會在處理完事件後抓住事件。雖然我不需要使用ListBox的IsTabStop屬性;而且它似乎沒有做任何事情。

+3

在WPF中工作,但silverlight沒有預覽關鍵字down – 2010-01-05 22:56:19

2

只需使用KeyUp事件。奇蹟般有效。

相關問題