Happy Holidays!

I was home sick today… there’s a massive bug going around work.  I was pretty useless sitting on my couch, so I decided to make a holiday Silverlight card.

 

And if you’re thinking….

                wow, that’s really ugly.

… or …

                that looks like a 7 year old’s crayon drawing.

… you’re absolutely right.  

 

I have no design skills (as my officemate likes to continuously point out.)

Hope you enjoy it anyways!  :)

 

See the full post, if you’re reading my feed and can’t see the card!

PDC: Silverlight 2 Control Model Session (PC29)

Thank you to everyone who made it to my talk on Thursday!

As promised, some links:

Also, if you haven’t already, please take the time to fill out the online evaluation.  Your comments help me be a better speaker.  :)

 talk

Silverlight 2 Changes

Between Silverlight 2 Beta 2 & Silverlight 2 RTW, there were a few changes and additions.  Here’s a brief rundown on the areas I directly worked on. 

The overall breaking change list can be found here.

 

Control Model Silverlight 2 RTW Updates

  • generic.xaml lives in themes directory
    • For WPF compat, we’re now looking for generic.xaml at \themes\resources.xaml.  It still needs to be built as an assembly resource.
  • VisualTransition.GeneratedDuration
    • The VisualTransition.Duration’s property name has changed.  It is now called VisualTransition.GeneratedDuration.
    • This value will only impact the duration of generated transition animations.  It has no affect on the VisualTransition.Storyboard animations.
  • VisualTransition.Storyboard must be defined inline
    • You cannot set VisualTransition.Storyboard to be a storyboard resource.  It needs to be defined as content of the <VisualTransition>.

 

HTTP Networking Silverlight 2 RTW Updates

  • Cross-scheme HTTP <-> HTTPS calls are allowed with a cross domain file.
  • Sub-domain wildcards are allowed within a clientaccesspolicy.xml cross domain file
  • Setting the Content-Type is always allowed on cross domain POSTS
    • Of course, the cross domain POST itself needs to be allowed by the service’s cross domain policy file.
    • All other headers still need to be explicitly allowed in the service’s cross domain policy file.

Silverlight @ PDC!

Here are some of the Silverlight-focused PDC sessions. 

 image

Hope to see you there!

Session Time Speaker
Expression Blend: Tips and Tricks Mon 10/27
12:45-1:30pm
Pete Blois,
Douglas Olson
Silverlight, WPF, and the .NET Framework: Sharing Skills and Code Mon 10/27
3:30 - 4:45PM
Ian Ellison-Taylor
Silverlight: Building Business Focused Apps Tues 10/28
3:30 - 4:45pm
Jamie Cool
Deep Dive: Building an Optimized,
Graphics-Intensive Application in Microsoft Silverlight
Tues 10/28
5:15 - 6:30pm
Seema
Ramchandani
Silverlight  Controls Roadmap Wed10/29
12:00 - 12:45pm
Shawn  Burke
Inside the Olympics: An Architecture and Development Overivew Wed 10/29
1:15 - 2:30pm
Eric Schmidt,
Jason Suess
Microsoft Silverlight 2: Control Model Thurs 10/30
10:15 - 11:30am
Karen Corby

Silverlight 2 has SHIPPED!

It’s official - we’ve shipped Silverlight 2!

Silverlight

ScottGu, our VP, has a great release blog post, which is worth a read.

You can get all the new SL2 downloads here:

  1. Install Silverlight 2 runtime.
  2. Install Silverlight Tools for Visual Studio 2008 SP1
  3. Install Expression Blend 2 SP1 update.  (If you don’t already have Expression Blend 2, you can get a free trial.)

On a personal note, it’s been a privilege to work with such a great group of people to put out this product.  I’ve learned a lot, and more importantly, had a lot of fun.  So, a shout out to my teammates - you guys rock.  This one was special.

 

p.s.  And yes, I promise to update all my tutorials for RTM soon.  Real soon.  Ok, probably next week.  :)

Silverlight at the Olympics

I’m sure many of you have heard by now… Silverlight 2 Beta 2 is powering the NBC Olympics video experience! 

At http://nbcolympics.com/video, you can see live event coverage as well as on-demand viewing of already-happened events.  Check it out!  (Be sure to use the “Enhanced” player by clicking “Enlarge Video.”)

Untitled

An Early Look - VisualStateManager for WPF

John Gossman, one of the awesome Silverlight and WPF architects, just blogged a prototype of VisualStateManager for WPF. 

VisualStateManager will be added in to a future release of the .NET Framework.  For those of you who want an early look, you can now play with John’s VSM implementation.  (This is for prototyping only - it is not a supported feature yet.)  He uses AttachedProperties to hook up VisualStateManager-enabled Templates to WPF controls.

You’ll also see my WeatherControl using VSM on WPF!

weather

FlickrViewr Using DevDave’s AnimatingWrapPanel

DevDave (Dave Relyea) is a dev lead on the Silverlight team.  He just blogged a really slick new animating wrap panel.  Read about it here and try out the sample app below.

 

There are a bunch of different “interpolations” that you can choose from, including “back”, “elastic”, and “bounce.”

I’ve updated my FlickrViewr to use this animating wrap panel with the “elastic” option.  In my totally unbiased opinion, it looks pretty hot.  Though, as Dave pointed out, “elastic” is a bit much for a “real world” application - for a more sane UI, try “back” interpolation.

 

(See the original post for more info & source code.)

FlickrViewr Updated for Beta2

Just a note to say I’ve updated my FlickrViewr for Silverlight Beta2.  (All of the controls now use VisualStateManager, too!)

Enjoy!

(See the original post for more info & source code.)

Parts & States Model with VisualStateManager (Part 4 of 4)

Here we are - the final post of our Parts & States Model series for Silverlight 2 controls.  Hope you’ve enjoyed the ride so far!

Today, we’ll go through some general recommendations on how to use the Parts & States model.  We’ll also take a look ahead:  VisualStateManager on Windows Presentation Foundation and future releases of Silverlight.

 

(Series Link:  Part 1, Part 2, Part 3, Part 4)

 

Parts & States Model Recommendations

1.  Use the Parts & States Model with Custom Controls and UserControls

Like we mentioned in the first post, the Parts & States Model is just a pattern.  It is not required by the runtime, and it’s perfectly fine to build controls without the Parts & States Model and VisualStateManager.

However, we do think this is a good model.  And Blend will only be able to support skinning of custom controls using the Parts & States Model.

And while this series concentrated on VSM with Custom Controls, remember you can use it with UserControls as well!

2.  Custom VSM xmlns

This one is less of a recommendation and more of a heads up.

Because of a known Silverlight 2 Beta 2 bug, you need to use a custom xmlns for VisualStateManager and its related classes.

   1: xmlns:vsm=“clr-namespace:System.Windows;assembly=System.Windows”
 
3.  Naming conventions

For consistency across controls, we recommend the following naming convention.

naming

4.  CommonStates and FocusStates are special

Many controls define these two state groups:

specialstates

If your control is going to have some or all of these states, for consistency, we recommend the above grouping and naming.

5. Be resilient to missing Parts & States in template

There are many reasons why a particular ControlTemplate might not supply a given part or state:  the designer may have deliberately chosen to leave it out.  He/she might not have created it yet.  And so on.

It is good practice to prevent crashes or other catastrophic failures when a part is missing.

Note: The VisualStateManager.GoToState() method already takes care of this for states - it returns false when the target VisualState is not found.

 

6.  Consider supporting “fallback” states

For complex controls, it is sometimes interesting to provide a fallback mechanism for particular states that do not exist.

   1: if (VisualStateManager.GoToState(this, “FocusContent”, useTransitions) == false) 
   2: {  
   3:     VisualStateManager.GoToState(this, “Focus", useTransitions);
   4: } 

The advantage of this approach are pretty intuitive:  the control continues to visually function correctly when a designer hasn’t provided a particular state.

But there are also some significant negatives: the fallback states mechanism isn’t fully integrated into the Parts & States model, which means that Blend has no way of knowing about them.

So, please use fallback states sparingly and only when the control is sufficiently complex enough to warrants it.

Also, if you think this is a pattern that you’ll leverage often, let us know!  We’d love the feedback.

7.  Subclasses should only add states in new state groups (not existing state groups)

As you know, each state group is orthogonal.  This makes it easy for a subclass to add new state groups.  For instance, you can create a StackButton that derives from Button and adds a StackStates group:

newstategroup

This works because the StackStates state group logic is completely independent from the Button’s logic around CommonStates & FocusStates.

However, if you want to add a new state to an existing state group, the state group logic can become jumbled.  It’s is difficult to guarantee that the right logical state checks will happen in the right order.

Let’s make this clearer with an example.  BasicControl defines two states in its CommonStates: Normal, MouseOver.  Its logical state machine is:

  • if (mouse is not over control) goto Normal
  • if (mouse is over control) goto MouseOver

Now, ExtendedControl derives from BasicControls and wants to add a Pressed state.  The goal logical state machine would be:

  • if (mouse is not over control) goto Normal
  • if (mouse is over control AND mouse button is not down) goto MouseOver
  • if (mouse button is down) goto Pressed

However, there is no good for way for ExtendedControl to add the (AND mouse button is not down) check for the MouseOver state, since that logic lives in the Button base class.

All this just means:  Subclasses can always add new states to an new state group.  But we recommend against adding new states to existing state groups.

Note:  There are different ways (each with its own pluses & minuses) for the platform to address this limitation in a future version.  We’re currently leaning towards a Triggers-based solution (yes, I said triggers).  For more, keep reading.

 

Looking Ahead

VSM & Windows Presentation Foundation

Silverlight’s Parts & States Model leverages many features (like ControlTemplates, GetTemplateChild() helpers, etc) that already exist in Windows Presentation Foundation.

wpf

However, there are some features - namely VisualStateManager and its associated classes - that do not yet exist in WPF.   The good news is that the next version of Windows Presentation Foundation will include VisualStateManager!

For some that are trying to move their Siverlight 2 controls & skins to WPF now, the next version of the .NET framework may feel a ways off.  To help remedy that, we are currently looking into shipping a WPF assembly that contains VisualStateManager before the next full release of WPF.  Plans are still early - and so the timeline & ship vehicle details are still being worked out.

More details as we have them!

Future Silverlight Features

One of the often asked questions about the Silverlight control model is:  “Where are the Triggers?”  In fact, it’s normally, “Where are the TRIGGERS?????”  :)

There are a lot of different reasons why we were not able to bring Triggers into the Silverlight 2 release.  The primary technical challenge was that our property system architecture is not sufficiently complex to support them.  This will however change in a future version of Silverlight, and then we’ll be able to start supporting Triggers.

How would Triggers & VSM play together?  The tentative design brainstorm looks something like:

   1: <PropertyTrigger Property="IsPressed" Value="True">  
   2:     <GoToState State="Pressed"/>
   3: </PropertyTrigger>

The platform would provide a GoToState trigger action that causes VisualStateManager to initiate a state change to the desired state.

The designer would, then, have the option of using the built-in states that come with the control (and leaving the visual state change logic to the control).  OR, he/she can take over and trigger all the VSM state changes from XAML.  In the latter case, it would also be possible for the designer to add states to new or existing state groups that a control code does not know about.

Exciting stuff coming!

 

The End

So that’s the end of our 4 part series on the Silverlight 2 Parts & States Model.  If you have questions or feedback, we’d love to hear it.

If this series has wet your appetite for VisualStateManager, here are some more great resources: