Невозможно отобразить фигуры после Application.Run () в Gtk # - PullRequest
0 голосов
/ 30 июня 2019

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

В настоящее время у меня установлен интервал с использованием System.Timers для рисования каждые шестидесятые секунды. Это используется, чтобы просто переместить прямоугольник и отразить его от краев. Тем не менее, кажется, что ничего не рисуется после вызова Application.Run().

Основной метод:

public static void Main()
{
    Application.Init();
    Window w = new Window("Drawing");
    w.SetDefaultSize(width, height);

    canvas = new DrawingArea();
    canvas.ExposeEvent += ExposeHandler;
    canvas.SizeAllocated += SizeAllocatedHandler;

    SetupPensBrushes();

    Box box = new HBox(true, 0)
    {
        canvas
    };
    w.Add(box);
    w.ShowAll();
    w.DeleteEvent += Quit;

    Application.Run();
}

Интервал и рисунок:

public static void ExposeHandler(object obj, ExposeEventArgs args)
{
    ev = args.Event;
    window = ev.Window;
    ctx = Gtk.DotNet.Graphics.FromDrawable(window);
    FillRect(new SolidBrush(Color.Black), 0, 0, width, height); // (Custom function for a rectangle) This works and creates a black background 
    interval.Interval = 1000 / 30;
    interval.Elapsed += ElapsedEvt;
    interval.Start(); // 'ElapsedEvt' includes moving and drawing an object, but it cannot be seen on the screen. 
}

public class Obj
{
    public int x;
    public int y;
    public int w;
    public int h;
    public int xv = rnd.Next(-width / 50, width / 50);
    public int yv = rnd.Next(-height / 50, height / 50);

    public Obj(int x, int y, int w, int h)
    {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }

    public void Move()
    {
        x += xv;
        y += yv;
    }

    public void Show()
    {
        FillRect(Brushes["LightBlue"], x, y, w, h);
    }
}

public static void ElapsedEvt(object sender, ElapsedEventArgs e)
{
    boxObj.Move();
    boxObj.Show();
    // boxObj has been defined already as a new Obj()
}

РЕДАКТИРОВАТЬ: проблема была решена с помощью canvas.QueueDraw() каждый раз, когда интервал истек. Тем не менее, даже после того, как все утилизировано, примерно через 10 секунд работы программы наблюдается значительное отставание.

...