Callback in UserControl sorgt für permanentes Aufrufen von OnPaint

12/03/2010 - 10:03 von Achim Bohmann | Report spam
Hallo zusammen!

vorausschicken möchte ich, dass die Zielplattform zwar ein PocketPC ist,
aber meiner Meinung nach diese Tatsache nicht relevant ist für das
Problem, das ich habe.

seit einigen Tagen suche ich nach der Lösung für das folgende
merkwürdige Verhalten.

Ich habe ein UserControl, das eine Liste anzeigt (die man dann auf dem
Endgeràt so Ei-Fon màßig schubsen kann, die dann auch zurückfedert).
Das Control funktioniert tadellos.

Jetzt schreibe ich eine Anwendung, die SEHR VIELE Eintràge in dieser
Liste hat. Damit ich kein Speicherproblem bekomme, will ich nun also
einen virtuellen Modus für das Control bereitstellen. Also sollen die
Items der Liste nicht aus "List<IItem> items" kommen, sondern per
Callback beim Zeichnen abgefragt werden.

Es gibt also eine Überladung von OnPaint, dort wird in ein Bitmap
gezeichnet, das dann am Ende in den Grafikkontext gezeichnet wird.

hier der Auszug, der die Items bereitstellt:
while( next ) {
IItem it = null;
if( virtualMode )
it = OnGetItem( index );
else
it = items[index];


In den MouseDown/-Up handlern wird "Slide" aufgerufen, das das mit dem
Zurückfedern gemacht.

private void Slide() {
sliding = true;
while( sliding ) {
accell = (int)(accell * 0.9f);
Scroll( accell );
sliding = abs(accell) > 0;
Application.DoEvents();
}

// snap back top
int i = top / 2;
while( (i != 0) && top > 0 ) {
Scroll( -i );
Application.DoEvents();
i /= 2;
}
// snap back bottom


und wie der Titel meiner Frage schon verràt, kommt das Programm über die
Application.DoEvents nicht mehr drüber, weil sofort wieder OnPaint
angestoßen wird. Es federt also im virtuellen Modus nichts, und das
Programm ist permanent am Zeichnen.


Der einzige Unterschied zwischen der nicht-virtuellen Methode und der
virtuellen Methode ist der, dass die IItems mal aus einer internen Liste
geholt werden, mal über ein Callback abgefragt werden.

WARUM wird, bei Verwendung des Callbacks dauernd OnPaint angestoßen?

Über Tipps wàre ich sehr dankbar, weil ich inzwischen nicht mehr weiß,
was ich noch debuggen soll

Gruß,
Achim
 

Lesen sie die antworten

#1 Peter Brightman
19/03/2010 - 23:37 | Warnen spam
Achim Bohmann schrieb:
Hallo zusammen!

Jetzt schreibe ich eine Anwendung, die SEHR VIELE Eintràge in dieser
Liste hat. Damit ich kein Speicherproblem bekomme, will ich nun also
einen virtuellen Modus für das Control bereitstellen. Also sollen die
Items der Liste nicht aus "List<IItem> items" kommen, sondern per
Callback beim Zeichnen abgefragt werden.

Es gibt also eine Überladung von OnPaint, dort wird in ein Bitmap
gezeichnet, das dann am Ende in den Grafikkontext gezeichnet wird.

hier der Auszug, der die Items bereitstellt:
while( next ) {
IItem it = null;
if( virtualMode )
it = OnGetItem( index );
else
it = items[index];




Wo ist denn die callback methode? Diese muss das control feuern, dann
wenn gescrollt wird oder wenn sich die Anzahl der Eintràge àndert.
Das Model muss die callback methode bereitstellen und die Daten
liefern.

Ähnliche fragen