Speaking at the Portland Silverlight group on Aug 10 – Building toolable apps that enable dev/design workflow

On August 10th, Karl Shifflett and I will be making the trek down to the Portland Silverlight user group to present on building your WPF and Silverlight applications in such a way that they are tool-friendly or “toolable”. Here’s the official session description:
Portland Silverlight User Group

Building toolable Silverlight applications that enable the designer developer workflow
Warning: We won’t be 20 seconds into this session before mashing the gas pedal to the floor. After looking at the XAML tools Blend & Cider, we’ll dive deep into toolable application design. Toolable applications not only enhance the initial development experience but also provide benefits to long term application maintenance. An additional benefit is the enabling of the designer developer workflow. See the two roles played out in the presentation as they collaborate without clobbering each other.

I am hoping that not only do we dazzle you with new v4/2010 features, but we also help improve your perception from past versions.  If you haven’t been paying close attention the latest versions of the tools are actually pretty rocking.

And if you happen to be in Portland on August 3rd, check out Karl’s preview performance on WPF Line of Business app development at the Portland .NET User Group.

For more info: http://portlandsilverlight.net/

Posted in Client Technologies | Tagged , , , , , , | 2 Comments

Dissecting the IE9 Fish Tank demo: PNG based sprite sheet animation with Canvas

FishIE tank

One of my favorite demos from the IE9 Test Drive site is FishIE Tank. Labeled a “Speed Demo” the FishIE Tank demonstrates hardware acceleration, canvas based image manipulation and PNG based sprite sheet animation. And watching the FPS meter on the side of the demo, with 500 fish on a wide screen monitor it still reads ~32 FPS, almost 60 fps with 250 fish. That’s worth taking a look at the code to see how its done.

I decided to recreate the demo to understand the code better.  This first part covers only the background image rendering and the sprite sheet animation.  Plus I’ve switched out the image and sprite sheet to something a little more unique.

Spinning Heads Part1

Run the first Spinning Heads demo
(for the best results run it in the IE9 Preview, Chrome isn’t too bad, Firefox is not so good)

Of course since this is just HTML, JavaScript and Canvas you can View Source and read the commented code to figure out how the demo works.  To save you some time, though, I’ll highlight the setup and the two main features.

Two canvas layers created during SetupSpinning Heads Part1 Diagram

When the page loads, the setup function is called and two canvas elements are created and added to the page. Pointers to the drawing context are then saved for reuse during the drawBackground and draw functions.  With CSS, the spriteCanvas is absolutely positioned so the heads appear over the background.

Drawing the background image

On load and when the window is resized the drawBackground function is called:

function drawBackground() {
   if (WIDTH < backgroundImageW) {
      //Show a portion of the background
      ctx3.drawImage(backgroundImage, 0, 0, backgroundImageW, HEIGHT);
   }
   else {
      //tile the backgroundImage horizontally
      var tileCount = Math.floor(WIDTH / backgroundImageW);

      //flip the image when flip==-1 for better looking tiles
      var flip = 1;

      //loop through all the tiles that are needed and position them
      for (i = 0; i <= tileCount; i++) {
         ctx3.save();
         ctx3.transform(flip, 0, 0, 1, 0, 0);
         ctx3.drawImage(backgroundImage, (flip - 1) * backgroundImageW / 2 + flip * backgroundImageW * i, 0, backgroundImageW, HEIGHT);
         ctx3.restore();
         flip = flip * -1;
      }
   }
}

The main thing to point out here is the flip variable used to mirror every other background tile to create a smoother horizontally repeating background image, no matter what image is used. Vertically the image is stretched to match the height of the window.

Drawing the Sprites

During the setup, the sprites or Head objects in the case, are created with the createHeads function. A loop is then created using the setInterval function to call the draw function every 36 milliseconds. During the draw function each Head object is told to spin, effectively moving the next step through the sprite sheet.

function draw() {
   //clear the canvas
   ctx.clearRect(0, 0, WIDTH, HEIGHT);

   // Draw each head
   for (var head in heads) {
      heads[head].spin();
   }
}        

function Head() {
   var x = Math.floor(Math.random() * (WIDTH - headW) + headW / 2);
   var y = Math.floor(Math.random() * (HEIGHT - headH) + headH / 2);
   var scale = Math.random() + .2;
   var cellCount = 10;
   var cell = Math.floor(Math.random() * (cellCount - 1));
   var cellReverse = -1;

   function spin() {
      ctx.save();
      ctx.translate(x, y);
      ctx.scale(scale, scale);
      ctx.drawImage(imageStrip, headW * cell, 0, headW, headH, -headW / 2, -headH / 2, headW, headH);
      ctx.restore();

      //increment to next state
      if (cell >= cellCount - 1 || cell <= 0) {
         cellReverse = cellReverse * -1;
      }
      //go back down once we hit the end of the animation
      cell = cell + 1 * cellReverse;
   }
   return {
      spin: spin
   }
}

Important to note here that in the draw method, if the context is not cleared first, artifacts from previous “frames” will remain. This is not a retained mode graphics system, we’re just creating a big set of pixels that all share the same layer.

The next bit of code to call out here is within the spin method a call to save() and restore() is used to manually add and remove the translate and scale transforms.  This way the transforms are unique to each Head.  Otherwise the transforms by default are cumulative and each successive Head would be moved further and further off the screen.  This is similiar to pushMatrix and popMatrix in Processing.

And finally the real magic, each successive draw call increments (or decrements when going in reverse) the cell variable which offsets the drawImage call so that the appropriate section of the sprite sheet is called.

So that’s it for the basics! If you’re familiar with procedural based animation the techniques should look pretty familiar to you. The biggest difference here is that there’s no plug-in or applet, just JavaScript and a modern browser.

Posted in Client Technologies, Tutorials | Tagged , , , , | 8 Comments

XLinq default namespace gotcha

This gotcha has tripped me up before and I’m not sure where I found the answer last time, but this time I thought I’d blog the answer. My hope is it will help others from wasting time, including my future self (since I’ll likely run into it again).

Here’s the scenario: You’re using .NET to parse some XML and you’ve decided to use the new XLinq library because its compact, has a cool name and makes your code look advanced.

Below is the XML you need to parse (sampled from AtomEnabled)





  2003-12-13T18:30:02Z
  
    John Doe
  
  urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6

  

    urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
    2003-12-13T18:30:02Z
Some text.

  


Now here’s the XLinq code you use to retrieve the feed’s title:

XDocument doc = XDocument.Parse(xmlString);
string titleValue = doc.Root.Element("title").Value;

To your surprise this results in an unhandled NullReferenceException: “Object reference not set to an instance of an object.”.  Looking at the XML above it looks like the right path and if you rollover doc.Root in the Visual Studio debugger it shows the contents of the feed element as expected.

The issue is that the default XML namespace has been changed. If you look at the feed element, you can see that a new namespace has been added without declaring a prefix  (xmlns=”http://www.w3.org/2005/Atom”).  This is the reason your code is not finding the elements.  You must declare and use that new namespace in code:

XDocument doc = XDocument.Parse(xmlString);
XNamespace atom = "http://www.w3.org/2005/Atom";
string titleValue = doc.Root.Element(atom + "title").Value;

With the namespace declared and used when finding elements, you will have success in retrieving values.  The hard part of what to do with the parsed XML is left up to you, but at least you’re not stuck anymore.

For more LINQ awesomeness, check out the .NET Framework Developer Center

Posted in Client Technologies | Tagged , , , | 3 Comments

I’m joining Pixel Lab!

Adam Kinney joins Pixel Lab

I’m excited to announce that my next move after Microsoft will be joining the crew at Pixel Lab — an outstanding small agency that is very UI and Design focused with a strong background in WPF and Silverlight.

Robby Ingebretsen (@ingebretsen) and Kevin Moore (@kevmoo) have been doing some great work over there including Seesmic, Books.Show and Picture Puzzle (more examples on the Pixel Lab site) while maintaining their open lab projects Kaxaml, Bag of Tricks and Simple Styles for Silverlight. I’m looking forward to adding my own set of designer and developer skills to the group and the new projects we’re working on (hint:Windows Phone 7 and HTML5!).

This new move will also give me the opportunity to spend sometime with other UI technologies which I’ve been itching to learn – Processing book is in a truck in Nevada on its way here.  As far as the blog and twitter go, I’m guessing it will be the same type of content (“how to” UI goodness) with perhaps a little more variety (planning to comparing Silverlight 4 and Flex 4 skinning models).

Get in touch about project opportunities

Learn more about Pixel Lab

Posted in Client Technologies, Storytelling | Tagged , | 15 Comments

Import Art from Photoshop and Make into Silverlight Controls

One of my favorite features of Silverlight is the ability to completely redefine the visual elements of a control. By editing templates and visual states you can reuse the functionality of controls without having to write any custom classes or logic.

In this tutorial, we’ll take graphics created in Adobe Photoshop and Illustrator, import them into Expression Blend and then quickly turn the visual assets into interactive Silverlight controls.
Download the Assets for this tutorial

Import a Photoshop file into Expression Blend

If you open the “cmanlogin_unmerged.psd” file, included with the tutorial assets, you will see an image similar to the thumbnail shown here.

Here we have a thin hairless caveman which will be used as the login screen for a website. Notice the two rounded rectangles which represent a focused and unfocused textbox for username and password entry. Also check out the cave man’s spear, which we’ll turn into a working torch after the textboxes are ready.

Let’s begin. The following steps are based on Expression Blend 4 and Silverlight 4.

  1. Open Blend and create a new “Silverlight Application” and name it “ImportArtSample”.
  2. From the menu at the top select the File -> Import Adobe Photoshop File option.
  3. In the dialog, navigate to “cmanlogin_unmerged.psd” file, included with the tutorial assets and click Open.
  4. Once opened the Import Preview dialog should look like the picture below. Examine the preview and you will notice the following bits of information:

    1. Preview of the composed image – no need to have Photoshop on the machine doing the import work.
    2. Select a Text layer and at the bottom of the dialog you will see the options to Import the layer as editable content (TextBlock control) or a flattened bitmap (Image control).
    3. Select a Shape layer and at the bottom of the dialog you will see the options to Import the layer as editable content (Path control) or a flattened bitmap (Image control).
    4. The “fx” icon denotes that Blend is able to reproduce the Drop Shadow effect in Silverlight and will not “flatten” the Layer Style.
    5. The only option for raster layers is to be imported as Image controls.
    6. The “i” icon lets you know that the “Multiply” Blend Mode from Photoshop is not supported in Silverlight, so you should merge those layers before importing to get the same effect.
  5. On the Import Preview dialog, hit Cancel. We need to fix the Blend mode issue first. In Photoshop merge the “shadows” and “caveman” layers and save the file or use the “cmanlogin.psd” file included with the tutorial assets for the next step.
  6. From the menu at the top select the File -> Import Adobe Photoshop File option and navigate to the merged “cmanlogin.psd” file, and click Open.
  7. Uncheck “Layer 1”, since we do not need the background layer and click OK.
  8. In the Objects panel, expand the cmanlogin Canvas to explore the results of the Import:

    1. First glance at the Artboard – the results look exactly the same as the layers in Photoshop.
    2. The imported elements are contained within a Canvas control named cmanlogin after the imported file name. The Canvas provides absolute xy positioning like Photoshop allowing for a high-fidelity import in regards to positioning.
    3. The caveman Image control is used to display the raster “caveman” layer. You can find the PNG file in the Projects panel under the “cmanlogin_Images” folder.
    4. The password Path is the yellow rounded rectangle shape. Notice the DropShadow Effect applied in place of the layer effect.
    5. Both text layers have been imported as TextBlocks with the custom font at the correct size. Additionally if you check out the ScaleX and ScaleY properties of the ROCK_ TextBlock you find it has maintained its horizontal and vertical stretching.
  9. Now let’s stretch out the elements to take up the full space. Click and drag the ROCK_ TextBlock to align horizontally with the Brought_the TextBlock. Notice that a clip has been applied to the cmanlogin Canvas hiding elements outside of its bounds:
  10. The clip is used to hide any elements that may have been imported and positioned off screen. We don’t need to hide anything, so let’s remove the clip. Select the cmanlogin and in the Properties panel type “clip” into the Search box.
  11. Click the Advanced options square and select the Reset option. Clear the search filter by clicking the “X” in the search box.
  12. You should now see the rest the text in the ROCK_ TextBlock. (You may need to reposition the TextBlock slightly to get the drawing surface to update.)
  13. Next reposition the yellow password Path set it is above the username Path make larger to fill up the space available.

Make Into Control

Now that the elements have been imported, let’s turn them into working Silverlight controls.

First we’ll make a new TextBox Style which will give the TextBox control class new visual elements to use for display and interaction. This is done by using specific Part names for controls and specifically named Visual States. The TextBox control class will then use these named elements when displaying text, reacting to a mouse over or any other functional aspect possibly displayed in the UI.

  1. Right-click the yellow password Path and select the Make Into Control option. In the dialog, Blend will display all of the Silverlight controls that are able to be templated for you to choose from. Enter “text” into the Search box and select “TextBox”. Keep the defaults and hit OK.
  2. You have now entered the Template Editing Zone. In the Objects panel, [UserControl] has been replaced with TextBoxStyle1 (TextBox Template). This lets you know you are editing a reusable Resource, not an instance of a control. The Objects panel is displaying the tree of elements used for this template.
  3. To start with we have the password Path available as a background element, but we need a place to put the text. In the Toolbar, click and hold on the Grid tool until the container menu comes up, then select the ScrollViewer. Now double-click the ScrollViewer to add an instance to the Grid.
  4. With the ScrollViewer selected, in the Properties Panel (make sure to remove the “clip” search filter if it’s still there) Set the Margin to 8,0,8,0. In Silverlight the order goes “Left, Top, Right, Bottom” unlike CSS which is “Top, Right, Bottom, Left”.
  5. Set the HorizontalAlignment to “Stretch”, Width to “Auto” and the BorderBrush to “No brush”.
  6. Right-click the ScrollViewer and select Make Into Part of TextBox -> ContentElement. And the default text appears, right away:
  7. With the Part in place to display the text, let’s modify the Visual States to share when the TextBox has focus. Open the States Panel and you will find the Visual States created by Blend for you based on the TextBox class.
  8. First let’s create the default look of the TextBox. With the Base state selected, change the Fill property of the password Path to the gray color of the username Path. Change the Opacity of the DropShadowEffect’s Opacity to 0%.
  9. Now select the Focused state and change the password Path Fill property to a bright Yellow and set the DropShadowEffect Opacity to 80%.
  10. Hit F5 to Run the Project and test your new TextBox style. Click the TextBox to give it focus and you’ll see it change to yellow with a dropshadow. Then start typing. Pretty cool, right?

Reuse the new Style

Ok so now that we’ve defined a TextBox Style as a reusable Resource, let’s reuse it.

  1. First make sure you are no longer in template editing mode, you can do this by clicking the Return to Scope icon in the Objects panel.
  2. Select the username Path and delete it.
  3. In the Toolbar, click and hold on the TextBlock tool until the text menu comes up, then select the TextBox. Then draw a new TextBox below the styled TextBox:
  4. Now right-click the new TextBox and select the Edit Template -> Apply Resource -> TextBoxStyle1 option.
  5. Since the size of the TextBox was not hard-coded into the template they may not look exactly the same. You can type in matching Width and Heights for the TextBoxes or you can also select them both and use the top menu Object -> Make Same -> Size option.
  6. Hit F5 to Run the Project and test the pair of TextBoxes in action. Switching the focus between the two TextBoxes really shows the control’s Visual States in action.

Import from Illustrator

If this were a tutorial about creating a login screen, our next step would probably be to add a button to validate the user’s credentials. Instead since this is a tutorial on importing artwork and control templates in Silverlight, we’re going to turn the caveman’s walking stick into a torch.

  1. From the menu at the top select the File -> Import Adobe Illustrator File option.
  2. In the dialog, navigate to “cmanlogin_flames.ai” file, included with the tutorial assets and click Open.
  3. In the Objects panel, expand the cmanlogin_flames Canvas to explore the results of the Import:

    1. The imported elements are contained within a Canvas control named after the imported file name, just like the Photoshop import.
    2. Each Illustrator Layer is separated into its on Canvas.
    3. Vector elements are imported as Paths.
  4. Let’s get rid of the unnecessary Layer_2 Canvas, by right-clicking on it and selecting the Ungroup option.
  5. Select both of the Paths and reposition them closer to the upper left corner of the cmanlogin_flames Canvas.
  6. Resize the cmanlogin_flames Canvas to fit the Paths. The original 800×600 size came from the Artboard size in the Illustrator document.

Reuse Functionality

The last time we made some artwork into a control, we really just provided a custom background (rounded rectangle) and a custom Visual State (bright yellow with dropshadow). That’s not too much of a stretch, so this time we’ll reuse the checked functionality of a CheckBox to create a caveman torch that clicks on and off. We’ll add custom transitions as well so we get a flicker of the flame when it turns on and off.

  1. Reposition the cmanlogin_flames Canvas so the flames look like they are emanating from the torch. You may want to reposition the cmanlogin Canvas a bit so the flames don’t go off the top of the screen.
  2. Right-click the cmanlogin_flames Canvas and select the Make Into Control option.
  3. In the dialog, select the CheckBox control and hit OK.
  4. In template editing mode, delete the ContentPresenter. Our torch doesn’t need to display any text.
  5. In the States panel with the Base state selected, set the Opacity of the cmanlogin_flames Canvas to 0%
  6. Select the Checked state and set the cmanlogin_flames Canvas Opacity to 100%. Change the Default transition of the CheckStates EasingFunction to CircleIn and the duration to 0.5 seconds.
  7. Click the Transition Preview button in the upper right of the States panel and toggle between the Unchecked and Checked states to get a preview the transition at design-time. No need to Run the project, which is nice.
  8. We’ll use the default transition as the way to “turn on” the flame, but we want the flame to flicker so let’s create a custom transition. On the Checked state, click the Add Transition button and select the Checked -> Unchecked option.
  9. Set the custom transition to a BounceOut EasingFunction and to a 1 second duration.
  10. Run the project and click the end of the torch to turn it on. Click again to turn it off. Wasn’t that easy?

Conclusion

Control templates in Silverlight are very powerful and customizable. Expression Blend makes the process of creating and editing templates much easier and the addition of the import from Adobe tools is the knockout punch. As you may have figured out by now, this process could only be made better by providing a two-way relationship between the asset design tool and Blend. The good news is this was demoed at MIX10 in the form of an
FXG Import from Illustrator. Once this add-in is released we’ll be in even better shape as Silverlight UI designer and developers, and I’ll be making another tutorial.

Posted in Client Technologies, Tutorials | Tagged , , , , , , | 4 Comments

My Last Day at Microsoft

Wow – I can’t believe it has already been 5 years at Microsoft.  I have had a great time here and learned so much from the smart and passionate people I work with as well as the incredible developer community around .NET.  But I have decided it is time for me to try something new – so my last day at Microsoft will be Friday, June 25th.

I’ve had a fun run here at Microsoft and it has always involved the community in one way or another:

  • Channel 9 – Thanks to Jeff Sandquist for starting my career at Microsoft as a developer on the Ch9 team. Back in those days the team was Jeff, Robert Scoble, Charles Torre, David Shadle and myself. And now the team has grown into a division of both content creators and developers. Amazing to see the growth in such a short time.
  • Microsoft Gadgets – Community server spun-off with a custom Showcase Gallery back from the Windows Vista days.
  • Channel 10 – a spin-off of Channel 9 in the direction of tech enthusiasts. This project had a very short lead time and we started from scratch, so it was definitely a rush putting it together and exciting because of that fact.  A quick shout-out to the dev team from back in the day – Erik Porter, Duncan Mackenzie, Mike Sampson
  • MIX websites – (MIX06 – MIX08) Always a labor of love for my favorite Microsoft conference.
  • Channel 8 – (now the Student Lounge) Another Ch9 spin-off that went in the direction of students and academics.
  • Silverlight 1 evangelism – XAML in the browser and cross-platform – amazing! Thanks to Tim Sneath for taking me under his wing.
  • Silverlight 2 evangelism – .NET in the browser and a control model – wonderful!
  • Continuum Show – Exploring the world of the Microsoft Client Continuum and Adam Kinney’s personal idea on how to make videos for Channel 9.
  • Project Rosetta – Have Flash skills? Learn how to use them with Silverlight
  • Silverlight 3 evangelism – Blend and Sketchflow hit the big time, behaviors, better databinding and out of the browser – rocking!
  • Silverlight TVJohn Papa’s show on Ch9 where I acted as head cheerleader and occasional guest.
  • .toolbox – Free training courses on design principles and learning how to apply those principles with Silverlight and Blend
  • Silverlight and Expression 4 launch – Silverlight out-of-browser story complete, devices, printing – hooray! Blend 4 smoother than ever before and can I get a “PathListBox”? PATHLISTBOX!

Another way my time was spent, was attending the variety of different events. It’s always fun to talk to people face to face and learn first-hand the thoughts and needs of the community.  This was definitely a highlight of my job and reminded me why we do what we do.  To list a few of the events here: MIX06-MIX10, PDC05-PDC09, REMIX events (especially European tour 09), the recent Silverlight Design Days/.toolbox Blend events and many more.

All right, enough listing of my history and favorite moments, so what’s next?

I’m going to enjoy the summer by road tripping with my family to Denver and back before starting my next endeavor. I will continue to be involved with the Silverlight and Expression Blend (my love!) community, so I won’t be going too far.

     Email: contact me

     Blog: http://adamkinney.com/blog/

     Twitter: @adkinn

     Facebook: adkinn

Posted in Client Technologies, Storytelling | Tagged , , , , , | 38 Comments

Expression Studio 4 Launch keynote videos are available

Expression Studio 4 Launch keynote video

For those of you who were not able to make it to Internet Week last week, the Expression Studio 4 keynote video is now available!

(And my condolences to you, since that means you likely also missed the best Microsoft party ever, props to the Expression team!)

What’s in the keynote?

Elevate Design animation

0:00:00 – Elevate Design, a short “buddy” movie about two friends who learn to collaborate.

 

Bill Buxton on transmedia

0:04:58 – Bill Buxton on the idea of building consistently good experiences across multiple devices, each with their unique set of expectations and the goal of working towards a common set of tools allowing for leveraging existing investments while tailoring the experience.

(Deep and a bit difficult to summarize, as you might expect, but worth a listen)

 

Expression Studio 4 Launch - Encoder

0:25:58 – Expression Encoder 4 – here’s a snapshot of overlaying video, supports XAML too

 

Expression Studio 4 Launch - Web

0:37:25 – Expression Web 4 – example of debug in SuperPreview and Safari on Mac support

 

Expression Studio 4 Launch - Blend

0:48:14 – Expression Blend 4 – quickly building a book search app, PathListBox in action!

 

And after all this you might be wondering, what about Windows Phone?

Yes, Expression Blend® 4 for Windows Phone is coming… soon!

Posted in Client Technologies | Tagged , , , , , , | 3 Comments

Debugging the TranslateZoomRotate WPF Behavior in Blend

TranslateZoomRotate Behavior in action

This question on Stack Overflow referring to an error when using the new WPF behavior TranslateZoomRotate.

First of all, its nice to see the new behavior included with Expression Blend 4 in use.  The TranslateZoomRotate behavior provides support for gesture-based rotating, scaling and position translation just by dropping the behavior onto an element.

You also have the option to customize the behavior by setting a few properties:

  • SupportedGestures – allows you to specify distinctly which operation are supported TranslateX, TranslateY, Translate, Scale and/or Rotate.

    [Special Note: when setting this value in Blend you are presented with a dropdown which makes it appear as if you can only select one option. If you click the Advanced option scuare and select the Custom Expression option, you can enter a comma delimited list.  For example, “Rotate, Scale” would only rotation and scaling – no repositioning.

  • ConstrainToParentBounds – useful boolean value
  • MaximumScale and MinimumScale – bounds for scaling
  • RotationFriction and TranslateFiction – determines how sudden the changes occurs. Are you on ice or on sandpaper?

Its a nice and powerful behavior we can just drag and drop onto an element and we instantly recreate the Surface photo viewing experience for free.

Back to the question with the error, kennethkryger ran into an issue where an instance of the TranslateZoomRotate behavior was overriding his existing ScaleTransform by adding a MatrixTransform in its place.

To see this error in action:

  1. Download the catHead sample
  2. Move, scale or rotate the catHead
  3. Click the “Fade Away Cat!” text which kicks off a Storyboard
  4. App freezes, Exception is thrown.

What happened?

When the TranslateZoomRotate behavior is used it replaces any existing transforms with a MatrixTransform so it can easily perform its own operations. The target of the Storyboard is no longer valid.

How do you get around it?

Just like when you want to apply multiple effects to a single object, use another container.

  1. In Blend, right click the catHead Grid and select the Group –> Grid option
  2. Move the TranslateZoomRotate behavior up to the new Grid
  3. Move, scale or rotate the catHead
  4. Click the “Fade Away Cat!” text which kicks off a Storyboard
  5. Storyboard completes successfully!

This post is dedicated to the large amount of cats wandering my neighborhood.

Posted in Client Technologies | Tagged , , , | 1 Comment

New tutorials on .toolbox on PathListBox and Fluid UI

We tweeted about them, but I realized this morning I haven’t blogged about the new tutorials on the .toolbox site.

 

To go along with the Expression Studio 4 launch, the team has put together a new 5-day OnRamp training course. The course introduces the Expression Studio tools and is very useful as a first step into the wild world of Expression. The fifth day of the course leads you to the .toolbox site where more advanced courses and tutorials are provided.

Here’s a list of the first two tutorial series:

PathListBox Series

Fluid UI Series

What other topics would you like to see?

Posted in Client Technologies, Tutorials | Tagged , , , , , | 2 Comments

What’s new in Blend 4 Behaviors on Silverlight TV

Right after landing in Seattle after the latest .toolbox events tour, I ran to the studio and filmed this episode on Behaviors of SilverlightTV. Not only are there 10 new Behaviors added in version 4 of the Expression Blend SDK, there is new functionality available in the Behaviors API. In this video, we use a few of the new Behaviors and demonstrate that their properties are now bindable and that once triggered an action can check against a specified condition to ensure that it should fire.

These new features result in more “simple drag and drop/property setting” power for the UI designer and developer.

Watch "Using Behaviors in Blend 4"

Posted in Client Technologies | Tagged , , , , , | 2 Comments