在silverlight画布中移动对象

时间:2013-03-17 20:29:04

标签: c# silverlight silverlight-5.0

<UserControl x:Class="MyGameSilverlight.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="300" d:DesignWidth="400" KeyDown="OnKeyDown">

    <Grid x:Name="LayoutRoot" Background="White">

            <Canvas x:Name="c1" Background="Green" Margin="0,0,130,80" RenderTransformOrigin="0.463,0.5">
                <Rectangle x:Name="obj" Height="60" Width="80" Canvas.Left="45" Canvas.Top="45" Fill="Aqua" />
            </Canvas>


    </Grid>
</UserControl>

[代码背后]

private void OnKeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
                case Key.Right:
                    Canvas.SetLeft(obj, Canvas.GetLeft(obj) + 20);
                    break;

                case Key.Left:
                    Canvas.SetLeft(obj, Canvas.GetLeft(obj) - 20);
                    break;
                // more here
            }
        }

我在画布中有简单矩形的代码。现在我想在按键上移动这个矩形。 例如,当我按下右箭头键时,矩形应从其初始位置向右移动20px。

代码背后的代码是什么?

1 个答案:

答案 0 :(得分:1)

您可以通过静态方法Canvas.GetLeftCanvas.GetTopCanvas.SetLeft和{{3来获取和设置代码背后的Canvas.LeftCanvas.Top附加属性}}:

double left = Canvas.GetLeft(obj) + 20;
double top = Canvas.GetTop(obj) + 20;
Canvas.SetLeft(obj, left);
Canvas.SetTop(obj, top);

似乎问题是关于如何接收或处理键盘输入。您必须附加(例如)KeyDown处理程序,但您必须知道UIElement需要具有键盘焦点才能接收键事件。由于Rectangle和Canvas都不可聚焦(请参阅Canvas.SetTop),您可以将处理程序附加到MainPage:

<UserControl ... KeyDown="OnKeyDown">
    <Canvas>
        <Rectangle Name="obj" .../>
    </Canvas>
</UserControl>

在处理程序中,您可以像这样处理各个键:

private void OnKeyDown(object sender, KeyEventArgs e)
{
    switch (e.Key)
    {
        case Key.Right:
            Canvas.SetLeft(obj, Canvas.GetLeft(obj) + 20);
            break;
        // more here
    }
}