Ersatz der Refresh-Funktion in WPF?

Hallöchen zusammen,

ich schreibe gerade an meinem ersten WPF-Programm.
Ich komme zwar recht gut klar, jedoch habe ich ein Problem:

Und zwar möchte ich in einem Teil des Programmes eine Liste aus Expandern haben. Wird ein Expander geöffnet oder geschlossen, so werden alle anderen in der Liste weiter nach unten verschoben. Schön und gut, das funktioniert auch soweit (mit einem Grid gelöst).
Nun hätte ich aber gerne, dass diese Expander sich schön flüssig öffnen, und nicht nur so unschön „aufspringen“.

Dafür habe ich folgende Funktion geschrieben:

///
/// Wird aufgerufen, wenn ein Expander eingeklappt werden soll.
/// Sorgt dafür, dass der Vorgang des Zuklappens als eine flüssige Animation angezeigt wird.
///
///
///
private void CollapseExpander(object Sender, RoutedEventArgs e)
{
Expander exp = (Expander)Sender;
Grid grid = (Grid)exp.Content; //ein Grid, das als Tabelle dienen soll

int maxHeight = 25 * grid.RowDefinitions.Count; //gibt die Standarthöhe des Grids an
grid.Height = maxHeight; //damit das Grid nicht sofort zuspringt

double progress = 0; //Fortschritt des Zuklappens
double height = 0; //derzeitige Höhe

//Diese Schleife soll 100 Durchläufe haben, hat aber nur ca. 90
//Muss mir deshalb noch eine geeignetere Funktion zur Berechnung der Höhe ausdenken…
for (int i = 0; progress

Das Problem ist nur:
die Funktion wird ausgeführt, jedoch werden die Änderungen an dem Expander erst übernommen, nachdem die Funktion abgeschlossen ist.
Soll heißen: Nachdem man nun auf den Expander drückt, passiert 1sec lang gar nichts, danach springt er wieder genauso zu, als existiere der Code nicht.
(Ich weiß, die Funktion zur korrekten Berechnung der Höhe stimmt so nicht, die hab ich nur mal schnell so ähnlich hingeschrieben, wie sie aussehen soll)

Gibt es nicht irgendetwas, womit ich das WPF-Programm zwingen kann, das Fenster zu aktualisieren?

Hoffe, ich bin hier nicht im falschen Thread, aber es gibt leider kein WPF-Thread hier…

Ich danke schonmal allen fürs antworten.

Grüße,
Bluesky787

Hallo Bluesky787,

Ist schon etwas länger her das ich mit WFP zu tun hatte, und da ich auch kein Windows zur Hand habe, kann ich es leider nicht testen, aber vielleicht hilft dir ein Bsp. in dem ich damals zwei Masken mit WPF animiert habe.

private void HandleLMaskeMouseEnter(object sender, RoutedEventArgs e)
 {
 if (!pinItBtn.IsChecked.GetValueOrDefault()
 && maske1.Visibility == Visibility.Visible)
 {
 double to = maske1.ColumnDefinitions[1].Width.Value;
 DoubleAnimation ani = new DoubleAnimation(0, new Duration(TimeSpan.FromMilliseconds(500)));
 ani.Completed += new EventHandler(AniCompleted);
 maske1Trans.BeginAnimation(TranslateTransform.XProperty, ani);
 }
 }


private void AniCompleted(object sender, EventArgs e)
 {
 maske1.Visibility = Visibility.Collapsed;
 }

Gibt es nicht irgendetwas, womit ich das WPF-Programm zwingen
kann, das Fenster zu aktualisieren?

NotifyPropertyChange oder Observables …schau dir mal das MVVM-Pattern…Bindings usw.

Sorry, das ich dir nicht mehr helfen kann, aber vielleicht hilft es ja trotzdem.

Gruß XXD

Hallo,

WPF hat schon ein ziemlich komfortables Animations-System an Bord. Du brauchst also nur eine DoubleAnimation zu definieren (mit Zielwert, Dauer und ggfs. Startwert) und diese an das richtige Objekt binden (Target und TargetProperty). Wahlweise kannst du das noch in ein Storyboard kapseln und dann das ganze einfach ausführen. Um den Rest brauchst du dich dann nicht mehr kümmern. Damit kannst du auch einfache Effekte wie Anfangsbeschleunigung und Abbremsen recht einfach erreichen.

Nico

Dankeschön
Danke für eure Antworten,

ihr habt mir damit sehr geholfen.
Ich hab zwar ein fettes Buch über C# und WPF, aber von DoubleAnimation hab ich noch nie was gehört…

Auf jeden Fall weiß ich jetzt, womit ich mich mal mehr beschäftigen sollte.

Mit freundlichen Grüßen,
Bluesky787