[Silverlight] 讀取鍵盤按鍵

2010/11/01

如果你要做使用Silverlight 作一些小遊戲..
我相信這會有用的..

案例說明: 主要是用鍵盤的上下左右鍵來控制一個Canvas 來上下左右移動..

畫面配置 :

sshot-110


中間有一個 黑色的 Canvas 叫做 canvas1 主要就是讓鍵盤可以控制他的上下左右…

來看看XAML :

<UserControl x:Class="MovingCanvas.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="500" d:DesignWidth="500" IsTabStop="True" Loaded="UserControl_Loaded" KeyDown="LayoutRoot_KeyDown">
  
<Canvas x:Name="LayoutRoot" Background="White" >
<Canvas Canvas.Left="225" Background="Black" Width="50" Height="50" Canvas.Top="225"  Name="canvas1" />
</Canvas>
</UserControl>

其中LayoutRoot 我不在用 Grid 我改用Canvas 因為在控制這種絕對位置的東西..
建議使用 Canvas 來取代 Grid 這種Container..

其中比較特別的是 我在UserControl 的 IsTabStop="True" 因為須讓他可以做tab停駐…

並且…
需要再 Loaded 中加入 this.Focus();

因為範例很單純所以需要這樣做..不然其實如果有其他事件,譬如有一個按鈕可點擊後..
也可以造成Silverlight 此UserControl 被設成 Focus ..

引述MSDN :
Control 基底類別提供 Focus 方法。以程式設計的方式呼叫此方法,會嘗試將焦點設定至呼叫該方法所在的控制項。Focus 的傳回型別會通知您嘗試結果是否成功。可能的失敗原因包括本主題前段控制項和焦點中提及的每一點。如果您在已經擁有焦點的控制項上呼叫 Focus,則不會引發任何事件,但是方法仍然會傳回 true,如此方法呼叫就不會解譯成將焦點設定到所需目標失敗的情況。

再來就是 UserControl 中的 LayoutRoot_KeyDown

private void LayoutRoot_KeyDown(object sender, KeyEventArgs e)
{
 
 
if (e.Key == Key.Up)
{
canvasTickness.Top -= 10;
this.canvas1.Margin = canvasTickness;
return;
}
 
if (e.Key == Key.Down)
{
canvasTickness.Top += 10;
this.canvas1.Margin = canvasTickness;
return;
}
 
if (e.Key == Key.Left)
{
canvasTickness.Left -= 10;
this.canvas1.Margin = canvasTickness;
return;
 
}
 
if (e.Key == Key.Right)
{
canvasTickness.Left += 10;
this.canvas1.Margin = canvasTickness;
return;
}
}


其中 可以透過 e.Key 去判斷user 可以點擊的按鈕…
去設定 canvas1 的 Margin

要注意的:
1.我不是透過 translatetransform 去做位移的,我是改變他對top and left 的位置,所以他可以超出邊界
2.上面的寫法感覺多餘,是因為我主要讓他只要位移完就可以return 而不需要繼續往下判斷…雖然看起來有點礙眼
但是可以爭取一點效能..

讚一下:


下載:


範例:


0 意見:

程式 . 生活 . D小調.@2010 | Binary Design: One Winged Angel.