2014-02-07 36 views
2

我在我的Windows應用程序中有5個按鈕。當我點擊箭頭鍵對焦按鈕之間進行切換,那麼只有從下一個控件觸發KeyUp事件

KEYUP

事件觸發。如何阻止此?

+0

你想停止發射'KeyUp'事件嗎?或者你想要一些其他事件,比如'KeyDown'也可以開火嗎? –

+1

我想要從按下箭頭鍵時有焦點的確切按鈕觸發KeyUp事件。 –

+0

這是默認行爲。當你按下箭頭鍵時,焦點將變爲下一個控制,然後你釋放鍵,所以你從下一個按鈕中獲得了'KeyUp'事件。如果長時間不釋放按鍵,它將繼續將焦點從一個控件轉換到另一個控件,當您釋放按鍵時,您將從焦點控制中獲得「KeyUp」事件。 – Sameer

回答

1

改爲訂閱PreviewKeyDown事件。

在焦點位於此控件上時按下鍵時發生在KeyDown事件之前。

當您在按鈕中移動時,參數sender將包含先前選擇的按鈕。


我發現一個解決方案,應該爲你工作,從here改編。顯然,MS做出了決定,方向鍵不會觸發KeyDown事件,所以你不能取消它們。

一種解決方法是指定您的箭頭鍵是正常的輸入鍵,就像任何其他鍵。然後,KeyDown事件將觸發,如果需要,您可以取消按鈕按下。

private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) 
     e.IsInputKey = true; 
} 

private void button1_KeyDown(object sender, KeyEventArgs e) 
{ 
    e.Handled = true; 
} 

您可能需要閱讀that post其他答案和評論,看看會有什麼工作最好在您的情況。

+0

你能告訴我應該在PreviewKeyDown中做什麼來停止焦點移動到下一個控件? –

+0

我想我明白你現在想要做什麼。我編輯了我的答案。 –

+0

是的,這是我需要的。但是我在發佈之前找到了這個。無論如何很好顯示答案。 –

0

答案在評論你的問題

void button1_LostFocus(object sender, EventArgs e) 
    { 
     button1.Focus(); 
    } 
+0

它每次只聚焦button1。其實我想把焦點放在按下箭頭鍵的按鈕上。 –

0

爲了防止最多從一個Button移動焦點,你必須使用至少3種方法:

bool _focus; 

    private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     if (e.KeyCode == Keys.Up) 
      _focus = true; 
    } 

    private void button1_KeyUp(object sender, KeyEventArgs e) 
    { 
     _focus = false; 
    } 

    private void button1_Leave(object sender, EventArgs e) 
    { 
     if(_focus) 
      button1.Focus(); // or (sender as Control) 
    } 

訣竅是使用標誌時用戶按向上並返回焦點Leave。您必須取消標記KeyUp,否則將無法更改焦點(例如按標籤爲例)。

你可以在Leave中取消標記,我沒有測試它。