Geeks With Blogs

News




What I do:

Identity Mine

MVVM Light

GalaSoft


What I am:

Microsoft Most Valuable Professional, Client Application Development

Microsoft Certified Technology Specialist, Windows Presentation Foundation

WPF disciples


Social:


View my profile on LinkedIn

XING
Creative Commons License
Diary of a Code Trotter by Laurent Bugnion is licensed under a Creative Commons Attribution 3.0 Unported License

All source code on this blog is licensed under the MIT license.

Copyright (c) 2006 - 2011 GalaSoft Laurent Bugnion

Laurent Bugnion (GalaSoft) Diary of a Code Trotter
What?
Here's a cool trick, which I thought of after reading this comment and this post.
The good thing to remember is that Expression Blend is a (maybe the first) Microsoft application entirely written in WPF. I always thought it was pretty cool. Well, even cooler than I thought: When load a project in Blend, the code you wrote is actually executed! Of course there are some caveats (see below), but what it allows is to place a breakpoint in your code (for example in a User Control's constructor), and to attach the Visual Studio 2005 debugger to blend.exe. Then, when you open the window containing the user control (again, see the "caveats" below), the user control's constructor gets executed, and you can then debug.
Why?
So why is this useful? In my case, I was puzzled, because when I was opening my user control in Blend, some UI elements wouldn't appear. These UI elements' look&feel is defined by ControlTemplates located in the resources. Depending on a parameter (integer), a converter will pick the correct template from the resources. The syntax for the binding is something like that:
<Button
Template="{Binding ElementName=WindowRoot,
Path=LookID,
Converter={StaticResource IDToTemplateConverter}}"
/>

Binding with a converter
However, nothing appeared in Blend. Many explanations were possible: Either the converter was not found, or there was an error in the Convert method, or the Template was not found and null was returned.
By placing a breakpoint in the Convert method, and by attaching the debugger on Blend, I was able to find out that it was indeed the Template that was not found (and again, see "caveats" below). To solve the issue, I copied the templates in the user control's resources temporarily, and then everything worked as expected.
Caveats
Not everything is perfect in Blend, though. IdentityMan Nathan Dunlap helped me to find a workaround for the first issue. The other issues are annoying, but aren't really blocking.
  • Issue#1: Expression Blend has a lot of problems finding resources which are not local to the control currently edited. If the resources are located in an external assembly, and linked using a ResourceDictionary' Source property, then Blend is unable to display the resources correctly. You can still edit them in the resource dictionary directly, but they won't show in the user control.
    The workaround is to copy the resources locally, to work on them, and then copy them back to the external resource dictionary. While this is annoying, it's not that bad, and Blend supports drag&drop between resource dictionaries.
<Window.Resources>
<ResourceDictionary Source="/MyOtherAssembly;component/MyResources.xaml" />

</Window.Resources>
ResourceDictionary linked from another assembly
  • Issue #2 (benign): If you modify the code behind, the changes don't show automatically in Blend. You must recompile the assembly, then you must close the window in the Design view, and then reopen it. Only then will the modified code be run, and the changes will appear.
  • Issue #3: When you open a Window (or a user control), it's constructor is not executed. That's annoying, because if you place code to initialize the UI elements in the constructor, this code is not run, and nothing appears in Blend's design view. If you open a Window containing a User Control, the User Control's constructor is run, but not the Window's constructor. If you open a User Control containing children User Controls, each child's constructor is run, but not the parent's.
To demonstrate issue #3, let's create a Window (W1) containing one User Control (UC1). This User Control itself contains another User Control (UC2). W1, UC1 and UC2 each contain one Label. The content of the Label is set to "Not initialized". However, in W1, UC1 and UC2's constructor, the label's content is set to "It worked".
When you open the different objects in Blend's design view, here is what you get:
Opening UC2
Opening UC2
Opening UC1
Opening UC1
Opening W1
Opening W1
These issues are not critical, and workarounds exists. It would be nice, however, if they were solved in Blend's future release. The designer's (and the integrator's) work would be facilitated!
Posted on Thursday, May 17, 2007 5:51 AM Technical stuff , .NET , WPF , Expression Blend | Back to top


Comments on this post: WPF: Debugging your UI in Expression Blend

Comments are closed.
Comments have been closed on this topic.
Copyright © Laurent Bugnion | Powered by: GeeksWithBlogs.net