1

WPF にコントロールがあります (円を含むカスタム コントロールです)。

そして、60msごとに移動する必要があります。

「位置」の配列(2つの属性を持つクラス:XとY)があり、これを移動して移動します:

timer_tick()
{
  myControl.Margin = new Thickness { Left = MyArray[i].X, Top = MyArray[i].Y};
  i++;
}

グローバル変数で。

しかし、私はより良い方法でそれを行うことができますか? 次のようなものを使用:

public static void MoveTo(this Image target, double newX, double newY)
{
    var top = Canvas.GetTop(target);
    var left = Canvas.GetLeft(target);
    TranslateTransform trans = new TranslateTransform();
    target.RenderTransform = trans;
    DoubleAnimation anim1 = new DoubleAnimation(top, newY - top, TimeSpan.FromMilliseconds(60));
    DoubleAnimation anim2 = new DoubleAnimation(left, newX - left, TimeSpan.FromMilliseconds(60));
    trans.BeginAnimation(TranslateTransform.XProperty,anim1);
    trans.BeginAnimation(TranslateTransform.YProperty,anim2);
}

すべてのティックで?

ありがとうございました

4

2 に答える 2

0

他の誰かがアニメーションを使用するという最良の方法をすでに投稿しているので、「あまり良くない」がおそらくうまくいく別の方法を次に示します。

そのインデクサー「i」のような変数を使用している場合 (グローバルと呼ぶことに注意してください。そのスコープを明確にしてください)、別の変数を作成してみませんか?

クラスレベルで、変数を作成します...

Thickness awful_marg_variable;

そして、イニシャライザで初期化し、コントロールの Margin への参照を割り当てます。

awful_marg_variable = new Thickness { Left = MyArray[0].X, Top = MyArray[0].Y};
myControl.Margin = awful_marg_variable;

そして、タイマーの目盛り手順で、その変数を操作するだけです...

awful_marg_variable.Left = MyArray[i].X;
awful_marg_variable.Top = MyArray[i].Y;

最後に、たった今行った恐ろしいことなどを楽しむことができます。大量にこれを行うことはありません。これは決してやらないと言う人もいます。しかし、時には仕事を終わらせなければならないこともあり、これはそれを行うためのもう 1 つの方法です。

于 2013-10-23T19:19:59.443 に答える