The observations below are what apply to Silverlight 2 Beta 1.
Styles
- Once you apply a style to a FrameworkElement, you cannot reassign a new style. This is bad news because this means that the user cannot pick a theme. Having said that, you can still reassign properties that have been once assigned. This means that you can reassign the control template since it is a property as well.
- Styles cannot inherit from other styles - the 'BasedOn' property cannot be used.
- Styles have to be referenced by a key. This means that you cannot drop a style for a button in your 'application.resources' hoping that all buttons in the application will pick up the style. You need to explicitly reference it by its key in all buttons in the application. Sigh!
Triggers
See my earlier post on this. There are no triggers in Silverlight Beta 1 for styles, control templates and data templates. Sigh, sigh and more sigh!
Say you are changing the control template of a button. When doing that, as part of the template you would want to define an animation that should fire when the mouse is over it. In WPF, you would just add a trigger in the control template that looks for the IsMouseOver property - which is a neat way of doing things. But in Silverlight, the developer who creates the control has to create event handlers for the MouseEnter and MouseLeave events, and in these event handlers he has to load storyboards with well known names. Then hope that the designer/developer skinning the control will supply storyboards with the same names!
Control Templates
Keeping aside the limitation control templates have that I explained above (in the triggers section), I think this is one area that Silverlight is better than WPF. Silverlight follows the parts model. This means that any control (controls that ship with Silverlight and custom controls) publish a well defined control contract. This control contract will define
- the minimum UIElements (and their names) that should be present in a control template for that control
- the storyboards (and their names) that should be present.
So this means that a designer/developer who is going to skin (or define a new control template for) the control needs to only look at the control contract to understand what the control expects to function properly.
In WPF, you have to search for the "PART_" prefix in the default control template. There is no well-defined control contract. I understand from the MIX talks that this is one area that WPF, the big brother, will listen to Silverlight and emulate it in future WPF releases.
Also, a custom control in Silverlight cannot inherit from UIElement or FrameworkElement classes though these classes are present (by the way, there is no Visual class in the class hierarchy in Silverlight). Custom controls should extend the Control class, or other classes like TextBox or Button that extend the Control class.
What makes skinning a control (read changing its control template) really complicated now is that at the moment Blend does not support templating. I'm sure that is coming. But until then, your XAML editing skills will be put to the test!
Resources
Dynamic resource references are not available. All are static references.
Data Binding
The following apply to Silverlight 2 Beta 1:
- No binding the property of a UI control to the property of another UI control. There is no 'ElementName' property in the binding syntax.
- No 'RelativeSource'
- No 'OneWayToSource' - who needed it anyway?
- No UpdateSourceTrigger property. All updates to the source (for two way binding) happen immediately, except in the case of TextBox in which case changes are propogated to the source when the focus is lost.
- Cannot bind directly to XML data. Need to convert the XML to CLR objects, and then bind to the CLR object.
- No ReadOnlyObservableCollection. Fortunately, the ObservableCollection is available which is more important.
- No CollectionView for sorting and filtering.
- No validation rules.
- No DataTemplateSelector for dynamically selecting data templates based on data.
- No XMLDataProvider and ObjectDataProvider.
Commanding
- Commands and input bindings are not available in Silverlight 2 Beta 1.
These are a few things I observed about Silverlight 2. I plan to keep this list updated so that this will be a ready reference for someone looking for the differences between the WPF and Silverlight 2 model.
7 comments:
Detailed and useful!
No EventSetters either from my experience.
Thank you so much for posting this.
Thanks for this great posting. I've already wondered about the differences but just haven't got chance to explore SilverLight yet. Very useful information!
Wow what a let down about triggers, that really does suck. I hope they update it so its possible...
Thanks for posting this!
Thanks. I was just trying to figure out why the controltemplate defined in my silverlight 2 app's app.xaml wasn't applying to all controls of the target type. I guess I can stop looking. Sucks that this doesn't work.
Yes, Silverlight does not natively support implicit styles. But the Silverlight Toolkit has what is called as the ImplicitStyleManager that allows you to do the very same thing. You might want to check that out
Post a Comment