Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mi 25.01.12 17:14 
Hey,

ich entwickle zur Zeit einige eigene Komponenten. Bis jetzt funktioniert das auch alles einigermaßen, aber es ruckelt sehr stark. Bei der einen Komponente ändert sich der eigene Inhalt, bei der anderen wird die komplette Komponente auf der Form verschoben. Ich weiß das es ruckelfrei geht, weil z.B. bei shareware Komponenten funktioniert das ganze ja auch. Also liegt es nah, das ich irgendwas falsch mach. Für die Animation benutz ich einen System.Timers.Timer, der dann per Dispatcher das Objekt bewegt. Das sieht ungefähr so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
private Timer _questionIndexTimer = new Timer();
_questionIndexTimer.Interval = 50;
_questionIndexTimer.AutoReset = true;
_questionIndexTimer.Elapsed += new ElapsedEventHandler(OnQuestionIndexTimer);
_questionIndexStatus = 0;

private void OnQuestionIndexTimer(object source, ElapsedEventArgs e)
{
    double deltaTime = (e.SignalTime - _questionIndexTime).TotalMilliseconds;
    _questionIndexTime = e.SignalTime;
    this.Dispatcher.Invoke((System.Windows.Forms.MethodInvoker)delegate
    {
        _questionIndexOffset += _questionIndexStatus * deltaTime / 1000 * QUESTION_INDEX_MOVE_SPEED;
        QuestionViewer.Margin = new Thickness(_questionIndexOffset, 000);
        InvisQuestionViewer.Margin = new Thickness(_mainWindow.Width * 2 + QuestionViewer.Width*2 + _questionIndexOffset, 000);
        if (Math.Abs(_questionIndexOffset) > _mainWindow.Width * 2 + QuestionViewer.Width*2)
        {
            _questionIndexTimer.Enabled = false;
        }
    });
}

Funktioniert das so überhaupt ruckelfrei, oder muss man da anders ran gehen?

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 25.01.12 19:47 
Hallo,

anstatt dem System.Timers.Timer und dem nötigen Dispatcher.Invoke-Aufruf solltest du gleich den für WPF entworfenen DispatcherTimer verwenden.

Wie groß ist denn der _questionIndexOffset pro Aufruf? Wenn dieser zu groß ist, wird natürlich die Animation nicht mehr als ruckelfrei empfunden - dann müßtest du evtl. das Intervall verkleinern.

Für diesen Beitrag haben gedankt: Bergmann89
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 26.01.12 21:24 
Hey,

mit dem DispatcherTimer gehts wunderbar, danke.

MfG Bergmann89.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^