Hallo. Ich habe seit ein paar Tagen ein blödes Problem in C#. Mein Testprojekt besteht aus 2 Fenstern. Fenster 1: Hauptfenster, Button zum Starten einer Berechnung Fenster 2: Dialogbox mit ProgressBar Im EventHandler vom Button wird ein neues Fenster2 angelegt und mit ShowDialog() geöffnet. Die Progressbar läuft bis 100% durch und Fenster2 beendet sich dann selbst mit this.DialogResult = true; Alles OK. Wird der Button ein weiteres mal gedrückt, bekomme ich bei this.DialogResult = true eine Exception: "DialogResult can be set only after Window is created and shown as dialog." Was mache ich falsch? Fenster2 C#:
1 | namespace WPFProgressbar |
2 | {
|
3 | public partial class MyProgressBar : Window |
4 | {
|
5 | public MyProgressBar() |
6 | {
|
7 | InitializeComponent(); |
8 | TheProgressBar.Value = 0; |
9 | }
|
10 | |
11 | private void ProgressBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) |
12 | {
|
13 | if (TheProgressBar.Value >= 100) |
14 | {
|
15 | this.DialogResult = true; |
16 | }
|
17 | }
|
18 | }
|
19 | }
|
Fenster2 XAML:
1 | <Window x:Class="WPFProgressbar.MyProgressBar" |
2 | xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
3 | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
4 | Title="MyProgressBar" Height="100" Width="300" ResizeMode="NoResize"> |
5 | <StackPanel> |
6 | <Label>Processing...</Label> |
7 | <ProgressBar x:Name="TheProgressBar" Height="20" Value="{Binding CurrentValue}" Minimum="0" ValueChanged="ProgressBar_ValueChanged" Maximum="100"></ProgressBar> |
8 | </StackPanel> |
9 | </Window> |
Fenster1 C#:
1 | namespace WPFProgressbar |
2 | {
|
3 | public partial class MainWindow : Window, INotifyPropertyChanged |
4 | {
|
5 | private int _currentValue; |
6 | public int CurrentValue |
7 | {
|
8 | get { return _currentValue; } |
9 | set
|
10 | {
|
11 | _currentValue = value; |
12 | if (PropertyChanged != null) |
13 | {
|
14 | PropertyChanged(this, new PropertyChangedEventArgs("CurrentValue")); |
15 | }
|
16 | }
|
17 | }
|
18 | |
19 | public MainWindow() |
20 | {
|
21 | InitializeComponent(); |
22 | }
|
23 | |
24 | void AsyncFunction() |
25 | {
|
26 | Thread.Sleep(1000); |
27 | for (int i = 1; i <= 100; ++i) |
28 | {
|
29 | Thread.Sleep(10); |
30 | CurrentValue++; |
31 | }
|
32 | }
|
33 | |
34 | private void ButtonClick(object sender, RoutedEventArgs e) |
35 | {
|
36 | CurrentValue = 0; |
37 | |
38 | MyProgressBar ProgressView = new MyProgressBar(); |
39 | ProgressView.DataContext = this; |
40 | |
41 | Thread t = new Thread(new ThreadStart(AsyncFunction)); |
42 | t.Start(); |
43 | |
44 | ProgressView.ShowDialog(); |
45 | }
|
46 | |
47 | public event PropertyChangedEventHandler PropertyChanged; |
48 | }
|
49 | }
|
Fenster1 XAML:
1 | <Window x:Class="WPFProgressbar.MainWindow" |
2 | xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
3 | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
4 | Title="MainWindow" Height="350" Width="525"> |
5 | <StackPanel> |
6 | <TextBox x:Name="LogTextBox" Margin="5" IsEnabled="False"></TextBox> |
7 | <Button Margin="5" Click="ButtonClick">Start Processing</Button> |
8 | </StackPanel> |
9 | </Window> |