Почему перемещение прямоугольника не соответствует? - PullRequest
1 голос
/ 20 июня 2019

Я довольно новичок в C #, и я пытаюсь создать простую программу, которая позволяет перемещать прямоугольник с помощью ввода. Проблема заключается в том, что при обновлении положения прямоугольника в C # иногда кажется, что прямоугольник исчезает на очень короткое время, а затем вновь появляется в новом месте, вместо того, чтобы двигаться последовательно.

Я делал подобные вещи, используя p5.js и java (Jswing).

Вот код, который я написал

 public class WinFormsTest : Form
{
    System.Windows.Forms.Timer timer;
    Graphics graphics;
    Brush brush;
    Rectangle rect = new Rectangle(0, 0, 80, 80);

    public WinFormsTest()
    {
       Draw();
    }

    public void Draw()
    {
        Text = "HelloWold";
        Height = 800;
        Width = 800;

        timer = new System.Windows.Forms.Timer();
        timer.Interval = 1;
        timer.Tick += new EventHandler(timer_Tick);
        Invalidate();
        timer.Start();

    }
    private void timer_Tick(object sender, EventArgs e)
    {
        graphics = CreateGraphics();
        brush = new SolidBrush(Color.Green);
        graphics.Clear(Color.White);
        Random rnd = new Random();
        graphics.FillRectangle(brush, rect);
        rect.X++;
        rect.Y++;

    }

    public static void Main(string[] args)
    {
        Application.Run(new WinFormsTest());
    }
}

Я ожидал бы, что прямоугольник будет последовательно перемещаться, иногда не исчезая и не появляясь снова.

1 Ответ

3 голосов
/ 20 июня 2019

Не делайте этого в winforms.Поддержка графического ускорения или оптимизации очень ограничена.

Попробуйте wpf или uwp, у него много функций, касающихся таких анимаций, которые поддерживаются "из коробки".

См. Microsoft docs

Вы также можете пойти на решение DirectX, но это будет еще большим излишним.

Обратите внимание, что эти платформы обычно используют MVVM шаблон, в котором у вас есть Page с кодом позади, ViewModel в качестве источника данных и View, состоящий из XAML.

Это немного сложнеесправиться с чем-то более старым WinForms, но если вы учитесь и действительно хотите создавать красивые приложения, это определенно верный путь.


Анимация WPF поставляется с большим количеством базовых / вспомогательных классов,как видно здесь

Вот пример, чистый XAML:

<!-- just a container -->
<Canvas Background="Orange"> 
    <-- a canvas to apply the animation on -->
    <Canvas  x:Name="target" Background="Green"> 
        <!-- your rectangle -->
        <Rectangle Width="200" Height="100" Fill="Blue" Stroke="Black" StrokeThickness="4"/>
         <!-- the animation trigger -->
        <Canvas.Triggers>
            <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                <BeginStoryboard>
                    <Storyboard RepeatBehavior="Forever" AutoReverse="True">
                          <DoubleAnimation Storyboard.TargetName="target" 
                                           Storyboard.TargetProperty="Left"
                                           From="0" To="100" 
                                           Duration="0:0:3"/>
                     </Storyboard>
                 </BeginStoryboard>
             </EventTrigger>
         </Canvas.Triggers>
    </Canvas>
</Canvas>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...