在silverlight画布中移动对象

本文关键字:移动 对象 布中 silverlight | 更新日期: 2023-09-27 18:04:28

<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。

这背后的代码是什么?

在silverlight画布中移动对象

您可以在静态方法Canvas后面的代码中获取和设置Canvas.LeftCanvas.Top附加属性。GetLeft,画布。GetTop,画布。SetLeft和Canvas。置顶:

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

问题似乎是关于如何接收或处理键盘输入。您必须附加(例如)KeyDown处理程序,但是您必须知道,为了接收键事件,UIElement需要具有键盘焦点。由于矩形和画布都不可聚焦(参见焦点概述),您可以将处理程序附加到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
    }
}