InvokeRequired i WPF

by Jesper juli 10, 2009 09:18

Jeg er blevet overbevist om, at mit næste projekt skal være et WPF projekt. WPF har et noget mere rent snit til design fladen, og jeg synes at databindings kontrollerne giver helt nye og spænnende muligheder.

Som du måske har læst tidligere, så har jeg lavet multitrådede applikationer, og haft en lille udfordring i at opdaterer formelementer fra andre tråde end UI tråden. Jeg fandt en elegant måde at foretage opdateringen på, men hvad nu med WPF kontroller?

For det første, så lever de i et helt andet namespace, og har en helt anden opbygning. En Label har ikke en property der hedder Text, men en der hedder Content. Det er jo simpelt nok at komme uden om – det er jo kun et navn. Alle indholdskontroller har en fælles baseklasse: ContentControl, som jeg tager udgangspunkt i, og laver en Extension på. Men hvad nu med de metoder og egenskaber man tidligere brugte til den slags: InvokeRequired, BeginInvoke, Invoke o.s.v.

De findes slet ikke. Jeg blev nød til at starte Reflector op, for at finde ud af det her. Det viser sig at al interaktion med kontrollerne går igennem et Dispatcher objekt. Det er her man skal tage udgangspunkt i sine krydstrådsopdateringer. InvokeRequired findes dog heller ikke på Dispatcher objektet, men man har adgang til arbejdstråden via egenskaben Thread. Man kan altså lave et check der nogenlunde svarer til InvokeRequired:

// WindowsForms:

if (ctrl.InvokeRequired)
// ....

// WPF:

if (ctrl.Dispatcher.Thread != Thread.CurrentThread)
// ..

Måske lidt underligt at den egenskab ikke er kommet med i API’et. Ellers er resten af koden til min extension nærmest identisk med den tidligere:

public static class ControlExtension
{
    public static void SetContent(this ContentControl control, object value)
    {
        if (control.Dispatcher.Thread == Thread.CurrentThread)
            control.Content = value;
        else
            control.Dispatcher.Invoke(new Action(() => control.Content = value));
    }
}

That’s it.

Tags:

Cross Thread | WPF

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  september 2010  >>
mationtofr
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

RecentComments

Comment RSS