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

キャンバス内の単純な長方形のこのコードがあります。ここで、キーを押すとこの長方形を移動したいと思います。たとえば、右矢印キーを押すと、長方形は最初の位置から右に 20 ピクセル移動する必要があります。

このコードの背後にあるコードは何ですか?

4

1 に答える 1

1

静的メソッドCanvas.GetLeftCanvas.GetTopCanvas.SetLeftCanvas.SetTopCanvas.Leftを使用して、コード ビハインドでおよびCanvas.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 もフォーカス可能ではないため (「フォーカスの概要」を参照)、ハンドラーを 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
    }
}
于 2013-03-17T20:31:45.413 に答える