Entwickler-Ecke

WPF / Silverlight - ProgressBar-Window


Stephan74656 - Mi 07.11.18 08:44
Titel: ProgressBar-Window
Morgen allerseits,

ich möchte ein Programm entwickeln, in dem XML-Dateien angezeigt und (sehr einfach gehalten) verändert werden können. Das Laden kann bei manchen Dateien ja etwas länger dauern, deshalb möchte ich, während er die Datei einlädt, ein Rahmenloses Window anzeigen, das wie im Anhang aussieht.

Das Problem ist, dass ich das einfach nicht hinbekomme, dass er das Window startet, wieder zu MainWindow zurückkehrt, den Code in einem eigenen Thread ausführt und das ProgressBar-Fenster wieder schließt, ohne, dass der User auch nur einen Handschlag machen muss.

Zuerst habe ich es damit versucht:

C#-Quelltext
1:
Task.Factory.StartNew(() => {/*Code zum Ausführen*/});                    


hat aber nicht funktioniert.
Dann habe ich es damit probiert:

C#-Quelltext
1:
2:
3:
4:
5:
6:
Thread testThread = new Thread(new ThreadStart(() =>
{
    //Code zum Ausführen
}));

testThread.Start();


was auch nicht geklappt hat. Später habe ich dann das umgekrempelt und das ProgressBar-Window in den neuen Thread geladen, aber gleiches Ergebnis.

Das Problem ist halt, entweder sehe ich das extraFenster gar nicht, oder dauerhaft. Später hab ich dann noch eine Sache probiert: ich habe in der Klasse des neuen Fensters den Code in einen neuen Thread geladen, was natürlich nicht funktioniert hat, da ich ja Daten in ein Steuerelement setzen wollte, das sich 1. in einer anderen Klasse (Window) befindet und 2. in einem anderen Thread...

Was mache ich falsch? :autsch:

Dankeschön


Kirk1701A - Mi 07.11.18 09:00

Hallo Stephan74656,

ich habe mal was mit Await und Asynch aufgeschnappt. Probier das mal... Is denk ich mal ne gute Alternative...

LLAP
Euer Kirk


Chiyoko - Mi 12.12.18 15:42

Hallo,

wenn du WPF mit MVVM nutzt, brauchst du für asynchrone Vorgänge ein AsyncDelegate Command.(gibt viele Beispiele im Netz oder du nutzt Devexpress)
Für eine Progressbar würde ich eher ein Popup nutzen.

Das Popup kann im Hauptfenster versteckt werden (z.b. in einem Grid).



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 <Popup Placement="Center" StaysOpen="False" IsOpen="{Binding IsPopupVisible, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <Border>
                <StackPanel>
                    <ProgressBar MinHeight="50" MinWidth="100" Value="{Binding ProgressValue}"></ProgressBar>
                </StackPanel>
            </Border>

        </Popup>



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
public ICommand StartRunLongProcessCommand { get; private set; }
StartRunLongProcessCommand = new AsyncCommand(OpenPopupAsync); // im Konstruktor aufrufen

public async Task OpenPopupAsync()
{
    IsPopupVisible = true;
    bool s = await Task.Run(StartLongRunningProcess);
}

public Task<bool> StartLongRunningProcess()
{
    int max = 100000;
    for (int i = 0; i < max; i++)
    {
        ProgressValue = (i *100 / max);
        Thread.Sleep(10);
    }

    return Task.FromResult(true);
}



EDIT: Nicht vergessen, eine Mindesthöhe/breite für die Progressbar und/oder für das Popup anzugeben, sonst siehst du gar nichts.