2016-09-21 12 views
0

私のテストでは、SelectedIndexChangedは、タブコントロールとしてClickより前に常にトリガーされています。タブで "SelectedIndexChanged"が必ず "クリック"の前にトリガーされることが保証されていますか?

私の質問:

は、この動作は、.NET Frameworkによってを保証されている、またはClickイベントが最初にトリガーされる状況がありますか?これまでのところ、私はドキュメンテーションの呼び出し順序に関して何も言及していませんでした。

答えて

1

コントロールTabControlのsource codeを確認できます。

は、TabControlWndProcでトリガされます。

OnClickは、基本ControlクラスのWndProcで発生します。

ベースWndProcは(それが最後の命令である)TabControlWndProcの最後に呼び出されるので、SelectedIndexChangedは常にClickイベントの前に起動されます。

は、ここでのコードの断片が関与している:

のTabControlのWndProcメソッド

protected override void WndProc(ref Message m) { 
    switch (m.Msg) { 
     // Something... 
     case NativeMethods.WM_REFLECT + NativeMethods.WM_NOTIFY: 
      NativeMethods.NMHDR nmhdr = (NativeMethods.NMHDR) m.GetLParam(typeof(NativeMethods.NMHDR)); 
      switch (nmhdr.code) { 
       case NativeMethods.TCN_SELCHANGE: 
        if (WmSelChange()) // Here will fire the event { 
         m.Result = (IntPtr)1; 
         tabControlState[TABCONTROLSTATE_UISelection] = false; 
         return; 
        } 
        else { 
         tabControlState[TABCONTROLSTATE_UISelection] = true; 
        } 
        break; 
      } 
      break; 
    } 
    // Something... 
    base.WndProc(ref m); // The Control WndProc 
} 

コントロールのWndProcメソッド

protected virtual void WndProc(ref Message m) { 
    // Something... 
    switch (m.Msg) { 
     // Something... 
     case NativeMethods.WM_LBUTTONUP: 
      WmMouseUp(ref m, MouseButtons.Left, 1); // Here will fire Click event 
      break; 
     // Something... 
    } 
} 
+0

アップ&と受け入れました。将来のための良いアイデアは、ソースコードを確認する。どうも! –

関連する問題