WPF ProgressBar & Dim контролирует работу - PullRequest
0 голосов
/ 21 февраля 2011

Я планирую реализовать индикатор выполнения (в строке состояния моих приложений) и одновременно приглушить все элементы управления 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), оно не показывает никакого прогресса - однако фоновый процесс работает по-прежнему. Есть предложения?

1 Ответ

0 голосов
/ 22 февраля 2011

Причина, по которой вы не видите обновлений, заключается в том, что UpdateProgress не вызывается в потоке пользовательского интерфейса.Ваш пример кода обрезан, поэтому сложно сказать.Используйте BackgroundWorker.ReportProgress для сообщения о прогрессе.Это будет вызвано в потоке пользовательского интерфейса.Некоторые образцы здесь .

...