Click here to Skip to main content
15,919,358 members
Home / Discussions / WPF
   

WPF

 
GeneralRe: Floating control at the bottom of the web page?? Pin
Sunil P V30-Jun-09 22:15
Sunil P V30-Jun-09 22:15 
QuestionProgressBar Pin
Ranger4929-Jun-09 7:33
Ranger4929-Jun-09 7:33 
AnswerRe: ProgressBar [modified] Pin
Mark Salsbery29-Jun-09 9:00
Mark Salsbery29-Jun-09 9:00 
GeneralRe: ProgressBar [modified] Pin
Ranger4929-Jun-09 9:33
Ranger4929-Jun-09 9:33 
GeneralRe: ProgressBar Pin
Mark Salsbery29-Jun-09 10:00
Mark Salsbery29-Jun-09 10:00 
GeneralRe: ProgressBar Pin
Ranger4929-Jun-09 10:15
Ranger4929-Jun-09 10:15 
GeneralRe: ProgressBar Pin
Pete O'Hanlon29-Jun-09 10:05
mvePete O'Hanlon29-Jun-09 10:05 
GeneralRe: ProgressBar [modified] Pin
Mark Salsbery29-Jun-09 10:16
Mark Salsbery29-Jun-09 10:16 
I have a class that is the equivalent of BackgroundWorker only STA,
but even that won't help you here.

Even if creating the Line succeeded, you can't access UI objects on a
different thread. That means accessing the canvas will fail as well.

Here's an updated example where I've kept non-UI stuff in the DoWork handler and
moved UI stuff to the ProgressChanged handler. I added a LineDescriptor helper class
to pass line info from the background thread to the UI thread:
public partial class Window1 : Window
{
    BackgroundWorker bw = new BackgroundWorker();

    public Window1()
    {
        InitializeComponent();

        bw.WorkerReportsProgress = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        if (!bw.IsBusy)
            bw.RunWorkerAsync();
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        <code>// Background thread - no UI element access allowed here!</code>

        LineDescriptor ld = new LineDescriptor();

        for (int i = 0; i < 100; i++)
        {
            Random rnd = new Random();
            //Pen p = new Pen();
            byte red, green, blue;

            red = (byte)rnd.Next(0, 255);
            green = (byte)rnd.Next(0, 255);
            blue = (byte)rnd.Next(0, 255);
            Color col = new Color();
            col.R = red;
            col.G = green;
            col.B = blue;
            col.A = 255;
            ld.Color = col;

            ld.X2 = rnd.Next(0, (int)canvas1.ActualWidth);
            ld.Y2 = rnd.Next(0, (int)canvas1.ActualHeight);
            ld.X1 = rnd.Next(0, (int)canvas1.ActualWidth);
            ld.Y1 = rnd.Next(0, (int)canvas1.ActualHeight);

            bw.ReportProgress(i + 1, ld); <code>//<-- bug fix - added 1 to i</code> :)

            Thread.Sleep(25);
        }
    }

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        <code>// UI thread - UI element access allowed here!</code>

        LineDescriptor ld = e.UserState as LineDescriptor;

        Line line = new Line();
        line.X1 = ld.X1;
        line.Y1 = ld.Y1;
        line.X2 = ld.X2;
        line.Y2 = ld.Y2;
        line.Stroke = new SolidColorBrush(ld.Color);
        line.StrokeThickness = 1.0;

        canvas1.Children.Add(line);

        progressbar1.Value = e.ProgressPercentage;
    }
}


class LineDescriptor
{
    public Color Color { get; set; }
    public double X1 { get; set; }
    public double Y1 { get; set; }
    public double X2 { get; set; }
    public double Y2 { get; set; }
}

*edit* Fixed bug in bw_DoWork() (see comments)

Mark Salsbery
Microsoft MVP - Visual C++

Java | [Coffee]

modified on Monday, June 29, 2009 4:46 PM

GeneralRe: ProgressBar Pin
Ranger4929-Jun-09 10:26
Ranger4929-Jun-09 10:26 
QuestionManually firing WPF RoutedCommand Pin
DahrkDaiz29-Jun-09 5:16
DahrkDaiz29-Jun-09 5:16 
AnswerRe: Manually firing WPF RoutedCommand Pin
Pete O'Hanlon29-Jun-09 6:06
mvePete O'Hanlon29-Jun-09 6:06 
AnswerRe: Manually firing WPF RoutedCommand Pin
User 27100929-Jun-09 15:48
User 27100929-Jun-09 15:48 
QuestionMessage Removed Pin
29-Jun-09 4:54
professionalN_tro_P29-Jun-09 4:54 
AnswerRe: Images and Namespaces Pin
Gideon Engelberth29-Jun-09 6:29
Gideon Engelberth29-Jun-09 6:29 
QuestionWPF custom control Pin
Vinod C S29-Jun-09 4:21
Vinod C S29-Jun-09 4:21 
AnswerRe: WPF custom control Pin
Christian Graus29-Jun-09 11:13
protectorChristian Graus29-Jun-09 11:13 
GeneralRe: WPF custom control Pin
Vinod C S29-Jun-09 19:42
Vinod C S29-Jun-09 19:42 
QuestionEliminating The standard shape of a bitmap(actually xaml based) button, How to :)? Pin
cppwxwidgetsss29-Jun-09 1:12
cppwxwidgetsss29-Jun-09 1:12 
AnswerRe: Eliminating The standard shape of a bitmap(actually xaml based) button, How to :)? Pin
Mark Salsbery29-Jun-09 6:41
Mark Salsbery29-Jun-09 6:41 
QuestionHow can I use Application Idle Event in WPF? Pin
Kunal Chowdhury «IN»28-Jun-09 23:00
professionalKunal Chowdhury «IN»28-Jun-09 23:00 
AnswerRe: How can I use Application Idle Event in WPF? Pin
Christian Graus28-Jun-09 23:32
protectorChristian Graus28-Jun-09 23:32 
GeneralRe: How can I use Application Idle Event in WPF? Pin
Kunal Chowdhury «IN»29-Jun-09 2:15
professionalKunal Chowdhury «IN»29-Jun-09 2:15 
GeneralRe: How can I use Application Idle Event in WPF? Pin
Ravi Mori29-Jun-09 2:40
Ravi Mori29-Jun-09 2:40 
GeneralRe: How can I use Application Idle Event in WPF? Pin
Kunal Chowdhury «IN»29-Jun-09 3:44
professionalKunal Chowdhury «IN»29-Jun-09 3:44 
GeneralRe: How can I use Application Idle Event in WPF? Pin
Kunal Chowdhury «IN»29-Jun-09 20:02
professionalKunal Chowdhury «IN»29-Jun-09 20:02 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.