WPF? Pah!

I'm sitting in Joseph Cooney's (excellent) session on WPF at CodeCampOz, and it seems to me that the canonical demo of WPF is an animated button bouncing around a form. Of course, this is something VFP has been able to do for ever:

 **************************************************
*-- Form:         form1 
*-- ParentClass:  form
*-- BaseClass:    form
*-- Time Stamp:   04/01/07 02:18:00 PM
*
DEFINE CLASS form1 AS form


    DoCreate = .T.
    Caption = "Form1"
    llanimating = .F.
    ndirection = 0
    nspeed = 0
    Name = "Form1"


    ADD OBJECT command1 AS commandbutton WITH ;
        Top = 60, ;
        Left = 108, ;
        Height = 109, ;
        Width = 157, ;
        Caption = "Command1", ;
        Name = "Command1"


    ADD OBJECT timer1 AS timer WITH ;
        Top = 216, ;
        Left = 336, ;
        Height = 23, ;
        Width = 23, ;
        Interval = 50, ;
        Name = "Timer1"


    PROCEDURE llanimating_assign
        LPARAMETERS vNewVal
        *To do: Modify this routine for the Assign method
        THIS.llAnimating = m.vNewVal
        this.Timer1.Enabled = this.llanimating
        IF ! this.llAnimating
            this.ResetButton
        ELSE
            this.nDirection = RAND() * 2 * PI()
            this.nSpeed = INT(RAND() * 10) + 1
            this.Command1.BackColor = RAND() * 0xFFFFFF
        endif
    ENDPROC


    PROCEDURE resetbutton
        * Reset the button to default values

        this.Command1.Top = INT(this.Height/2 - this.Command1.Height/2)
        this.Command1.Left = INT(this.Width/2 - this.Command1.Width/2)

        this.Command1.ResetToDefault("BackColor")
    ENDPROC


    PROCEDURE movebutton
        WITH this.Command1

            * move the button by (nSpeed) in the (nDirection) direction
            .top = .top + (.Parent.nSpeed * COS(.Parent.nDirection))
            .Left = .Left + (.Parent.nSpeed * SIN(.Parent.nDirection))

            * check to see whether we've hit a wall
            IF .Left < 0
                .Parent.nDirection = 2* PI() - .Parent.nDirection
                .BackColor = RAND() * 0xFFFFFF
            ENDIF

            IF .Top < 0
                .Parent.nDirection = PI() - .Parent.nDirection
                .BackColor = RAND() * 0xFFFFFF
            ENDIF

            IF .Left + .Width > .Parent.Width
                .Parent.nDirection = 2* PI() - .Parent.nDirection
                .BackColor = RAND() * 0xFFFFFF
            ENDIF

            IF .top + .height > .Parent.Height
                .Parent.nDirection = PI() - .Parent.nDirection
                .BackColor = RAND() * 0xFFFFFF
            ENDIF


        endwith
    ENDPROC


    PROCEDURE command1.Click
        thisform.llAnimating = !thisform.llanimating
    ENDPROC


    PROCEDURE timer1.Timer
        thisform.movebutton()
    ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************

Enjoy!