Silverlight研究(一) 淺談按鍵控制及組合鍵
MSDN上有一個使用滑鼠拖曳控制項的基本範例,其原理如下:
1. 觸發MouseLeftButtonDown:記錄滑鼠目前位置。
2. 觸發MouseMove:以滑鼠目前位置 – 原位置,算出的變異量,加入目前控制項的位置,就等於控制項的新位置。
3. 觸發MouseLeftButtonUp:釋放滑鼠捕捉,清空紀錄值。
根據這樣的原理,我們可以依法炮製,使用鍵盤來控制物件的移動。
觸發KeyDown:判斷按下哪個按鍵,然後設定物件移動的變異量,dv、dh為變異量,例如要往左就是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;
}
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/b