Skip to content

Wie kann eine ProgressBar aus einem separaten Thread aus einer anderen Klasse bedient werden? #1

@suchja

Description

@suchja

Hier gilt es folgende Frage die ich per Mail (am 21.06.21) bekommen habe zu beantworten.

Wenn ich ein Progressbar mittels BackgroundWorker asynchron bedienen muss, bekomme ich Schwierigkeiten.
Alle Tutorials im Netz bedienen den Progressbar aus der .xaml.cs Datei heraus, nicht aus der .cs Datei (Programmlogik) heraus, wo ich den Progressbar bräuchte.
Nun ist mit nicht klar, wie ich aus der .cs Datei den Progressbar.Value in der .xaml.cs Datei bediene.
Wo ist in der .xaml.cs Datei der Einstiegspunkt und wie rufe ich diesen aus der .cs Datei auf?

Dazu gab es folgenden Code:

XAML

<Window x:Class="WpfTutorialSamples.Misc_controls.ProgressBarTaskOnUiThread"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ProgressBarTaskOnUiThread" Height="100" Width="300"
        ContentRendered="Window_ContentRendered">
    <Grid Margin="20">
        <ProgressBar Minimum="0" Maximum="100" Name="pbStatus" />
    </Grid>
</Window>

Code-Behind (xaml.cs)

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows;

namespace WpfTutorialSamples.Misc_controls
{
    public partial class ProgressBarTaskOnWorkerThread : Window { public ProgressBarTaskOnWorkerThread()     {
        InitializeComponent();
    }
       
    private void Window_ContentRendered(object sender, EventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;
        worker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        for(int i = 0; i < 100; i++) // this was not my intent. 
                                     // Where ist the entry point for the .cs file control?
        {
            (sender as BackgroundWorker).ReportProgress(i);
            Thread.Sleep(100);
        }
    }
    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        pbStatus.Value = e.ProgressPercentage;
    }
    }
}

Programmlogik (beliebige .cs Datei)

// this is only draft code
. . .
    pbStatus.Minimum = 0;
    pbStatus.Maximum = zimax;
    window.ShowDialog();
    for(int zi = 0; zi < zimax; zi++)
    {
        //long code
        pbStatus.Value++;??   // this should control ProgressBar
        Thread.Sleep(100);
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions