I Like the Silverlight 2.0 Control Templating Model (better than WPF’s)
There have been a lot of opinions flying around the web-o-net about the problems with the control templating model in Silverlight 2.0. I’m going to go out on a limb here, though, and say…I like it. That’s right, I like the new model. In fact (insert teeth gritting here), I wish we had done the same thing in WPF (gasp!).
The reasonable opinion against the new model (as I understand it) is based on the fact that Silverlight doesn’t have support for triggers in control templates (or just about anywhere for that matter). This means more code and less XAML for defining those behaviors.
In WPF, for example, if you wanted a control to respond to a mouse hover (and, say, change its color), you would create a trigger on the IsMouseOver property and then party in that trigger and create whatever storyboards (or setters) you want to implement that color change. This all happens in markup.
In Silverlight, on the other hand, the developer has to create an event handler for the MouseEnter and MouseLeave events and then explicitly load a set of storyboards with well known names to handle the transitions between those states. Silverlight is doing a lot less heavy lifting for you and there’s definitely a code component to what, in WPF, seemed like a simple XAML task.
See how much better Silverlight is? Okay, so the "better" part may not be obvious. Here’s my take though:
First, things got much cleaner in the new component model. Do you remember this doc? It’s an attempt to prioritize the eight (that’s right, eight) different "best practices" for expressing control state changes and behavior in your control. This includes: bindings, triggers, commands, named parts, etc. This is some serious complexity and leads to some serious lack of discoverability. This is why we needed projects like SimpleStyles. Templating for WPF controls is simply not predictable (let alone toolable, but we’ll get to that) so we end up needing a lot of sample code to get people off the ground. Plus, it’s really tough for developers. You have a myriad (well, eight) different recommendations for doing the same thing and the choice between them is not always clear even to an experienced WPF developer.
That said, you may have thought that the complexity was worth it. It may seem, after all, like this complex model puts flexibility in the designer’s hand since, of those eight, two (bindings and triggers) have a very strong markup component to them. Moreover, the Silverlight way (the named parts approach) looks a strong code component to it.
The thing that is easy to forget, though, is the fact that all of those bindable and triggerable properties and events had to be defined by a developer at one point. The IsMouseOver property had to be created somewhere. So at the end of the day, it’s not that behaviors require more code now, it’s just a different kind of code: more event handlers and fewer property change handlers to kick off behaviors.
Second, the Silverlight model has a very good chance of being much easier to use in a tool like Blend. Frankly, I haven’t seen a lot of people have great success with control templating in Blend. Button and Checkboxes don’t count. Try creating a template for a ComboBox or a Menu. It’s really hard, even if you know what you’re doing. Once again, this comes down to the complexity of the contract between the template and code.
Imagine, on the other hand, a model where you can simply walk through a checklist and provide elements for each of the UI "parts" of the template and storyboards for each of the "behaviors." Menu might have a lot of parts and behaviors, but at least there is a predicable way to discover and provide them. In this kind of a model, the designer could theoretically retain much (if not all) of the flexibility he has in WPF but have a much easier time accessing it.
Silverlight 2.0 isn’t there yet, but the model they’ve chosen is at least predictable and declarable and that gets us much closer to the templating Xanadu that I just described. Even in the meantime, we still have a model that’s much easier to understand and even code for and the only trade off is that now I the developer exposes behaviors by responding to events instead of responding to property changes.
Now having said all that, I would love to have triggers in control templates, styles and especially data templates in Silverlight. In fact, not having triggers in data templates has resulted in some serious hackery on my part (in which I end up creating a UserControl everytime we have a data template with any complexity). But I like where this new templating model is going and I hope it goes even further.
March 25th, 2008 at 3:33 am
Wow the first positive remark I’ve read about SL control templating. I have not developed an opinion on it just yet, but I think Dr. WPF and yourself have conflicting perspectives on the subject.
So…Both as gentlemen of honor, I suggest you two have a duel. I believe it worked out well for Alexander Hamilton.
-Jer
March 25th, 2008 at 4:44 am
[…] just read a great post by Robby on why he likes the control template model in Silverlight 2.0 better than the one in WPF. I […]
March 25th, 2008 at 4:53 am
[…] Just read Robby’s excellent post about silverlight templating model. […]
March 28th, 2008 at 12:55 am
I love you blog but Sorry, I cannot agree with you on this one. By choosing this model SL will break the Developer + Designer workflow. The designer will be too dependent on the Developer and the Developer will have to swear and change the controls just because the Designer decided to change something… lookless controls were a tried and tested SUCCESS. Why do we want to change that in SL and try to re invent something else!
May 2nd, 2008 at 6:39 pm
[…] took some flack for my (arguably polemic) thoughts on the Silverlight control templating model so I was happy to see the second to last paragraph of this post where John shares some of my views […]
June 11th, 2008 at 1:42 am
Why the Silverlight VisualStateManager is wrong…
Silverlight has a control templating system similar to that of Windows Presentation Foundation. However, Silverlight and WPF take different approaches to updating the user interface as the user interacts with it. WPF uses triggers: the creator of a tem…