Я создал своего рода диалоговое окно «Обработка», которое отображает процессы определенного процесса. Оно содержит один индикатор выполнения и одну метку. Вот код:
public class ProcessingDialog
{
FrontWindow win;
public ProcessingDialog(int min, int max, string initialMessage,string title, bool isContineous)
{
Thread th= new Thread(new ThreadStart(delegate()
{
win = new FrontWindow();
win.Title = title;
if (isContineous == false)
{
win.ProgressBarProgress.Minimum = min;
win.ProgressBarProgress.Maximum = max;
}
else
win.ProgressBarProgress.IsIndeterminate = true;
win.LabelStatus.Content = initialMessage;
win.ShowInTaskbar = false;
win.Topmost = true;
win.ShowDialog();
}
));
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
public void Increment(int margin)
{
win.Dispatcher.Invoke(new ThreadStart(delegate { win.ProgressBarProgress.Value+=margin; }), null); ;
}
public void Reset()
{
win.Dispatcher.Invoke(new ThreadStart(delegate { win.ProgressBarProgress.Value=0; }), null); ;
}
public void ChangeMessage(string message)
{
win.Dispatcher.Invoke(new ThreadStart(delegate { win.LabelStatus.Content=message; }), null); ;
}
public void Close()
{
win.Dispatcher.Invoke(new ThreadStart(delegate { win.Close(); }), null); ;
}
}
Это разметка для FrontWindow:
<Window x:Class="WpfApplicationUnleashed.FrontWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="FrontWindow" Height="165" Width="300" WindowStyle="ThreeDBorderWindow" WindowStartupLocation="CenterOwner" ResizeMode="NoResize">
<DockPanel>
<ProgressBar x:FieldModifier="public" x:Name="ProgressBarProgress" Height="15" Margin="20" DockPanel.Dock="Top" VerticalAlignment="Top"></ProgressBar>
<Label x:FieldModifier="public" x:Name="LabelStatus" Margin="10" VerticalAlignment="Top" HorizontalAlignment="Left" DockPanel.Dock="Bottom"></Label>
</DockPanel>
</Window>
А вот окно, из которого я показываю диалоговое окно. Оно содержит только одну кнопку, событие щелчка которой выглядит так:
private void button1_Click(object sender, RoutedEventArgs e)
{
ProcessingDialog pd = new ProcessingDialog(0, 10, "Starting", "Processing", false);
Thread.Sleep(1000);
pd.ChangeMessage("Step 1");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 2");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 3");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 4");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 5");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 6");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 7");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 8");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 9");
pd.Increment(1);
Thread.Sleep(1000);
pd.ChangeMessage("Step 10");
pd.Increment(1);
Thread.Sleep(1000);
pd.Close();
}
Проблема в том, что когда он отображается, если я снова нажимаю кнопку, когда диалоговое окно закрывается, оно открывается снова. Я имею в виду, что на него не нажимают, потому что он модальный, но он просто ставится в очередь, и когда диалоговое окно закрывается, он нажимается.
Как я могу предотвратить это?