Я планирую реализовать индикатор выполнения (в строке состояния моих приложений) и одновременно приглушить все элементы управления MainWindow, кроме кнопок «Свернуть / Развернуть / Закрыть окно» при выполнении.
Сейчас у меня есть пользовательский элемент управления Progress Bar с фоновым рабочим процессом, но он отображает элемент управления Progress Bar в отдельном окне. Вот XAML для моей строки состояния:
StatusBar x:Name="StatusB" Grid.Column="0" Grid.Row="5" Width="Auto" Height="30" Background="DarkGray" DockPanel.Dock="Bottom">
<StackPanel>
<Label Content="Status:" Foreground="White" Height="30" Width="50" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" ></Label>
</StackPanel>
<StackPanel>
<local:ProgressB></local:ProgressB>
</StackPanel>
</StatusBar>
Вот мой пользовательский индикатор Progress Bar:
<Grid Width="250" Height="25">
<Label x:Name="lblProgress" Content="0%" Width="25" Height="20" Margin="155,2,70,0" Foreground="White" IsEnabled="False" Visibility="Hidden"></Label>
<ProgressBar x:Name="progress" Height="20" IsIndeterminate="False" Width="151" HorizontalAlignment="Left" Margin="0,2,0,0"></ProgressBar>
<Button x:Name="btnCancel" Width="50" Height="20" HorizontalAlignment="Right" Click="btnCancel_Click" Content="Cancel" Margin="0,2,0,0" IsEnabled="False" Visibility="Hidden"></Button>
</Grid>
Фоновый рабочий:
private void ExecuteBuild(object sender, ExecutedRoutedEventArgs e)
{
//Launching the bind/train process requires a separate proc
ProcessStartInfo startInfo = new ProcessStartInfo("app.exe", filePath);
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
// Borrowed for build iterations (you need 3, minimum)
int maxRecords = 3;
pd = new ProgressB();
// Cancel Build
pd.Cancel += CancelProcess;
// Add multithread dispatcher
System.Windows.Threading.Dispatcher pdDispatcher = pd.Dispatcher;
//create our background worker and also have a cancel button
worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
// Updates the progress text
UpdateProgressDelegate update = new UpdateProgressDelegate(UpdateProgressText);
int x = 0;
for (x = 1; x <= maxRecords; x++)
{
if (worker.CancellationPending)
{
args.Cancel = true;
return;
}
System.Threading.Thread.Sleep(1);
Когда у меня появляется диалоговое окно, оно работает нормально, но когда я помещаю его в строку состояния (см. Первую ссылку XAML), оно не показывает никакого прогресса - однако фоновый процесс работает по-прежнему. Есть предложения?