Autor Beitrag
Stephan74656
ontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 26

Alle bisher veröffentlichte Windows (Win95 - Win10), Android 4.2.2 - 7.0.0, Ubuntu, Linux, Mac, IOS12 + IOS11
VS 2017 Enterprise (C#)
BeitragVerfasst: Mi 07.11.18 07:44 
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:
ausblenden C#-Quelltext
1:
Task.Factory.StartNew(() => {/*Code zum Ausführen*/});					


hat aber nicht funktioniert.
Dann habe ich es damit probiert:
ausblenden 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
Einloggen, um Attachments anzusehen!
_________________
"Die Pioniere des Weltalls hatten einen friedlichen Traum, der Wirklichkeit wurde, als wir zu den Sternen vordrangen." Captain James T. Kirk (TOS-Folge:"Wen die Götter zerstören" Staffel 3; Folge 14)
Kirk1701A
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 126
Erhaltene Danke: 3

Linux, Ubuntu, Mac, IOS, Android (4.2.x - 9.x.x), Win Mob., Micro. DOS, Win 95, Win 98, Win 2000, Win ME, Win XP, Win Vista, Win 7, Win8.1, Win 10
C# (VS 2017 Community/Enterprise, VS 2019 Professional/Enterprise), VB (VBA), JavaScript
BeitragVerfasst: Mi 07.11.18 08: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

_________________
"Ich war es und werde es immer bleiben... Ihr Freund!"
@Spock -> Star Trek II: Der Zorn des Khan
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mi 12.12.18 14: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).


ausblenden 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>


ausblenden 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.