[Teaching] [Silverlight] 淺談按鍵控制及組合鍵

  • 2863
  • 0
  • 2010-08-25

Silverlight研究(一) 淺談按鍵控制及組合鍵

 

MSDN上有一個使用滑鼠拖曳控制項的基本範例,其原理如下:

1.     觸發MouseLeftButtonDown:記錄滑鼠目前位置。

2.     觸發MouseMove:以滑鼠目前位置 原位置,算出的變異量,加入目前控制項的位置,就等於控制項的新位置。

3.     觸發MouseLeftButtonUp:釋放滑鼠捕捉,清空紀錄值。

 

根據這樣的原理,我們可以依法炮製,使用鍵盤來控制物件的移動。

觸發KeyDown:判斷按下哪個按鍵,然後設定物件移動的變異量,dvdh為變異量,例如要往左就是dv = dh = -5

 

  

//取得Rectangle控制項

FrameworkElement elemt= this.rg1 as FrameworkElement;

  

//取得目前Rectangle控制項位置,加上變異量

double nTop = dv + (double)elemt.GetValue(Canvas.TopProperty);

double nLeft = dh + (double)elemt.GetValue(Canvas.LeftProperty);

  

//設定Rectangle控制項新位置

elemt.SetValue(Canvas.TopProperty, nTop);

elemt.SetValue(Canvas.LeftProperty, nLeft);

 

你一定會問,假使我希望控制項往右上方或左下方移動呢?照理說Silverlight是不支援組合鍵的,但不知道為什麼,當我嘗試同時按下,上跟右時,物件在某些時候的確有可能往左上方移動,十分弔詭。

 

但這並無法保證每次按都會成功,所以假使我們真的想要達到這樣的效果,我們必須另外設定一組  Key keymem = Key.Unknown。用來記憶第一次按下的按鍵。

因此,利用先紀錄第一次按下的按鍵,再與第二次按下的按鍵做判斷,就可以知道使用者是否有按下組合鍵了。

但必須要記得觸發KeyUp事件,將keymem = Key.Unknown釋放。

 

使物件能透過按下組合鍵而達到橫向移動的程式碼:

 

           double dv = 0;

            double dh = 0;

            switch (dct)

            {

                case "Left":

                    dv = 0;

                    dh = -5;

                    //假使是按複合按鍵

                    switch (keymem)

                    {  

                        case Key.Up:

                            dv -= 5;

                            break;

                        case Key.Down:

                            dv += 5;

                            break;

                    }


                    break;

  

                case "Right":

  

                    dv = 0;

                    dh = 5;

                    //假使是按複合按鍵

                    switch (keymem)

                    {

                        case Key.Up:

                            dv -= 5;

                            break;

                        case Key.Down:

                            dv += 5;

                            break;

                    }


                    break;

  

                case "Up":

                    dv = -5;

                    dh = 0;

                    //假使是按複合按鍵

                    switch (keymem)

                    {

                        case Key.Left:

                            dh -= 5;

                            break;

                        case Key.Right :

                            dh += 5;

                            break;

                    }


                    break;

  

                case "Down":

                    dv = 5;

                    dh = 0;

                    //假使是按複合按鍵

                    switch (keymem)

                    {

                        case Key.Left:

                            dh -= 5;

                            break;

                        case Key.Right:

                            dh += 5;

                            break;

                    }


                    break;

            }


 

MSDN:滑鼠拖曳控制項

ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SilverlightSDK.v20/dv_SilverLTAdvanced/html/b35a60c7-ad61-4010-a62a-a03aef59bbfc.htm