Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.09.2011, 12:48

Wpf gui friert ein, obwohl Thread die rechenarbeit übernimmt

Hallo.
Und ich steh schon wieder vor einem problem, das ich mir nicht wirklich erkären kann.

Ich habe eine Wpf form mit einem stackpanel drin.

Zu laufzeit füge ich in dieses stackpanel custom controls ein.
Funktioniert wunderbar, aber es dauer ein paar sekundchen.

Jetzt hab ich diese Arbeit bereits in einen thread ausgelagert, damit die Applikation nicht einfriert.

aber es verhält sich gleich. Ich kann während das stackpanel befüllt wird keine anderen controls verwenden. Aber wie kann das sein?

n bisschen code:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                Thread addgrpbx = new Thread(this.AddGroupBoxToStackPanel);
                addgrpbx.Start();

//die funktion

public void AddGroupBoxToStackPanel()
        {
            if (!stackPanel1.Dispatcher.CheckAccess())
            {
                stackPanel1.Dispatcher.Invoke(DispatcherPriority.Background, new Action(
                delegate()
                {
                    foreach (GroupBox grp in groupBoxes_)
                    {
                          stackPanel1.Children.Add(grp);
                    }
                }));

            }
            else
                foreach (GroupBox gb in groupBoxes_)
                {
                      stackPanel1.Children.Add(gb);
                }
        }


in groupBoxes_ sind 168 elemente drin. Diese bestehen aus eben einer groupbox die 2 checkboxen, 8 9buttons und 10 labels enthält.

hat jemand eine erklärung für dieses verhalten?

lg Aly

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »AlymcGeel« (20.09.2011, 12:58)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.09.2011, 13:01

Überleg mal, was das Invoke() da macht...

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

20.09.2011, 13:08

Viel schlimmer ist, dass das der komplett falsche ansatz ist - warum sollte man so etwas tun? dafür wurden ViewModels, ObservableCollection und DataTemplates erfunden...

4

20.09.2011, 13:42

Hi. Danke für eure antworten.

hab das invoke jetzt für jedes einzelne objekt gemacht und jetzt funktionierts so wie ich will.

@TrommlBommel: Ich kenn mich nicht wirklich aus mit wpf und das ist mein ersten gscheites projekt daher hab ich diese konzepte nicht umgesetzt. danke für deinen hinweis.

lg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

20.09.2011, 13:44

hab das invoke jetzt für jedes einzelne objekt gemacht und jetzt funktionierts so wie ich will.

Das macht den zweiten Thread aber nicht weniger sinnlos...

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

20.09.2011, 13:55

@TrommlBommel: Ich kenn mich nicht wirklich aus mit wpf und das ist mein ersten gscheites projekt daher hab ich diese konzepte nicht umgesetzt. danke für deinen hinweis.
Ich wollte dir damit nicht auf die Füße treten, sondern dir nur klarmachen, dass das nicht der weg in WPF ist. Backgroundworker und Dispatcher ist genau richtig, nur naja selbst objekte "reinballern" ist nicht der sinn. das erzeugt viel code, denn eigl wpf für dich alleine übernimmt. Suche nach den Begriffen und mach eine vernünftige WPF Anwendung ;)
Ansonsten kannst du nämlich auch WinForms machen^^

7

20.09.2011, 14:09

ums genauzusagen hab ich eine große winforms anwendung und dachte mir ich schau mir mal wpf an und mach eine unterform mittels interop in wpf.
danke auf jeden fall. ich werds mir anschaun, da mich wpf eigentlich sehr anspricht.

lg

Werbeanzeige