<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Bruno Sonnino</title><link>http://msmvps.com/blogs/bsonnino/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BrunoSonnino" /><feedburner:info uri="brunosonnino" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>ReSharper–Productivity tool for Visual Studio</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/WiopArTnJ7c/resharper-productivity-tool-for-visual-studio.aspx</link><pubDate>Fri, 17 Feb 2012 17:44:11 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1806099</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1806099</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/02/17/resharper-productivity-tool-for-visual-studio.aspx#comments</comments><description>&lt;p&gt;One of the indirect benefits of being a Microsoft MVP is that many tool or component producers give copies for MVPs for their personal use, so they can use, evaluate and, if they like it, recommend it.&lt;/p&gt;  &lt;p&gt;I use many of these tools on a daily basis and like them very much. So nothing more fair than write a post about them and how they help my work.&lt;/p&gt;  &lt;p&gt;There is no doubt that the tool I use the most is ReSharper (&lt;a title="http://www.jetbrains.com/resharper/" href="http://www.jetbrains.com/resharper/"&gt;http://www.jetbrains.com/resharper/&lt;/a&gt;), an add-in for Visual Studio to enhance your productivity. When I use Visual Studio, it’s always there, helping me to write code.&lt;/p&gt;  &lt;h2&gt;Code analysis&lt;/h2&gt;  &lt;p&gt;When you open a project, ReSharper will analise your code and start to give you suggestions to enhance it. When you open a console project, you will see something like this on the editor:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8171.image_5F00_thumb50_5F00_391DEBD8.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb50" border="0" alt="image_thumb50" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5430.image_5F00_thumb50_5F00_thumb_5F00_5C8A6A70.png" width="518" height="135" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;On the right side, a new bar is added with help indicators for your code. The yellow square at the top shows that there are warnings to improve your code. If it’s red, there are compile errors and, if your code is ok, the square turns green. Below the square, there are some bars indicating the points where problems are found. If you hover the mouse over the bars, a tooltip will show the problem.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3652.image_5F00_thumb3_5F00_7224A30D.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb3" border="0" alt="image_thumb3" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1307.image_5F00_thumb3_5F00_thumb_5F00_2C6FF322.png" width="409" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Fixing the error is very simple. You just have to click on the bar and the editor will be positioned on the place of the error. A red bulb will indicate the error and we can click on it to show the available actions. This list can be selected with &lt;strong&gt;Alt-Enter&lt;/strong&gt;. If I could only remember one ReSharper shortcut, this would be the one. It will do many fixes for you, with &lt;strong&gt;Alt-Enter &lt;/strong&gt;your code will improve a lot!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2251.image_5F00_thumb5_5F00_68D841FF.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb5" border="0" alt="image_thumb5" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8407.image_5F00_thumb5_5F00_thumb_5F00_46A03679.png" width="411" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We select the desired action and ReSharper corrects the code (by eliminating the using clauses not needed). To fix next error, we can see that the args parameter in the Main function is in gray. That means that it’s not being used there. When we put the mouse over the args parameter, ReSharper shows a pyramid, indicating that there is a refactoring to be made.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2677.image_5F00_thumb7_5F00_5D12D500.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb7" border="0" alt="image_thumb7" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8233.image_5F00_thumb7_5F00_thumb_5F00_2D08837F.png" width="342" height="136" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It will remove the unused parameter. Besides this change, it will verify all places where the function is called and change its call. That’s great when we add a parameter and later we verify it is not needed and we want to remove it. If we do that, all places where the function is called will not compile. With this refactoring, our code won’t break anymore.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8741.image_5F00_thumb54_5F00_46FC43A1.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb54" border="0" alt="image_thumb54" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4666.image_5F00_thumb54_5F00_thumb_5F00_10AB1B92.png" width="378" height="71" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ReSharper is constantly analyzing our code and checking consistency on variables and methods names. You can tell how do you like to name the fields, properties and methods and it will check the consistency for you.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8171.image_5F00_thumb13_5F00_4F9C9C2D.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb13" border="0" alt="image_thumb13" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1526.image_5F00_thumb13_5F00_thumb_5F00_5A797D75.png" width="448" height="337" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For example, I like to name my private fields using CamelCase, starting with a lowercase character (with no leading underscore). If I put a field using a different naming, ReSharper will tell me and ask to change it. Just press &lt;strong&gt;Alt-Enter&lt;/strong&gt; and it will change the name and all references to this variable.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4380.image_5F00_thumb56_5F00_69CCDF84.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb56" border="0" alt="image_thumb56" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5226.image_5F00_thumb56_5F00_thumb_5F00_6411C5DE.png" width="435" height="108" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Code improvement&lt;/h2&gt;  &lt;p&gt;ReSharper also verifies the quality of your code. Yes, I know that your code (like mine) is wonderful, but can it be improved? Take a look on the figure below, where I have a WPF application where I’ve added the event handler of the Click event for a button in code, using &lt;em&gt;button1.Click += &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6758.image_5F00_thumb59_5F00_22971385.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb59" border="0" alt="image_thumb59" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6116.image_5F00_thumb59_5F00_thumb_5F00_4BBEABC3.png" width="498" height="206" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ReSharper shows two warnings and a reminder. The first warning is about &lt;em&gt;MainWindow&lt;/em&gt;. It shows that the parent type (Window) has been already declared and is not necessary. We should remember that when we create a WPF window we are creating a partial class, declared in two places: on the XAML and on the code behind. The XAML already tells that &lt;em&gt;MainWindow&lt;/em&gt; inherits from &lt;em&gt;Window&lt;/em&gt; and we can remove this redundant declaration on the code behind. The second warning is due to the fact that we can eliminate the delegate creation when adding the handler. The reminder is to tell us that we have a “Not Implemented” exception, a clear indication that we must add code there. Pressing &lt;strong&gt;Alt-Enter&lt;/strong&gt; twice, and our code will be changed to:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0724.image_5F00_thumb61_5F00_09D7C675.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb61" border="0" alt="image_thumb61" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8015.image_5F00_thumb61_5F00_thumb_5F00_47F0E126.png" width="494" height="206" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ReSharper analyses your code, checking for improvements and possible errors. When you enter this code&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6404.image_5F00_thumb63_5F00_5F3BE597.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb63" border="0" alt="image_thumb63" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4048.image_5F00_thumb63_5F00_thumb_5F00_2B274644.png" width="492" height="248" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;you can see on the bar on the right a warning and a possible improvement. The warning tells us that &lt;strong&gt;ToString&lt;/strong&gt; is redundant and that we must specify a culture for the conversion. The fact that it’s redundant makes it a candidate for elimination. &lt;strong&gt;Alt-Enter&lt;/strong&gt; and there it goes. The next improvement is in the &lt;strong&gt;for&lt;/strong&gt;, that can be converted to a LINQ expression. Pressing &lt;strong&gt;Alt-Enter&lt;/strong&gt; again we end up with this code:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4186.image_5F00_thumb66_5F00_1E1D4066.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb66" border="0" alt="image_thumb66" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6014.image_5F00_thumb66_5F00_thumb_5F00_74C5F867.png" width="497" height="218" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Other common code improvements are &lt;em&gt;if&lt;/em&gt; and &lt;em&gt;return &lt;/em&gt;optimizations: when we put something like this&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:0be1ce8e-e3ee-4fd5-b970-99796c818706" class="wlWriterSmartContent"&gt;   &lt;pre style="background-color:white;width:1024px;height:92px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
  y &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  y &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;ReSharper optimizes to:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:bb0d6cd5-e512-45c7-af8b-5f7814116eaf" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:1024px;height:27px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;y &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; : &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Or this code:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9dffe4b6-b07f-4807-9129-e97be14c2454" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:1024px;height:88px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
  &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Here, we have two optimizations: eliminate the &lt;em&gt;else&lt;/em&gt;&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a484a233-7325-4868-8da9-80722d0d7690" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:1024px;height:73px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
  &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;or use the ternary operator:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:88c8463a-de93-4798-8299-f506d341779e" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:1024px;height:40px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; : &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2&gt;Refactoring&lt;/h2&gt;

&lt;p&gt;That’s not all that ReSharper can do for you. Its refactoring tools and code creation are fantastic. If we want to extract the code from the event handler to a new method, we can press &lt;strong&gt;Ctrl-Shift-R&lt;/strong&gt; (Refactor this) and ReSharper will show all available refactorings.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1258.image_5F00_thumb72_5F00_79C83616.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb72" border="0" alt="image_thumb72" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7180.image_5F00_thumb72_5F00_thumb_5F00_11133A88.png" width="454" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We select the extract method refactoring and this screen is shown:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6470.image_5F00_thumb31_5F00_0EF63BBF.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb31" border="0" alt="image_thumb31" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4213.image_5F00_thumb31_5F00_thumb_5F00_2C8816BE.png" width="460" height="399" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can indicate the parameters, the function name and its return type. By clicking on &lt;em&gt;Next&lt;/em&gt;, we get something like&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4087.image_5F00_thumb68_5F00_25F4972E.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb68" border="0" alt="image_thumb68" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0310.image_5F00_thumb68_5F00_thumb_5F00_75EA45AC.png" width="464" height="247" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Code creation&lt;/h2&gt;

&lt;p&gt;We can also insert code using templates. ReSharper allows to create templates with code for new files or code snippets. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1273.image_5F00_thumb39_5F00_65FB00E8.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb39" border="0" alt="image_thumb39" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5344.image_5F00_thumb39_5F00_thumb_5F00_71B0481A.png" width="463" height="453" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;We have three kinds of templates:&lt;/p&gt;

&lt;li&gt;Live templates – code snippets templates, inserted like Visual Studio snippets. To insert them, we must add the snippet name and press &lt;em&gt;&amp;lt;tab&amp;gt;&lt;/em&gt; to insert. One other way to insert these snippets is by using &lt;strong&gt;Ctrl-E-L&lt;/strong&gt;. On the figure above, I’ve created the &lt;strong&gt;propnp &lt;/strong&gt;snippet, that creates a property with a backing field and calls the &lt;em&gt;PropertyChanged&lt;/em&gt; handler. &lt;/li&gt;

&lt;li&gt;Surround templates, that surround the code with a template, like to surround the code with a &lt;em&gt;try…catch&lt;/em&gt;. They can be invoked with &lt;strong&gt;Ctrl-E-U.&lt;/strong&gt; &lt;/li&gt;

&lt;li&gt;File templates – they create new files on our project, like new classes or interfaces. They are invoked with &lt;strong&gt;Ctrl-Alt-Ins&lt;/strong&gt;. &lt;/li&gt;

&lt;p&gt;We will create a new class in our project. We press &lt;strong&gt;Ctrl-Alt-Ins&lt;/strong&gt; and create a new class, calling it &lt;em&gt;NewClass&lt;/em&gt;. We then press &lt;strong&gt;Alt-Ins&lt;/strong&gt; and insert the constructor for the class. On the constructor parameters, we insert a dependency:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4237.image_5F00_thumb41_5F00_0822E6A2.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb41" border="0" alt="image_thumb41" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8473.image_5F00_thumb41_5F00_thumb_5F00_3B7EA9FE.png" width="367" height="137" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that &lt;em&gt;IDependency&lt;/em&gt; is in red, because we have not defined this interface. We press &lt;strong&gt;Alt-Enter&lt;/strong&gt; and these options are shown:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7762.image_5F00_thumb43_5F00_6108275F.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb43" border="0" alt="image_thumb43" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0383.image_5F00_thumb43_5F00_thumb_5F00_7F063553.png" width="369" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ReSharper has noted that we’ve set the type name starting with ’I’ and suggests to create a new interface. We can create our interface from here. After creating the interface, we press &lt;strong&gt;Alt-Enter&lt;/strong&gt; again in &lt;em&gt;IDependency &lt;/em&gt;in the constructor and we can declare a field to store the dependency:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8255.image_5F00_thumb45_5F00_47DCA75A.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb45" border="0" alt="image_thumb45" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2251.image_5F00_thumb45_5F00_thumb_5F00_0D14FE84.png" width="370" height="251" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our interface was created on the same file as the class file. We can go to its declaration and press &lt;strong&gt;Alt-Enter&lt;/strong&gt;. ReSharper offers to move it to a different file. A new &lt;strong&gt;IDependency.cs&lt;/strong&gt; file is created with the interface. Easy, no? It also eases the variables declaration. For example, when we enter code like&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:f9c0fee8-4912-4689-a883-883f8b4b840a" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:1024px;height:23px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;total &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;on the constructor, we see that &lt;strong&gt;total&lt;/strong&gt; is in red. Pressing &lt;strong&gt;Alt-Enter &lt;/strong&gt;we have these options:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2211.image_5F00_thumb47_5F00_0444F638.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb47" border="0" alt="image_thumb47" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6215.image_5F00_thumb47_5F00_thumb_5F00_3734869F.png" width="368" height="219" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can create a &lt;strong&gt;total&lt;/strong&gt; field on our code. As we can see, we have many ways to change and improve our code. &lt;/p&gt;

&lt;h2&gt;XAML help&lt;/h2&gt;

&lt;p&gt;But that is not alll that we get. We can use ReSharper also while editing XAML code. For example, if we create a Converter in code:&lt;/p&gt;

&lt;p&gt;
  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:61420587-233f-41c1-b0e3-a8d1d80e4cc0" class="wlWriterSmartContent"&gt;
    &lt;pre style="background-color:white;width:1024px;height:218px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; DebugConverter : IValueConverter
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Convert(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; value, Type targetType, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; parameter, CultureInfo culture)
    {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
    }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; ConvertBack(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; value, Type targetType, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; parameter, CultureInfo culture)
    {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;When we want to use it in XAML, we must follow some steps: namespace, resource declaration, etc. ReSharper can help us for that.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6242.image_5F00_thumb74_5F00_7957EF22.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb74" border="0" alt="image_thumb74" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7380.image_5F00_thumb74_5F00_thumb_5F00_2C477F8A.png" width="489" height="109" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We press &lt;strong&gt;Alt-Enter&lt;/strong&gt; in &lt;em&gt;DebugConverter&lt;/em&gt; and select &lt;strong&gt;Create resource in type element &amp;lt;Window&amp;gt;&lt;/strong&gt;. ReSharepr creates the &lt;strong&gt;Resources&lt;/strong&gt; section and creates the resource. We add the name &lt;strong&gt;DebugConverter &lt;/strong&gt;with no namespace. A tooltip is shown indicating the needed namespace&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4011.image_5F00_thumb76_5F00_758A2485.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb76" border="0" alt="image_thumb76" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0172.image_5F00_thumb76_5F00_thumb_5F00_68439B72.png" width="492" height="118" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We then press &lt;strong&gt;Alt-Enter&lt;/strong&gt; and the namespace is added to the window declaration and the prefix added to the element. If we don’t like its name, we can rename it with &lt;strong&gt;Ctrl-R-R&lt;/strong&gt;. Everything needed is ready, now. If we have a DataContext associated to the element and it doesn’t have a property named &lt;strong&gt;Valor&lt;/strong&gt;, we can use ReSharper to create this property on the DataContext class, like a ViewModel.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7571.image_5F00_thumb80_5F00_1F3D79AC.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb80" border="0" alt="image_thumb80" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3618.image_5F00_thumb80_5F00_thumb_5F00_6EC6F535.png" width="493" height="126" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Code navigation&lt;/h2&gt;

&lt;p&gt;ReSharper has many shortcuts for code navigation. For example, &lt;strong&gt;Ctrl-T&lt;/strong&gt; navigates to a defined type. A screen like this open is opened&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0042.image_5F00_thumb70_5F00_689FA89A.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb70" border="0" alt="image_thumb70" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5287.image_5F00_thumb70_5F00_thumb_5F00_31E24D96.png" width="244" height="64" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We enter part of the name and it shows all types that match with the search. On the same way, we can use &lt;strong&gt;Shift-Alt-T&lt;/strong&gt; to go to a symbol or &lt;strong&gt;Ctrl-Shift-T&lt;/strong&gt; to go to a file. The search is done in all solution’s files. The navigation between members of a class can be done with &lt;strong&gt;Alt-`&lt;/strong&gt;. You can go to the previous or next member with &lt;strong&gt;Alt-Up&lt;/strong&gt; or &lt;strong&gt;Alt-Down&lt;/strong&gt;. If you want, you can even go to a decompiled .net code. ReSharper has a decompiler that decompiles the code and allows navigating to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0361.image_5F00_thumb85_5F00_7E39E137.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb85" border="0" alt="image_thumb85" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4848.image_5F00_thumb85_5F00_thumb_5F00_07466CB9.png" width="361" height="294" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Misc utilities&lt;/h2&gt;

&lt;p&gt;You have many othere goodies in ReSharper. You have a unit test runner, where you can run your unit tests. You may be thinking that Visual Studio already has a test runner, but the one VS has runs only MSTest tests. ReSharper runner works with MSTests, NUnit, QUnit or xUnit. One other interesting functionality is the Explore Stack Trace. You have an exception stack trace that comes from any source. You can copy the stack trace to the clipboard and, in Visual Studio, use &lt;strong&gt;Ctrl-E-T&lt;/strong&gt;. The stack trace is shown with links to your code, so you can go to the place where the exception occurred.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6318.image_5F00_thumb83_5F00_40E906A3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb83" border="0" alt="image_thumb83" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4263.image_5F00_thumb83_5F00_thumb_5F00_412589D8.png" width="366" height="366" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;This is just part of the functionality offered by ReSharper, there is much more to explore, but I leave that for you. This is a paid tool, but you can download a 30 days trial version in &lt;a title="http://www.jetbrains.com/resharper/download/index.html" href="http://www.jetbrains.com/resharper/download/index.html"&gt;http://www.jetbrains.com/resharper/download/index.html&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I really think this is an indispensable tool for everyone who develops with Visual Studio, I just have a point against it: it is really addictive and once you get used to using ReSharper, it’s very difficult to develop without it. &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8054.wlEmoticon_2D00_smile_5F00_24C821EB.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1806099" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/WiopArTnJ7c" height="1" width="1"/&gt;</description><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/02/17/resharper-productivity-tool-for-visual-studio.aspx</feedburner:origLink></item><item><title>Recursos para aprendizado de Windows Phone 7</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/xitCgDex_eY/recursos-para-aprendizado-de-windows-phone-7.aspx</link><pubDate>Fri, 10 Feb 2012 09:10:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805864</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1805864</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/02/10/recursos-para-aprendizado-de-windows-phone-7.aspx#comments</comments><description>&lt;p&gt;Ontem (9/2/2012) apresentei uma palestra na &lt;a href="http://www.campus-party.com.br/2012/index.html"&gt;Campus Party 2012&lt;/a&gt; e, ao final da palestra, mostrei uma s&amp;eacute;rie de recursos para aprendizado desta plataforma. Estou repetindo aqui, para que voc&amp;ecirc;s possam verificar a quantidade dispon&amp;iacute;vel e aprender a desenvolver para Winddows Phone.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows SDK and Tools - &lt;a href="http://create.msdn.com"&gt;http://create.msdn.com&lt;/a&gt; &amp;ndash; Ponto de partida do AppHub, onde voc&amp;ecirc; pode baixar gratuitamente todas as ferramentas para desenvolver para Windows Phone&lt;/li&gt;
&lt;li&gt;Windows Phone 7 Developer Portal - &lt;a href="http://bit.ly/tIPZK3"&gt;http://bit.ly/tIPZK3&lt;/a&gt; &amp;ndash; Portal de desenvolvimento do Windows Phone, com in&amp;uacute;meros recursos. Vale a pena come&amp;ccedil;ar com o Getting Started, onde h&amp;aacute; links para artigos, blogs e v&amp;iacute;deos &lt;/li&gt;
&lt;li&gt;Windows Phone 7 Training Kit - &lt;a href="http://bit.ly/uKo8Fg"&gt;http://bit.ly/uKo8Fg&lt;/a&gt; &amp;ndash; Link para download do training kit, contendo programas, exerc&amp;iacute;cios para iniciar o aprendizado na pr&amp;aacute;tica&lt;/li&gt;
&lt;li&gt;Livro Windows Phone 7 Development &amp;ndash; Charles Petzold - &lt;a href="http://charlespetzold.com/phone/index.html"&gt;http://charlespetzold.com/phone/index.html&lt;/a&gt; &amp;ndash; Livro de 1000 p&amp;aacute;ginas para download gratuito sobre desenvolvimento de Windows Phone&lt;/li&gt;
&lt;li&gt;Videos Windows Phone 7 JumpStart - &lt;a href="http://bit.ly/wp7jumpstart"&gt;http://bit.ly/wp7jumpstart&lt;/a&gt; &amp;ndash; Curso em v&amp;iacute;deo com quase 20 horas sobre desenvolvimento para Windows Phone&lt;/li&gt;
&lt;li&gt;Portal de Windows Phone da Microsoft em portugu&amp;ecirc;s - &lt;a href="http://bit.ly/yxE8Po" title="http://bit.ly/yxE8Po"&gt;http://bit.ly/yxE8Po&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todos estes recursos s&amp;atilde;o gratuitos, voc&amp;ecirc;s n&amp;atilde;o tem desculpas para n&amp;atilde;o come&amp;ccedil;ar a aprender j&amp;aacute;!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1805864" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/xitCgDex_eY" height="1" width="1"/&gt;</description><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/02/10/recursos-para-aprendizado-de-windows-phone-7.aspx</feedburner:origLink></item><item><title>Animating transitions in WPF/Silverlight–Part IV–Behaviors</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/IQa9ZKhBpBM/animating-transitions-in-wpf-silverlight-part-iv-behaviors.aspx</link><pubDate>Thu, 09 Feb 2012 10:45:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805824</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1805824</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/02/09/animating-transitions-in-wpf-silverlight-part-iv-behaviors.aspx#comments</comments><description>&lt;p&gt;On the &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/02/08/animating-transitions-in-wpf-silverlight-part-iii-visual-states.aspx"&gt;last post&lt;/a&gt;, I’ve shown how we can animate transitions using Blend and Visual States. An important part in that mechanism is the use of behaviors. With behaviors, we can execute very complex actions, just by dragging a behavior into a window component. That’s very powerful and brings other benefits:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It’s reutilizable. We can include the same behavior in many different situations.&lt;/li&gt;    &lt;li&gt;Allow that designers can include functionality in the design with no code.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We have two kinds of behaviors:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Actions – they execute an action associated to an event. For example, you can create an Action that, associated to a Textbox, “clicks” for every keystroke, or another action that makes the element below the mouse pointer grow.&lt;/li&gt;    &lt;li&gt;Full behaviors – in this case, there is a more complex behavior, not necessarily associated to a trigger. One example is the MouseDragElementBehavior, that allows a dragging an element using the mouse.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Blend has predefined behaviors of the two kinds, with the end of the name telling its type (like in CallMethodAction or FluidMoveBehavior).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5314.image_5F00_thumb_5F00_1C62633C.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image_thumb" border="0" alt="image_thumb" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5277.image_5F00_thumb_5F00_thumb_5F00_41137AB3.png" width="241" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can add new behaviors by searching the Blend gallery, at &lt;a href="http://gallery.expression.microsoft.com"&gt;http://gallery.expression.microsoft.com&lt;/a&gt; (last time I’ve checked, there were 114 behaviors available there). &lt;/p&gt;  &lt;p&gt;Behaviors are associated to an object and can have additional properties, beyond the trigger that activates them. For example, the GoToStateAction has the target component, the state to be activated and the boolean property UseTransitions as additional properties.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3058.image_5F00_09E9ECBA.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4578.image_5F00_thumb_5F00_6FA98395.png" width="220" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can set the action’s properties and can also specify conditions for activate it. For example, when on the project from the &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/02/08/animating-transitions-in-wpf-silverlight-part-iii-visual-states.aspx"&gt;previous post&lt;/a&gt;, we can use a checkbox to allow the transition activation. For that, we must click on the “+” button in front of Condition List, click on the advanced properties button from the condition and create a data binding with the checkbox’s property &lt;strong&gt;IsChecked&lt;/strong&gt;. This way, the animation will only be triggered if the checkbox is checked.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5123.image_5F00_34E1DABF.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3324.image_5F00_thumb_5F00_534C1BA8.png" width="224" height="485" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If the predefined actions don’t do what we want, we can create custom actions to it. On the previous post, we use standard actions, but we had to create the Visual States. And we have another inconvenience: if we want to do animations that go up or down, we must create new Visual States. That way, we will create our action to do what we want, with no need of any special configuration.&lt;/p&gt;  &lt;p&gt;On Visual Studio, create a new WPF project. We will add our Action to the project. Visual Studio, by default, doesn’t have the template to create actions. We could do that using Blend: after opening the project in Blend and selecting the Project panel, you can click it with the right button and select Add New Item and add an Action to the project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1207.image_5F00_thumb4_5F00_4A0FE067.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image_thumb4" border="0" alt="image_thumb4" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7851.image_5F00_thumb4_5F00_thumb_5F00_687A2150.png" width="225" height="244" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Another way to do it is to use the Visual Studio online templates. On Visual Studio’s Solution Explorer, click with the right mouse button in the project and select &lt;em&gt;Add New Item&lt;/em&gt;. Then go to &lt;em&gt;Online Templates&lt;/em&gt; and fill the search box with &lt;em&gt;action&lt;/em&gt;. Select the &lt;strong&gt;C# Action Template for WPF&lt;/strong&gt; template and give it the &lt;em&gt;TransitionControlAction&lt;/em&gt; name.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6761.image_5F00_thumb7_5F00_6D102C0A.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image_thumb7" border="0" alt="image_thumb7" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2043.image_5F00_thumb7_5F00_thumb_5F00_1C1267E2.png" width="416" height="289" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The template adds a reference to &lt;em&gt;System.Windows.Interactivity&lt;/em&gt; and creates a class similar to this code:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:91420db8-bda2-4aa6-a4b5-b11a4df57d50" class="wlWriterSmartContent"&gt;   &lt;pre style="background-color:white;width:853px;height:565px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Text;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Controls;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Data;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Documents;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Input;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Media;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Media.Imaging;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Shapes;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Interactivity;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; WpfApplication4
{
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; If you want your Action to target elements other than its parent, extend your class
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; from TargetedTriggerAction instead of from TriggerAction
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; TransitionControlAction : TriggerAction&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DependencyObject&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; TransitionControlAction()
        {
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Insert code required on object creation below this point.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;        }

        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Invoke(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; o)
        {
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Insert code that defines what the Action will do when triggered/invoked.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;        }
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We have two action types: &lt;strong&gt;TriggerAction&lt;/strong&gt; and &lt;strong&gt;TargetedTriggerAction&lt;/strong&gt;. &lt;strong&gt;TriggerAction&lt;/strong&gt; is an action that doesn’t act on another control. For example, if we want to create an action that starts Notepad when something happens, we would use a &lt;strong&gt;TriggerAction&lt;/strong&gt;. &lt;strong&gt;TargetedTriggerAction&lt;/strong&gt; makes reference to another element, called &lt;strong&gt;Target&lt;/strong&gt;. This element is a property of the action and can be accessed in Blend.&lt;/p&gt;

&lt;p&gt;We will create a &lt;strong&gt;TargetedTriggerAction&lt;/strong&gt;. For that, we must change the class declaration to inherit from &lt;strong&gt;TargetedTriggerAction&lt;/strong&gt;, like it’s shown in the comment in the beginning of the file. This action will execute the same code we’ve created on the &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx"&gt;first post&lt;/a&gt; to do the animation. We must also change the kind of object where it will be acting. We will use the &lt;strong&gt;FrameworkElement&lt;/strong&gt;, because it has the properties &lt;strong&gt;ActualWidth&lt;/strong&gt; and &lt;strong&gt;ActualHeight&lt;/strong&gt;, which we will need.&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a16d03a3-720a-4b4b-90af-d5b6a20fb5e1" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:853px;height:43px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; TransitionControlAction : TargetedTriggerAction&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;FrameworkElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We will begin creating the enumeration for the animation kind and two DependencyProperties, the kind of animation we want and its duration. That way, these properties will be available in Blend.&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:987328e8-855c-47fa-9927-86ac60035b35" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:973px;height:495px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;public enum AnimationKind
{
    Right,
    Left,
    Up,
    Down
}

[Category(&amp;quot;Common Properties&amp;quot;)]
public AnimationKind AnimationKind
{
    get { return (AnimationKind)GetValue(AnimationKindProperty); }
    set { SetValue(AnimationKindProperty, value); }
}

public static readonly DependencyProperty AnimationKindProperty =
    DependencyProperty.Register(&amp;quot;AnimationKind&amp;quot;, typeof(AnimationKind), typeof(TransitionControlAction));


[Category(&amp;quot;Common Properties&amp;quot;)]
public TimeSpan Duration
{
    get { return (TimeSpan)GetValue(DurationProperty); }
    set { SetValue(DurationProperty, value); }
}

public static readonly DependencyProperty DurationProperty =
    DependencyProperty.Register(&amp;quot;Duration&amp;quot;, typeof(TimeSpan), typeof(TransitionControlAction), 
    new UIPropertyMetadata(TimeSpan.FromMilliseconds(500)));

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We have added the &lt;strong&gt;Category&lt;/strong&gt; attribute to the properties &lt;strong&gt;AnimationKind&lt;/strong&gt; and &lt;strong&gt;Duration&lt;/strong&gt;, so they can appear in the &lt;em&gt;Common Properties &lt;/em&gt;group. When we compile the project and open it in Blend, we can see that our Action appears in the Assets panel&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6521.image_5F00_thumb8_5F00_672562A4.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image_thumb8" border="0" alt="image_thumb8" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8475.image_5F00_thumb8_5F00_thumb_5F00_4BA060A1.png" width="359" height="289" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we drag a &lt;strong&gt;TransitionControlAction&lt;/strong&gt; to a button, its properties appear in the property editor:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2577.image_5F00_0C7F3046.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0550.image_5F00_thumb_5F00_78F1D0A4.png" width="249" height="352" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our action still doesn’t do anything. To do something, we must override the action’s &lt;strong&gt;Invoke&lt;/strong&gt; method, adding the code that should be executed. We will use the code that we’ve created on the first post, modifying it to use the Target control:&lt;/p&gt;

&lt;p&gt;
  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:110675a9-7e64-4290-8745-13b26546397c" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:973px;height:432px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;private void AnimateControl(FrameworkElement control, TimeSpan duration, AnimationKind kind)
{
    double xFinal = 0;
    double yFinal = 0;
    if (kind == AnimationKind.Left)
        xFinal = -control.ActualWidth;
    else if (kind == AnimationKind.Right)
        xFinal = control.ActualWidth;
    else if (kind == AnimationKind.Up)
        yFinal = -control.ActualHeight;
    else if (kind == AnimationKind.Down)
        yFinal = control.ActualHeight;
    var translate = new TranslateTransform(0, 0);
    control.RenderTransform = translate;
    if (kind == AnimationKind.Left || kind == AnimationKind.Right)
    {
        var da = new DoubleAnimation(0, xFinal, new Duration(duration));
        translate.BeginAnimation(TranslateTransform.XProperty, da);
    }
    else
    {
        var da = new DoubleAnimation(0, yFinal, new Duration(duration));
        translate.BeginAnimation(TranslateTransform.YProperty, da);
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Finally, we must only call the method &lt;strong&gt;AnimateControl &lt;/strong&gt;from the &lt;strong&gt;Invoke &lt;/strong&gt;method:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:3e4b3c8f-d695-471b-9577-3901c6824e11" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:973px;height:74px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;protected override void Invoke(object o)
{
    AnimateControl(Target, Duration, AnimationKind);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With that, our behavior is finished. We can add the project in Blend, drag the action to the button, set the &lt;strong&gt;Target&lt;/strong&gt; object to the grid and execute the project. When we click the button, the grid makes an animated transition on the selected direction. We don’t need to do anything else, the action is ready to be executed.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6204.image_5F00_1DA2E81C.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4186.image_5F00_thumb_5F00_465E4D65.png" width="434" height="326" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;It’s been a long journey till here. We saw four different ways to animate the transition, we started from code and ended using the same code. On the middle of the way, we saw many new concepts: move from fixed code to a more flexible, refactored code, use components for transitions, eliminate code behind using the MVVM pattern, use NuGet, implicit templates, using Visual States to create animations with no code and, finally, behaviors to create actions that can be used by designers, in a flexible way, with no code. I hope you have enjoyed it!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1805824" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/IQa9ZKhBpBM" height="1" width="1"/&gt;</description><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/02/09/animating-transitions-in-wpf-silverlight-part-iv-behaviors.aspx</feedburner:origLink></item><item><title>Animating transitions in WPF/Silverlight–Part III–Visual States</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/eMSerlQvS1c/animating-transitions-in-wpf-silverlight-part-iii-visual-states.aspx</link><pubDate>Wed, 08 Feb 2012 18:31:22 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805765</guid><dc:creator>bsonnino</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1805765</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/02/08/animating-transitions-in-wpf-silverlight-part-iii-visual-states.aspx#comments</comments><description>&lt;p&gt;On the two last posts, I’ve showed how to animate a transition using code. The &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx"&gt;first post&lt;/a&gt; showed how to animate the transition using code behind, creating the animation using code. The &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/02/07/animating-transitions-in-wpf-silverlight-part-ii-using-components.aspx"&gt;second post&lt;/a&gt; showed how to use components to ease these transitions. Although the use of components is a good alternative to create the animations using code, it still has some disadvantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You must add a reference to the component assembly or include its code in the project &lt;/li&gt;    &lt;li&gt;It can have bugs – there may be many users of the components, but they still may have bugs. If they are open source with code available, you can still debug it, but is not always easy to debug such a component. &lt;/li&gt;    &lt;li&gt;It can be outdated. With new versions of WPF and Silverlight, an old component may not work in the new versions. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So, we will see a new option to animate the transitions, with no code. You may be asking : “How is that, no code?”. Yes, WPF 4 (or 3.5, using the WPF Toolkit) and Silverlight have a resource that don’t need C# or VB code to animate transitions: Visual States. With Visual States, you define the state of your control in many situations and change between them with no need of code. Everything is done in XAML.&lt;/p&gt;  &lt;p&gt;For this project, we won’t use Visual Studio. The creation of Visual States is easier in Blend. Open Blend and create a new WPF project.&lt;/p&gt;  &lt;p&gt;In this project, add a row in the main grid, at the bottom of the window with 40 pixels of height. On this row, add a button with the property &lt;strong&gt;Content&lt;/strong&gt; set to &lt;em&gt;Hide&lt;/em&gt;. On the top row of the grid, add another grid, with red background. On the project panel choose the States tab. It should be empty.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4857.image_5F00_thumb_5F00_284101A2.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb" border="0" alt="image_thumb" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1057.image_5F00_thumb_5F00_thumb_5F00_350B31F3.png" width="276" height="275" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Click on the first button on the top toolbar in the tab to add a new group state. Change its name to &lt;strong&gt;GridStates&lt;/strong&gt;. Click on the second button of the GridStates toolbar to add a new state and change its name to &lt;strong&gt;Visible&lt;/strong&gt;. Add another state and change its name to &lt;strong&gt;Hidden&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;You should note that the default transition time (shown in front of the Default Transition text) is 0s.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3056.image_5F00_42419539.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5023.image_5F00_thumb_5F00_2BBED0E5.png" width="275" height="186" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Change this time to 1. Also change the Easing Function to CubicInOut, clicking the second button.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8802.image_5F00_4080A398.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0310.image_5F00_thumb_5F00_4A851EF6.png" width="454" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Looking at the image above, you can see we are in recording mode, recording the &lt;strong&gt;Hidden&lt;/strong&gt; state. When we select a state in the states panel, all changes that we make in the layout are recorded for this state. So, we can change the appearance of our controls just by switching states. The state &lt;strong&gt;Visible&lt;/strong&gt; is our default state. On the &lt;strong&gt;Hidden&lt;/strong&gt; state we will hide our grid. The transition is done when we change from one state to another.&lt;/p&gt;  &lt;p&gt;Select the grid and change the property &lt;strong&gt;RenderTransform&lt;/strong&gt; X to –625, the property &lt;strong&gt;Opacity&lt;/strong&gt; to 0 and the property &lt;strong&gt;Visibility&lt;/strong&gt; to &lt;em&gt;Collapsed&lt;/em&gt;. That way, the grid will move to the left, while it’s made transparent. Our states are ready. We could change between states using code behind, with this code on the button click event:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:e62f6933-673d-41f3-97de-610b45a43b0e" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:895px;height:79px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;private void button_Click(object sender, System.Windows.RoutedEventArgs e)
{
  VisualStateManager.GoToElementState(LayoutRoot, &amp;quot;Hidden&amp;quot;, true);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But that way, we would be on the same situation of the previous post, with code behind. Besides that, I have said that we would not use code!&lt;/p&gt;

&lt;p&gt;Blend has a very interesting resource to execute actions with no code: Behaviors. Behaviors are custom actions that act on the components, with no need of code to execute them (in fact, someone needs to write code to create a behavior, but once it’s created, you just need to drag it to a component to use it). Blend comes with many predefined behaviors. To use them you should go to the &lt;strong&gt;Assets&lt;/strong&gt; panel and select the &lt;strong&gt;Behaviors&lt;/strong&gt; option.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8640.image_5F00_thumb11_5F00_115E1C27.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb1[1]" border="0" alt="image_thumb1[1]" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3630.image_5F00_thumb11_5F00_thumb_5F00_09FF0A22.png" width="303" height="302" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will use the &lt;strong&gt;GoToStateAction&lt;/strong&gt; behavior. We drag this behavior to a component, then set the event that will trigger it and what is the new state that must be set when the event is triggered. Select the &lt;strong&gt;GoToStateAction&lt;/strong&gt; and drag it to the button. A &lt;strong&gt;GoToStateAction&lt;/strong&gt; is added to the button on the object inspector.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6683.image_5F00_thumb21_5F00_487431FB.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb2[1]" border="0" alt="image_thumb2[1]" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5707.image_5F00_thumb21_5F00_thumb_5F00_124293DF.png" width="303" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the property editor we will configure the action.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0310.image_5F00_thumb3_5F00_130AD3FC.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb3" border="0" alt="image_thumb3" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2273.image_5F00_thumb3_5F00_thumb_5F00_372008BE.png" width="207" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The trigger is already set: we want to activate the action when the button &lt;strong&gt;Click&lt;/strong&gt; event is triggered. We must only set the state we want to select when the button is clicked. For that, we must set the &lt;strong&gt;StateName&lt;/strong&gt; property to &lt;em&gt;Hidden.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6153.image_5F00_76D9C976.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5824.image_5F00_thumb_5F00_6B808F6C.png" width="204" height="314" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our application is ready. When we execute it and click on the button, the transition occurs and moves the grid to outside. And all that with no lines of code!&lt;/p&gt;

&lt;p&gt;We will make a small change to give more functionality to our application. Change the editor visualization to Split by clicking on the third button of view change.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4834.image_5F00_25CBDF81.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7713.image_5F00_thumb_5F00_191DE6CB.png" width="570" height="358" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that, we can change the XAML code directly and change our button. We want it to be a &lt;strong&gt;ToggleButton&lt;/strong&gt;. For that you must change the XAML component, changing its type from &lt;strong&gt;Button&lt;/strong&gt; to &lt;strong&gt;ToggleButton&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:f69f4111-3557-43ab-816b-864ffa887ff0" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:895px;height:148px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ToggleButton &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Content&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Hide&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
    VerticalAlignment&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;65&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Height&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;25&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;i:EventTrigger &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;EventName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ei:GoToStateAction &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;StateName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Hidden&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;i:EventTrigger&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ToggleButton&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;ToggleButton&lt;/strong&gt; may be checked or not. We will show the &lt;em&gt;Hidden&lt;/em&gt; state when it’s checked and the &lt;em&gt;Visible &lt;/em&gt;state when it’s unchecked&lt;em&gt;. &lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We must change the event that activates the &lt;em&gt;Hidden &lt;/em&gt;state. On the object inspector, select the &lt;strong&gt;GoToStateAction&lt;/strong&gt; and change the property&amp;#160; &lt;strong&gt;EventName&lt;/strong&gt; to &lt;em&gt;Checked&lt;/em&gt;. On the Assets tab, select another &lt;strong&gt;GoToStateAction&lt;/strong&gt; and drag it to the button. Set the property &lt;strong&gt;EventName&lt;/strong&gt; to&amp;#160; &lt;em&gt;Unchecked&lt;/em&gt; and the property &lt;strong&gt;StateName&lt;/strong&gt; to &lt;em&gt;Visible&lt;/em&gt;. Run the program.&lt;/p&gt;

&lt;p&gt;Now we have an animation to hide the grid when the button is checked and another to show the grid when the button is unchecked. Easy, no?&lt;/p&gt;

&lt;p&gt;Here we could see the amount of resources we have available to create states and make them active. Everything is done visually, with no need of code. We still haven’t finished our journey, we still have other ways to animate transitions, but that is a subject for another post. See you there!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1805765" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/eMSerlQvS1c" height="1" width="1"/&gt;</description><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/02/08/animating-transitions-in-wpf-silverlight-part-iii-visual-states.aspx</feedburner:origLink></item><item><title>Animating transitions in WPF/Silverlight–Part II–Using Components</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/qMKBg01Jxkg/animating-transitions-in-wpf-silverlight-part-ii-using-components.aspx</link><pubDate>Tue, 07 Feb 2012 11:37:30 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805706</guid><dc:creator>bsonnino</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1805706</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/02/07/animating-transitions-in-wpf-silverlight-part-ii-using-components.aspx#comments</comments><description>&lt;p&gt;In the &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx"&gt;last post&lt;/a&gt; we saw how to animate a transition using code. As I said, I don’t think that is the best solution, because we must use code behind, something not easy to maintain. We could refactor code, creating a new class for the animation and use it. That would bring a little more separation, but we would have to still use code behind.&lt;/p&gt;  &lt;p&gt;In this second part, we will use a different approach: third party components. We can use several components, like Kevin Bag-O-Tricks (&lt;a title="https://github.com/thinkpixellab/bot" href="https://github.com/thinkpixellab/bot"&gt;https://github.com/thinkpixellab/bot&lt;/a&gt;), FluidKit (&lt;a href="http://fluidkit.com"&gt;http://fluidkit.com&lt;/a&gt;), Silverlight Toolkit (&lt;a href="http://silverlight.codeplex.com"&gt;http://silverlight.codeplex.com&lt;/a&gt; – only for Silverlight), or Transitionals (&lt;a href="http://transitionals.codeplex.com"&gt;http://transitionals.codeplex.com&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;We will use here Transitionals, for WPF. If we want to do animations for Silverlight, we should choose another component. Its use is very simple: after downloading the component and adding a reference in the project to the Transitionals.dll assembly, we must add a TransitionElement component in the place where we want the animation, configure the animation and add a content to the component. When the content is changed, the transition is activated.&lt;/p&gt;  &lt;p&gt;Let’s create our transition project. Create a new WPF project and add a reference to Transitionals.dll. Then, add a TransitionElement to the main grid:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a3c96035-7444-4ad2-9f35-350dfffa7cf4" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:821px;height:212px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RowDefinition Height&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;*&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RowDefinition Height&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;40&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement x:Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TransitionBox&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transt:TranslateTransition  StartPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; EndPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0:0:1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Button Width&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;65&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Content&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Hide&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;5&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Click&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Button_Click&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We must declare the namespaces for the TransitionElement and for the TranslateTransition in the main window:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:c9def6d2-d14f-49a8-8392-01d853f315f8" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:853px;height:134px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Window x:Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WpfApplication2.MainWindow&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:x&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:transc&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clr-namespace:Transitionals.Controls;assembly=Transitionals&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:transt&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clr-namespace:Transitionals.Transitions;assembly=Transitionals&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Title&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;MainWindow&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Height&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;350&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Width&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;525&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The next step is to add content to the TransitionElement:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:b7a0b246-5257-4f31-a751-7d6a73e9ecc9" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:853px;height:134px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement x:Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TransitionBox&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transt:TranslateTransition  StartPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; EndPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0:0:1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid Background&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Red&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The button click event handler changes the content of the TransitionElement and activates the transition:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:790fd78b-e30b-4ee5-97b9-f9c7ad7f71d2" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:853px;height:94px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Button_Click(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, RoutedEventArgs e)
{
    TransitionBox.Content &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Grid() {Background &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Brushes.Blue};
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;That way, the code is simpler, we just need to change the content of the element. Besides that, the Transitionals component has a lot of transition types, and we can set them in many ways. For example, the TranslateTransition has the properties &lt;strong&gt;StartPoint&lt;/strong&gt; and &lt;strong&gt;EndPoint&lt;/strong&gt;, saying where the transition starts and ends. To do it from left to right, &lt;strong&gt;StartPoint&lt;/strong&gt; should be –1,0 and &lt;strong&gt;EndPoint&lt;/strong&gt;, 0,0. From top to bottom, &lt;strong&gt;StartPoint&lt;/strong&gt; should be 0,-1 and &lt;strong&gt;EndPoint&lt;/strong&gt;, 0, 0. We can even do a diagonal transition using 1,1 and 0,0.&lt;/p&gt;

&lt;h3&gt;Eliminating Code Behind&lt;/h3&gt;

&lt;p&gt;One thing that can be improved here is the elimination of code behind, using the MVVM pattern. We will use the MVVM Light framework, that you can get at &lt;a href="http://galasoft.ch"&gt;http://galasoft.ch&lt;/a&gt; or by installing it directly using NuGet, an add-in to Visual Studio to ease download and installation of libraries and tools in Visual Studio. If you still don’t have NuGet, go to &lt;a href="http://nuget.org"&gt;http://nuget.org&lt;/a&gt; and download it.&lt;/p&gt;

&lt;p&gt;Once you have installled NuGet, you can click with the right button in References in the Solution Explorer and select “Manage Nuget Packages”. Fill the search box with “mvvm” and install the MVVM Light package:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6758.image_5F00_thumb2_5F00_34A563E7.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb2" border="0" alt="image_thumb2" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1323.image_5F00_thumb2_5F00_thumb_5F00_1B2D3AE0.png" width="605" height="344" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This installs MVVM Light, adds the required references and creates a folder named ViewModel, with two files, MainViewModel.cs and ViewModelLocator.cs. MainViewModel.cs is the ViewModel related to the main window and ViewModelLocator is a ViewModel locator.&lt;/p&gt;

&lt;p&gt;In MainViewModel.cs you should add a property of type ViewModelBase, which will contain the ViewModel related to the View of the component content:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:4b4f2a69-8f95-4292-bed3-d32ee28a2cb8" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:821px;height:188px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelBase content;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelBase Content
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; content; }
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        conteudo &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
        RaisePropertyChanged(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Content&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Next, we will create two ViewModels, related to our views. The two ViewModels are very similar and have only one property:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:31ecb0da-f0cd-4b22-94a0-a2831814d476" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:821px;height:492px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelA : ViewModelBase
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; text;

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Text
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; text; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        {
            text &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
            RaisePropertyChanged(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Text&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
        }
    }
}

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelB : ViewModelBase
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; text;

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Text
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; text; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        {
            text &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
            RaisePropertyChanged(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Text&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
        }
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then create in the Solution Explorer a folder named View and put there two UserControls, each one with a Grid and a TextBlock:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:27119735-aedc-4ea7-a4c1-fd41e0d8155d" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:821px;height:201px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;UserControl x:Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WpfApplication2.View.ViewA&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
             xmlns&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
             xmlns:x&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
             xmlns:mc&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
             xmlns:d&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/expression/blend/2008&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
             mc:Ignorable&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;d&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
             d:DesignHeight&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;300&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; d:DesignWidth&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;300&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid Background&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Red&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TextBlock Text&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{Binding Text}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; FontSize&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;36&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;UserControl&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To eliminate code behind, we must bind the property &lt;strong&gt;Content&lt;/strong&gt; of the TransitionElement with the property &lt;strong&gt;Content&lt;/strong&gt; of the ViewModel:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:809e453c-6f98-4853-bdaf-a5666f14b48e" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:826px;height:88px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement x:Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TransitionBox&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Content&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{Binding Content}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transt:TranslateTransition  StartPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; EndPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0:0:1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and eliminate the button click, replacing it with a &lt;strong&gt;Command&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9f91febc-847b-4f14-ad2c-c587d61b24bf" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:895px;height:20px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Button Width&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;65&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Content&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Esconde&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;5&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Command&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{Binding HideCommand}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;HideCommand &lt;/strong&gt;property is defined in &lt;strong&gt;MainViewModel&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:77d2157d-7c84-4ee7-a404-ebba1ba2f112" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:895px;height:207px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ICommand hideCommand;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ICommand HideCommand
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; hideCommand &lt;/span&gt;&lt;span style="color:#000000;"&gt;??&lt;/span&gt;&lt;span style="color:#000000;"&gt; (hideCommand &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; RelayCommand(ChangeContent)); }
}

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ChangeContent()
{
    Content &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; content &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;is&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelA &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        (ViewModelBase)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelB() {Text &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ViewModel B&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} : 
        (ViewModelBase)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelA() {Text &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt; ViewModel A&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;};
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally we must set the DataContext for the main View:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:c202a6c7-5e2d-4272-a15e-4474b5ce5515" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:853px;height:153px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Window x:Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WpfApplication2.MainWindow&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:x&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:transc&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clr-namespace:Transitionals.Controls;assembly=Transitionals&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:transt&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clr-namespace:Transitionals.Transitions;assembly=Transitionals&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        Title&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;MainWindow&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Height&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;350&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Width&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;525&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        DataContext&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{Binding Source={StaticResource Locator}, Path=Main}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When we execute the program we have something similar to this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3247.image_5F00_thumb4_5F00_682D84AB.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb4" border="0" alt="image_thumb4" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0550.image_5F00_thumb4_5F00_thumb_5F00_7BAABE7F.png" width="382" height="258" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The view isn’t shown, just the content’s class name. That is expected, as the property &lt;strong&gt;Content&lt;/strong&gt; is of type &lt;strong&gt;ViewModelBase&lt;/strong&gt; and its presentation is made by the method &lt;strong&gt;ToString()&lt;/strong&gt;. We could have put the view as content, but this goes against the MVVM pattern: the ViewModel must not know about the View. A solution to show the View using the ViewModel as content is to use a resource available in WPF or in Silverlight 5: implicit Data Templates. In an implicit DataTemplate, we don’t set the &lt;strong&gt;Key&lt;/strong&gt; property when declaring the Template, we only set its &lt;strong&gt;DataType&lt;/strong&gt;. With that, WPF and Silverlight use this DataTemplate every time they must render some content of that type.&lt;/p&gt;

&lt;p&gt;We declare the DataTemplates in the Windows’s resources section:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:ecefd076-ef81-4005-918c-01e7b0bd208d" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:853px;height:157px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataTemplate DataType&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{x:Type ViewModel:ViewModelA}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;View:ViewA &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataTemplate DataType&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{x:Type ViewModel:ViewModelB}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;View:ViewB &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now, when we execute the program, we have the transition between the two views, with no code behind.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7652.image_5F00_thumb6_5F00_4F218E99.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb6" border="0" alt="image_thumb6" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6646.image_5F00_thumb6_5F00_thumb_5F00_06879FC8.png" width="455" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;When we use components to animate transitions, we have the possiblity to create very complex transitions in an easy way, we only have to change the content of the control.&lt;/p&gt;

&lt;p&gt;We also saw how to remove code from the code behind, adding it to a ViewModel, making it easier to maintain and allowing better testability. As a bonus, we saw how to use implicit DataTemplates and how to relate a View to a ViewModel with no need of code. This resource is only available on WPF and Silverlight 5. &lt;/p&gt;

&lt;p&gt;Although you can think it doesn’t worth the effort (we eliminated just one line of code, trading it with two ViewModels, two Views and a new MVVM component), my intent here was to show you other resources, like using MVVM instead of code behind and how to use new features, like the implicit DataTemplate. In a larger application, that requires more work, these changes are justified.&lt;/p&gt;

&lt;p&gt;These are not the only ways to do control transitions. On the next articles, we will see other ways. See you then!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1805706" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/qMKBg01Jxkg" height="1" width="1"/&gt;</description><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/02/07/animating-transitions-in-wpf-silverlight-part-ii-using-components.aspx</feedburner:origLink></item><item><title>ReSharper–Ferramenta de produtividade para o Visual Studio</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/trvV5dU1jpw/resharper-ferramenta-de-produtividade-para-o-visual-studio.aspx</link><pubDate>Sun, 05 Feb 2012 16:39:35 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805653</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1805653</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/02/05/resharper-ferramenta-de-produtividade-para-o-visual-studio.aspx#comments</comments><description>&lt;p&gt;Um dos benefícios indiretos de ser um MVP é que muitos produtores de ferramentas ou componentes cedem cópias de seus produtos para os MVPs para uso pessoal, para que possam usar, avaliar e, eventualmente, recomendar.&lt;/p&gt;  &lt;p&gt;Eu uso muitas dessas ferramentas no meu dia a dia, e gosto muito delas. Assim, nada mais justo que fazer um post sobre elas e como elas ajudam meu dia-a-dia.&lt;/p&gt;  &lt;p&gt;Sem dúvida, a ferramenta que eu mais uso é o ReSharper (&lt;a title="http://www.jetbrains.com/resharper/" href="http://www.jetbrains.com/resharper/"&gt;http://www.jetbrains.com/resharper/&lt;/a&gt;), um add-in para o Visual Studio para aumentar sua produtividade. Ao usar o Visual Studio, ela está sempre lá, ativa, me ajudando a escrever o código.&lt;/p&gt;  &lt;h2&gt;Análise de código&lt;/h2&gt;  &lt;p&gt;Ao abrir um projeto, o ReSharper analisa seu código e começa a dar sugestões para melhorá-lo. Abrindo um projeto console, já vemos o seguinte no editor:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0250.image_5F00_5D48A177.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0285.image_5F00_thumb_5F00_3BE8FBDB.png" width="666" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Do lado direito, é adicionada uma barra com as indicações de ajuda para seu código. O quadrado amarelo mostra que há avisos para melhoria de código. Se houver erros de compilação, o quadrado fica vermelho e, se seu código estiver ok, o quadrado fica verde. Abaixo do quadrado, estão linhas com os pontos onde há problemas. Se você passar o mouse sobre estas barras, uma tooltip irá mostrar o problema.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8156.image_5F00_4C80F6C9.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8203.image_5F00_thumb_5F00_1FF7C6E3.png" width="371" height="137" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para corrigir o erro, é muito fácil. É só clicar na barra e o editor é posicionado no local do erro. Uma lâmpada vermelha indica o erro e podemos clicar nela para ver as ações disponíveis. Esta lista pode ser selecionada com &lt;strong&gt;Alt-Enter&lt;/strong&gt;. Aliás, se eu tivesse a possibilidade de escolher um único atalho de teclado para lembrar, seria este. Com o ReSharper e o &lt;strong&gt;Alt-Enter &lt;/strong&gt;o seu código irá melhorar bastante!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2671.image_5F00_04DEF7D5.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8422.image_5F00_thumb_5F00_4364457B.png" width="378" height="208" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Selecionamos a ação desejada e o ReSharper corrige o código (no caso, eliminando as cláusulas &lt;em&gt;using&lt;/em&gt; desnecessárias). Para o erro seguinte, podemos ver que o parâmetro &lt;em&gt;args&lt;/em&gt; de &lt;em&gt;Main&lt;/em&gt; está ém cinza. Isto quer dizer que ele não está sendo usado na função. Quando colocamos o mouse em &lt;em&gt;args&lt;/em&gt; aparece uma pirâmide, mostrando que há um refactoring a ser feito.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6712.image_5F00_656CA141.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6735.image_5F00_thumb_5F00_4002ADD3.png" width="381" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;        &lt;p&gt;Aqui ele irá remover o parâmetro não usado. Além desta mudança, ele irá verificar todos os lugares onde a função é chamada e mudar a chamada a ela. Isto é ótimo quando colocamos um parâmetro e verificamos que ele não é mais necessário e queremos retirá-lo. Se fizermos isso, o código irá quebrar em todos os lugares onde a funçao é chamada. Com este refactoring, as chamadas são alteradas automaticamente. Fazendo esta mudança, nosso código fica ok, como mostra a figura abaixo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3554.image_5F00_1E36D542.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0336.image_5F00_thumb_5F00_3D0D4920.png" width="668" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O ReSharper está constantemente analisando nosso código e verifica a consistência na nomenclatura de variáveis e métodos. Você pode dizer como gosta de nomear os campos, propriedades e métodos e ele irá verificar a consistência para você.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4466.image_5F00_0DDB5D89.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0068.image_5F00_thumb_5F00_6A5EB923.png" width="523" height="393" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Por exemplo, eu gosto de nomear meus campos privados usando CamelCase, iniciados com minúscula (sem um sublinhado antes). Assim, se eu colocar um campo com nomenclatura diferente, o ReSharper irá me avisar e se prontificar para alterar. Nada que um &lt;strong&gt;Alt-Enter&lt;/strong&gt; não resolva. E ele irá mudar todas as referências para essa variável.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3125.image_5F00_409B3E30.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0447.image_5F00_thumb_5F00_786D8253.png" width="579" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Melhoria do código&lt;/h2&gt;  &lt;p&gt;Além da consistência de nomes, ele ainda verifica a qualidade do seu código. Sim, eu sei que seu código (como o meu) é impecável, mas será que dá para melhorar? Veja na figura abaixo, uma aplicação WPF onde implementei o manipulador do evento Click do botão em codigo, com &lt;em&gt;button1.Click += &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2022.image_5F00_36F2CFFA.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6204.image_5F00_thumb_5F00_0A69A014.png" width="579" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O ReSharper mostra dois avisos e um lembrete. O primeiro aviso é sobre &lt;em&gt;MainWindow&lt;/em&gt;. Ele indica que o tipo pai (Window) já foi declarado em outro lugar desta classe parcial e é desnecessário. Devemos lembrar que quando criamos uma janela WPF estamos criando uma classe parcial, declarada em dois lugares: no XAML e no arquivo de code behind. O XAML já declara que &lt;em&gt;MainWindow&lt;/em&gt; é derivado de &lt;em&gt;Window&lt;/em&gt; e podemos tirar esta declaração redundante do code behind. O segundo aviso é devido ao fato que podemos eliminar a criação do delegate ao adicionar o manipulador. O lembrete é para indicar que temos uma exceção de “não implementado”, indicação clara que devemos colocar código ali. Dois &lt;strong&gt;Alt-Enter&lt;/strong&gt; e nosso código fica assim:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8787.image_5F00_08B8D440.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1803.image_5F00_thumb_5F00_1950CF2E.png" width="576" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O ReSharper analisa seu código, verificando possíveis erros e melhorias. Ao digitar este código&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3005.image_5F00_2C9185CD.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7077.image_5F00_thumb_5F00_6F212145.png" width="593" height="296" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vemos na barra lateral um aviso e uma possível melhoria. O aviso indica que &lt;strong&gt;ToString&lt;/strong&gt; é redundante e que devemos especificar uma cultura para a conversão. O fato de ser redundante faz com que ele possa ser eliminado. &lt;strong&gt;Alt-Enter&lt;/strong&gt; e lá se vai ele. A melhoria está no &lt;strong&gt;for&lt;/strong&gt;, indicando que pode ser convertido para uma expressão LINQ. Ao teclar &lt;strong&gt;Alt-Enter&lt;/strong&gt; mais uma vez ficamos com o código assim:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0552.image_5F00_292FEE25.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0523.image_5F00_thumb_5F00_67B53BCB.png" width="591" height="256" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Outras melhorias de código muito comuns são otimização de &lt;em&gt;if&lt;/em&gt; e de &lt;em&gt;return&lt;/em&gt;: quando colocamos um código como&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:0be1ce8e-e3ee-4fd5-b970-99796c818706" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:92px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
  y &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  y &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;o ReSharper otimiza para:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:bb0d6cd5-e512-45c7-af8b-5f7814116eaf" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:27px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;y &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; : &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ou então este código:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9dffe4b6-b07f-4807-9129-e97be14c2454" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:88px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Aqui teríamos duas otimizações: eliminar o &lt;em&gt;else&lt;/em&gt;&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a484a233-7325-4868-8da9-80722d0d7690" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:73px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ou então usar o operador ternário:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:88c8463a-de93-4798-8299-f506d341779e" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:40px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; x &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; : &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Refactoring&lt;/h2&gt;

&lt;p&gt;Mas isto não é tudo o que o ReSharper pode fazer por você. Seus recursos de refactoring e criação de código são fantásticos. Queremos extrair o código do manipulador de eventos para um novo método. Podemos teclar &lt;strong&gt;Ctrl-Shift-R&lt;/strong&gt; (Refactor this) e o ReSharper irá mostrar os refactorings disponíveis.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1524.image_5F00_17FC1082.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5773.image_5F00_thumb_5F00_64BFD718.png" width="439" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecionamos o refactoring de extração de métodos e a seguinte tela é mostrada:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8688.image_5F00_553CC549.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7288.image_5F00_thumb_5F00_2847626E.png" width="464" height="403" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos indicar os parâmetros, o nome da função e seu tipo de retorno. Ao clicar em &lt;em&gt;Next&lt;/em&gt;, obtemos algo como &lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0272.image_5F00_1F0B272D.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3757.image_5F00_thumb_5F00_247997D1.png" width="627" height="331" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Criação de código&lt;/h2&gt;

&lt;p&gt;Podemos ainda inserir código a partir de templates. O ReSharper permite criar templates com código para novos arquivos ou snippets de texto. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8015.image_5F00_7B8E82C7.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1856.image_5F00_thumb_5F00_12D98739.png" width="446" height="437" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Temos três tipos de templates:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Live templates – templates de snippets de código, inseridos como snippets normais do Visual Studio. Para acionar, teclamos o snippet e &lt;em&gt;&amp;lt;tab&amp;gt;&lt;/em&gt; para inserir. Outra maneira de acionar estes templates é usando &lt;strong&gt;Ctrl-E-L&lt;/strong&gt;. Na figura, criei o snippet &lt;strong&gt;propnp&lt;/strong&gt;, que cria uma propriedade com backing field e chama o manipulador de &lt;em&gt;PropertyChanged&lt;/em&gt;&lt;/li&gt;

  &lt;li&gt;Surround templates, que permitem envolver o código selecionado com um template, por exemplo, para envolver o código com &lt;em&gt;try…catch. &lt;/em&gt;Eles são acionados com &lt;strong&gt;Ctrl-E-U.&lt;/strong&gt;&lt;/li&gt;

  &lt;li&gt;File templates – que criam novos arquivos no nosso projeto, como classes, interfaces. Eles são acionados com &lt;strong&gt;Ctrl-Alt-Ins&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos criar uma nova classe em nosso projeto. Teclamos &lt;strong&gt;Ctrl-Alt-Ins&lt;/strong&gt; e criamos uma nova classe. Chamamos de &lt;em&gt;NewClass&lt;/em&gt;. Teclamos &lt;strong&gt;Alt-Ins&lt;/strong&gt; e inserimos o construtor para a classe. Nos parâmetros do construtor colocamos uma dependência:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6758.image_5F00_10BC8870.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3652.image_5F00_thumb_5F00_56CD4583.png" width="480" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que &lt;em&gt;IDependency&lt;/em&gt; está em vermelho, pois não está definida. Teclamos &lt;strong&gt;Alt-Enter&lt;/strong&gt; e as opções mostradas são as seguintes&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4162.image_5F00_207C1D74.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6012.image_5F00_thumb_5F00_1F378495.png" width="356" height="206" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que ele verificou que colocamos o nome do tipo iniciado com I, indicando uma interface e sugere a criação desta. Podemos então criar a interface a partir daqui. Após criar a interface, teclamos &lt;strong&gt;Alt-Enter&lt;/strong&gt; novamente em &lt;em&gt;IDependency &lt;/em&gt;e podemos declarar o campo para guardar a dependência:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2313.image_5F00_320C083F.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1106.image_5F00_thumb_5F00_37E6ABD8.png" width="383" height="258" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A nossa interface foi criada no mesmo arquivo da classe. Podemos ir para sua declaração e teclar &lt;strong&gt;Alt-Enter&lt;/strong&gt;. O ReSharper oferece para movê-la para um arquivo separado. É criado um arquivo &lt;strong&gt;IDependency.cs&lt;/strong&gt; com a interface. Como vocês podem ver, é muito fácil criar e refatorar o código com o ReSharper. Ele facilita também a declaração de variáveis. Por exemplo, ao incluirmos o código&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:f9c0fee8-4912-4689-a883-883f8b4b840a" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:23px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;total &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;no construtor, vemos que &lt;strong&gt;total&lt;/strong&gt; está em vermelho. Teclando &lt;strong&gt;Alt-Enter&lt;/strong&gt;, temos as seguintes opções:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4353.image_5F00_5650ECC1.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5873.image_5F00_thumb_5F00_7931AE71.png" width="384" height="227" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos então criar um campo &lt;strong&gt;total&lt;/strong&gt; no nosso código. Como vimos, temos diversas maneiras de mudar e melhorar nosso código. &lt;/p&gt;

&lt;h2&gt;Auxílio no XAML&lt;/h2&gt;

&lt;p&gt;Mas isso não é tudo. Podemos usar o ReSharper também no XAML, o que facilita bastante. Por exemplo, se criamos um Converter no código:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:61420587-233f-41c1-b0e3-a8d1d80e4cc0" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:218px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; DebugConverter : IValueConverter
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Convert(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; value, Type targetType, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; parameter, CultureInfo culture)
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
    }

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; ConvertBack(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; value, Type targetType, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; parameter, CultureInfo culture)
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Quando queremos usá-lo no XAML devemos seguir uma série de passos: namespace, declaração nos recursos, etc. Para isso, temos algumas facilidades.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7382.image_5F00_3E6A059B.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1067.image_5F00_thumb_5F00_5216EF2F.png" width="662" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teclamos &lt;strong&gt;Alt-Enter&lt;/strong&gt; em &lt;em&gt;DebugConverter&lt;/em&gt; e selecionamos &lt;strong&gt;Create resource in type element &amp;lt;Window&amp;gt;&lt;/strong&gt;. Ele cria a seção &lt;strong&gt;Resources&lt;/strong&gt; e cria o recurso. Colocamos o nome &lt;strong&gt;DebugConverter&lt;/strong&gt;. Não colocamos o namespace. Aparece uma tooltip indicando o namespace&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1411.image_5F00_1B59942B.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2330.image_5F00_thumb_5F00_681D5AC1.png" width="607" height="142" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teclamos &lt;strong&gt;Alt-Enter&lt;/strong&gt; e o namespace é declarado e colocado no elemento. Se não gostarmos do nome do namespace, podemos renomeá-lo com &lt;strong&gt;Ctrl-R-R&lt;/strong&gt;. Pronto, a declaração do converter, o namespace, tudo está pronto, como necessário. Se tivermos um DataContext associado ao componente e ele não tiver uma propriedade chamada &lt;strong&gt;Valor&lt;/strong&gt;, podemos usar o ReSharper para criar esta propriedade na classe do DataContext.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7167.image_5F00_6D1F9870.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7115.image_5F00_thumb_5F00_1DD2A01C.png" width="804" height="201" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Navegação no código&lt;/h2&gt;

&lt;p&gt;O ReSharper possui atalhos para navegação no código, que facilitam muito. Por exemplo, &lt;strong&gt;Ctrl-T&lt;/strong&gt; navega para um tipo. Abre-se uma tela como a seguinte&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7065.image_5F00_5B7F87D8.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0167.image_5F00_thumb_5F00_3A8C1531.png" width="394" height="98" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Digitamos parte do nome e ele mostra os símbolos definidos que casam com a pesquisa. Da mesma maneira, podemos usar &lt;strong&gt;Shift-Alt-T&lt;/strong&gt; para ir para um símbolo ou &lt;strong&gt;Ctrl-Shift-T&lt;/strong&gt; para ir a um arquivo. A pesquisa é feita em todos os arquivos da solução. A navegação entre os membros de uma classe pode ser feita com &lt;strong&gt;Alt-`&lt;/strong&gt;. Você pode ir ao membro anterior ou posterior com &lt;strong&gt;Alt-Up&lt;/strong&gt; ou &lt;strong&gt;Alt-Down&lt;/strong&gt;. Se você quiser, pode até navegar em código .NET descompilado. O ReSharper tem um descompilador que descompila o código e permite navegar até ele.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3247.image_5F00_120D331D.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5153.image_5F00_thumb_5F00_70AD8D80.png" width="355" height="288" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Utilidades diversas&lt;/h2&gt;

&lt;p&gt;Mas isto não é tudo o que o ReSharper oferece. Você tem um unit test runner, onde pode rodar os seus testes unitários. Você pode estar pensando quo o Visual Studio já tem um test runner, mas o que o VS oferece é exclusivo para testes com MSTest. O runner do ReSharper funciona com outros frameworks de teste, como o NUnit, QUnit ou xUnit. Uma outra funcionalidade interessante é o Explore Stack Trace. Você tem o stack trace de uma exceção, obtido através de uma ferramenta de log qualquer. Basta copiar o stack trace para a área de transferência e, no Visual Studio, usar &lt;strong&gt;Ctrl-E-T&lt;/strong&gt;. O stack trace é mostrado com links para o seu código, e você pode assim verificar onde ocorreu a exceção.&lt;/p&gt;



&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3058.image_5F00_7CCF07A7.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6683.image_5F00_thumb_5F00_141A0C19.png" width="425" height="425" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Esta é só parte da funcionalidade oferecida pelo ReSharper, há muito mais para explorar, mas isto eu deixo para vocês. A ferramenta é paga, mas você pode baixar uma versão de avaliação por 30 dias, em &lt;a title="http://www.jetbrains.com/resharper/download/index.html" href="http://www.jetbrains.com/resharper/download/index.html"&gt;http://www.jetbrains.com/resharper/download/index.html&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Em conclusão, eu acho que esta é uma ferramenta indispensável para quem desenvolve com o Visual Studio, e só tenho um ponto contrário: ela é realmente viciante, e uma vez que você se acostuma a usar o Resharper, é muito difícil voltar a desenvolver sem ele &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Alegre" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7585.wlEmoticon_2D00_smile_5F00_29B444B6.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1805653" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/trvV5dU1jpw" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/ReSharper/default.aspx">ReSharper</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/02/05/resharper-ferramenta-de-produtividade-para-o-visual-studio.aspx</feedburner:origLink></item><item><title>Behaviors em Blend</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/3RU5nWshX5Q/behaviors-em-blend.aspx</link><pubDate>Sat, 28 Jan 2012 09:01:42 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805339</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1805339</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/01/28/behaviors-em-blend.aspx#comments</comments><description>&lt;p&gt;No &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/21/animando-transi-231-245-es-em-wpf-silverlight-parte-iv-behaviors.aspx"&gt;post anterior&lt;/a&gt; mostramos os behaviors em Blend e apresentamos os dois tipos de behaviors: Actions e Behaviors.&lt;/p&gt;  &lt;p&gt;Ali, mostramos como criar uma Action, que atua sobre um elemento Target, fazendo uma ação sobre ele. Neste post, iremos mostrar os Behaviors e como podemos criar um behavior para ser usado (e reutilizado) no Blend.&lt;/p&gt;  &lt;p&gt;Um behavior atua sobre um elemento associado e executa uma determinada ação, que não precisa ser sobre outro elemento, pode ser inclusive sobre ele mesmo. Aqui iremos mostrar como criar um behavior para movimentar elementos de uma listbox arrastando e soltando-os na nova posição.&lt;/p&gt;  &lt;p&gt;Antes de iniciar o desenvolvimento do behavior, devemos saber como fazer o Drag &amp;amp; Drop em WPF. Para que um componente possa suportar Drag &amp;amp; Drop, devemos configurar sua propriedade &lt;strong&gt;AllowDrop&lt;/strong&gt; para &lt;em&gt;True&lt;/em&gt;. Em seguida, devemos manipular dois eventos: &lt;strong&gt;DragOver&lt;/strong&gt;, que é ativado quando algo está sendo arrastado sobre o elemento e &lt;strong&gt;Drop&lt;/strong&gt;, quando algo é solto sobre o elemento.&lt;/p&gt;  &lt;p&gt;No evento &lt;strong&gt;DragOver&lt;/strong&gt; devemos dizer qual é o cursor que deve ser apresentado quando há algo sendo arrastado sobre o elemento. Usamos o segundo parâmetro do manipulador de eventos, do tipo &lt;strong&gt;DragEventArgs&lt;/strong&gt;, configurando a propriedade &lt;strong&gt;Effects&lt;/strong&gt; com um código semelhante a este:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:266f8393-e154-4a71-aa17-9c2a1a4f0b50" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:82px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxDragOver(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, DragEventArgs e)
{
  e.Effects &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; DragDropEffects.Move;
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este código faz que o cursor de movimentação seja mostrado. No evento &lt;strong&gt;Drop&lt;/strong&gt; devemos concluir a ação.&lt;/p&gt;

&lt;p&gt;Com esta pequena introdução, podemos criar nosso behavior. Desta vez, iremos iniciar nosso projeto no Blend. Crie um novo projeto WPF, do tipo WPF Application&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0434.image_5F00_2021A92C.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7651.image_5F00_thumb_5F00_7E55D09A.png" width="502" height="460" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em seguida, vá para o menu &lt;em&gt;Project&lt;/em&gt; e selecione &lt;em&gt;Add New Item&lt;/em&gt;, escolhendo a opção &lt;em&gt;Behavior&lt;/em&gt;. Dê o nome de &lt;strong&gt;DragListItemBehavior&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8686.image_5F00_633D018C.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4747.image_5F00_thumb_5F00_4FAFA1EB.png" width="320" height="347" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;O Blend cria um código semelhante ao seguinte:&lt;/p&gt;

&lt;p&gt;
  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:aac4e7c1-6239-4c8b-aa0b-59371a431f7b" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1100px;height:1024px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Text;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Controls;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Data;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Documents;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Input;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Media;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Media.Imaging;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Shapes;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Interactivity;
&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;using Microsoft.Expression.Interactivity.Core;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; WpfApplication5
{
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; DragListItemBehavior : Behavior&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DependencyObject&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  {
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; DragListItemBehavior()
    {
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Insert code required on object creation below this point.

      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The line of code below sets up the relationship between the command and the function
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; to call. Uncomment the below line and add a reference to Microsoft.Expression.Interactions
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; if you choose to use the commented out version of MyFunction and MyCommand instead of
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; creating your own implementation.
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The documentation will provide you with an example of a simple command implementation
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; you can use instead of using ActionCommand and referencing the Interactions assembly.
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;this.MyCommand = new ActionCommand(this.MyFunction);&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    }

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; OnAttached()
    {
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;.OnAttached();

      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Insert code that you would want run when the Behavior is attached to an object.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    }

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; OnDetaching()
    {
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;.OnDetaching();

      &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Insert code that you would want run when the Behavior is removed from an object.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    }

    &lt;/span&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;span style="color:#008000;"&gt;
    public ICommand MyCommand
    {
      get;
      private set;
    }
     
    private void MyFunction()
    {
      // Insert code that defines what the behavior will do when invoked.
    }
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Devemos sobrescrever dois métodos, &lt;strong&gt;OnAttached&lt;/strong&gt; e &lt;strong&gt;OnDetaching&lt;/strong&gt;. No método &lt;strong&gt;OnAttached&lt;/strong&gt; iremos fazer o processo de inicialização do nosso behavior: conectar manipuladores, configurar propriedades, etc. No método &lt;strong&gt;OnDetaching&lt;/strong&gt; fazemos a limpeza do processo.&lt;/p&gt;

&lt;p&gt;Agora que já temos nosso projeto criado, podemos editar seu código no Visual Studio. No painel &lt;em&gt;Projects&lt;/em&gt;, clique com o botão direito do mouse sobre a solução e selecione &lt;em&gt;Edit in Visual Studio&lt;/em&gt;. O projeto é aberto no Visual Studio.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5751.image_5F00_06A98025.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6303.image_5F00_thumb_5F00_375C87D0.png" width="292" height="296" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abra o arquivo do behavior para editá-lo. Queremos que o behavior só atue sobre ListBoxes. Para isto iremos alterar seu tipo:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:033d3ac6-4a84-482d-aa7e-baa228b0f3df" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:40px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; DragListItemBehavior : Behavior&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ListBox&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, devemos colocar, no método &lt;strong&gt;OnAttached&lt;/strong&gt;, o código de inicialização, onde iremos configurar as propriedades e conectar os manipuladores:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:24b70603-26a3-473f-b74f-123783c0e09e" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:170px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; OnAttached()
{
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;.OnAttached();

    AssociatedObject.AllowDrop &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    AssociatedObject.PreviewMouseLeftButtonDown &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxPreviewMouseLeftButtonDown;
    AssociatedObject.DragOver &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxDragOver;
    AssociatedObject.Drop &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxDrop;
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note que conectamos os eventos &lt;strong&gt;DragOver&lt;/strong&gt; e &lt;strong&gt;Drop&lt;/strong&gt;, mas também usamos o evento &lt;strong&gt;PreviewMouseLeftButtonDown&lt;/strong&gt;. Isto é necessário por que iremos iniciar a ação de Drag &amp;amp; Drop quando o usuário clica num item da Listbox. O behavior tem uma propriedade &lt;strong&gt;AssociatedObject&lt;/strong&gt;, que é o objeto associado ao behavior. Como definimos que esse é um &lt;strong&gt;Behavior&amp;lt;ListBox&amp;gt;&lt;/strong&gt;, o &lt;strong&gt;AssociatedObject&lt;/strong&gt; é uma Listbox.&lt;/p&gt;

&lt;p&gt;No método &lt;strong&gt;OnDetaching&lt;/strong&gt; iremos fazer a limpeza:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:74c99540-37dc-4d26-9091-c6050ec4996c" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:155px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; OnDetaching()
{
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;.OnDetaching();

    AssociatedObject.PreviewMouseLeftButtonDown &lt;/span&gt;&lt;span style="color:#000000;"&gt;-=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxPreviewMouseLeftButtonDown;
    AssociatedObject.DragOver &lt;/span&gt;&lt;span style="color:#000000;"&gt;-=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxDragOver;
    AssociatedObject.Drop &lt;/span&gt;&lt;span style="color:#000000;"&gt;-=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxDrop;
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Podemos então criar o código para fazer o Drag &amp;amp; Drop nos manipuladores dos eventos. No evento &lt;strong&gt;PreviewMouseLeftButtonDown&lt;/strong&gt; obtemos o item que foi clicado e iniciamos o processo de Drag &amp;amp; Drop:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:6ecb3695-7876-4c9a-bf7e-b10e00112845" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:169px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; dragItem;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxPreviewMouseLeftButtonDown(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, MouseButtonEventArgs e)
{
    var parent &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ListBox)sender;
    dragItem &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetDataFromListBox(parent, e.GetPosition(parent));

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (dragItem &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        DragDrop.DoDragDrop(parent, dragItem, DragDropEffects.Move);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O método &lt;strong&gt;GetDataFromListBox&lt;/strong&gt; procura na árvore de elementos e retorna o item que foi clicado:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:e701f042-b912-4d7b-a264-2c6b636dd8b0" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:276px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetDataFromListBox(ListBox source, Point point)
{
    var element &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; source.InputHitTest(point) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;as&lt;/span&gt;&lt;span style="color:#000000;"&gt; UIElement;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (element &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; data &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; DependencyProperty.UnsetValue;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt; (data &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; DependencyProperty.UnsetValue)
    {
        data &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; source.ItemContainerGenerator.ItemFromContainer(element);
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (data &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; DependencyProperty.UnsetValue)
            element &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; VisualTreeHelper.GetParent(element) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;as&lt;/span&gt;&lt;span style="color:#000000;"&gt; UIElement;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (element &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; source)
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    }
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; data &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; DependencyProperty.UnsetValue &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; data : &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;No evento &lt;strong&gt;DragOver&lt;/strong&gt; iremos configurar o cursor. Se o Drag &amp;amp; Drop é da própria Listbox, deixamos arrastar, senão configuramos o cursor para &lt;strong&gt;None&lt;/strong&gt;: &lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:226cedea-4f2b-4206-a419-4b39ef8dbf7c" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:85px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxDragOver(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, DragEventArgs e)
{
    e.Effects &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; e.Source &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; DragDropEffects.Move : DragDropEffects.None;
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finalmente, no evento &lt;strong&gt;Drop&lt;/strong&gt; fazemos a movimentação do item arrastado:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:0ff795e9-4d09-4d79-8732-2ce4ce414015" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:1024px;height:220px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ListboxDrop(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, DragEventArgs e)
{
    var parent &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ListBox)sender;
    var dropItem &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetDataFromListBox(parent, e.GetPosition(parent));
    var dragItemIndex &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; parent.Items.IndexOf(dragItem);
    var dropItemIndex &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dropItem &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; parent.Items.Count &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; : parent.Items.IndexOf(dropItem);
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (dragItemIndex &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dropItemIndex)
    {
        parent.Items.RemoveAt(dragItemIndex);
        parent.Items.Insert(dropItemIndex, dragItem);
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Verificamos onde o item arrastado foi solto e, se for numa posição diferente da atual, movemos o item para uma nova posição. Nosso behavior está pronto. Compile o projeto e abra o Blend para recarregá-lo. Nosso behavior está lá e pode ser usado.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2110.image_5F00_3C5EC57F.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1423.image_5F00_thumb_5F00_7AE41325.png" width="321" height="321" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coloque uma Listbox na janela e coloque alguns itens nela. Arraste um &lt;strong&gt;DragListItemBehavior&lt;/strong&gt; para a Listbox. Execute o programa. Você pode ver que podemos arrastar os itens da Listbox para movê-los de lugar. Este behavior é reutilizável e pode ser usado em qualquer Listbox, mesmo por aqueles que não tem conhecimento de C#. Como você pode ver, um behavior pode modificar o comportamento de outros componentes, estendendo-os e trazendo novos comportamentos, sem que seja necessário criar um controle derivado.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1805339" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/3RU5nWshX5Q" height="1" width="1"/&gt;</description><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/01/28/behaviors-em-blend.aspx</feedburner:origLink></item><item><title>Animando transições em WPF/Silverlight–Parte IV–Behaviors</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/dEqz3nIU8nI/animando-transi-231-245-es-em-wpf-silverlight-parte-iv-behaviors.aspx</link><pubDate>Sat, 21 Jan 2012 15:39:56 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805159</guid><dc:creator>bsonnino</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1805159</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/01/21/animando-transi-231-245-es-em-wpf-silverlight-parte-iv-behaviors.aspx#comments</comments><description>&lt;p&gt;No &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/17/animando-transi-231-245-es-em-wpf-silverlight-parte-iii-visual-states.aspx"&gt;último post&lt;/a&gt; mostramos como animar transições usando o Blend e Visual States. Uma parte importante naquele mecanismo é o uso de behaviors. Com behaviors, podemos executar ações bastante complexas, apenas arrastando um behavior para um componente da janela. Isto, além de poderoso, traz outros benefícios: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;É reutilizável. Podemos incluir o mesmo behavior em diversas situações &lt;/li&gt;    &lt;li&gt;Permite que os designers possam incluir funcionalidade no design sem necessidade de código &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Temos dois tipos de behaviors:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Actions – executam uma ação associado a um evento. Por exemplo, você pode criar uma Action que, associada a uma TextBox, emite um “click” a cada tecla pressionada, ou outra action que faz um controle crescer quando o mouse está sobre ele &lt;/li&gt;    &lt;li&gt;Full behaviors – neste caso, há um comportamento mais complexo, não necessariamente associado a um único trigger. Um exemplo disso é o MouseDragElementBehavior, que permite movimentar um elemento, arrastando-o com o mouse &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;No Blend, encontramos os dois tipos de behaviors, com o final do nome indicando o tipo (ex. CallMethodAction ou FluidMoveBehavior).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5140.image_5F00_7751EED3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4341.image_5F00_thumb_5F00_00CAAD4A.png" width="241" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Além dos pré-instalados, você pode encontrar outros behaviors, na galeria do Blend, em &lt;a href="http://gallery.expression.microsoft.com"&gt;http://gallery.expression.microsoft.com&lt;/a&gt; (quando verifiquei, existiam 114 behaviors disponíveis lá). &lt;/p&gt;  &lt;p&gt;Os behaviors estão associados a um objeto e podem ter propriedades adicionais, além do trigger que os ativa. Por exemplo, o GoToStateAction tem como propriedades adicionais o componente destino e o estado a ser ativado, além da propriedade booleana UseTransitions, para usar as transições para mudar de um estado a outro.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7026.image_5F00_0C7FF47C.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0116.image_5F00_thumb_5F00_52247E9A.png" width="222" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Além de configurar as propriedades da Action, você pode especificar condições para que ela possa ser ativada. Por exemplo, usando o projeto do &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/17/animando-transi-231-245-es-em-wpf-silverlight-parte-iii-visual-states.aspx"&gt;post anterior&lt;/a&gt;, podemos usar uma checkbox para permitir a ativação da transição. Para isso, basta clicar no botão “+” de Condition List, clicar no botão de propriedades avançadas da condição, criar um Data Binding com a checkbox e fazer um binding com a propriedade &lt;strong&gt;IsChecked&lt;/strong&gt;. Desta maneira, a animação só será ativada se a checkbox estiver checada.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4505.image_5F00_4954764E.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2018.image_5F00_thumb_5F00_15AC09F0.png" width="217" height="477" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Além das Actions padrão, podemos criar Actions personalizadas para fazer o que queremos. No post anterior, usamos as Actions padrão, mas precisamos criar os Visual States. Além disso, temos um outro inconveniente: se quisermos fazer as animações para cima ou para baixo, temos que criar novos Visual States. Assim, criaremos nossa Action para fazer o que queremos, sem a necessidade de configuração especial.&lt;/p&gt;  &lt;p&gt;No Visual Studio, crie um novo projeto WPF. Vamos adicionar agora a nossa Action. O Visual Studio, por padrão, não tem o template para criar uma Action. Poderíamos fazer isso usando o Blend. Ao abrir o projeto no Blend e selecionar a aba Project, você pode dar um clique com o botão direito do mouse, selecionar Add New Item e adicionar uma Action ao projeto.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6406.image_5F00_1322D832.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3884.image_5F00_thumb_5F00_6AA3F61D.png" width="225" height="244" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Outra maneira de fazer isso é usar os templates online do Visual Studio. No Solution Explorer do Visual Studio, clique com o botão direito do mouse no projeto e selecione &lt;em&gt;Add New Item&lt;/em&gt;. Na tela, vá para &lt;em&gt;Online Templates&lt;/em&gt; e tecle &lt;em&gt;action&lt;/em&gt; na caixa de pesquisa. Selecione o template &lt;strong&gt;C# Action Template for WPF&lt;/strong&gt; e dê o nome de &lt;em&gt;TransitionControlAction&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1050.image_5F00_5401A7D6.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2538.image_5F00_thumb_5F00_05406C6A.png" width="524" height="363" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O template adiciona uma referência a &lt;em&gt;System.Windows.Interactivity&lt;/em&gt; e gera uma classe semelhante a este código:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:91420db8-bda2-4aa6-a4b5-b11a4df57d50" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:565px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Text;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Controls;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Data;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Documents;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Input;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Media;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Media.Imaging;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Shapes;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Windows.Interactivity;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; WpfApplication4
{
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; If you want your Action to target elements other than its parent, extend your class
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; from TargetedTriggerAction instead of from TriggerAction
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; TransitionControlAction : TriggerAction&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DependencyObject&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; TransitionControlAction()
        {
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Insert code required on object creation below this point.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Invoke(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; o)
        {
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Insert code that defines what the Action will do when triggered/invoked.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;        }
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;







&lt;p&gt;Temos dois tipos de actions: &lt;strong&gt;TriggerAction&lt;/strong&gt; e &lt;strong&gt;TargetedTriggerAction&lt;/strong&gt;. &lt;strong&gt;TriggerAction&lt;/strong&gt; é uma action que não se refere a outro controle. Por exemplo, se quisermos criar uma action que executa o Notepad quando acontece um evento, usaríamos uma &lt;strong&gt;TriggerAction&lt;/strong&gt;. &lt;strong&gt;TargetedTriggerAction&lt;/strong&gt; refere-se a um outro elemento, chamado de &lt;strong&gt;Target&lt;/strong&gt;. Este elemento é uma propriedade da action e pode ser acessado no Blend.&lt;/p&gt;

&lt;p&gt;Nós iremos criar uma &lt;strong&gt;TargetedTriggerAction&lt;/strong&gt;. Portanto devemos mudar o código para derivar de &lt;strong&gt;TargetedTriggerAction&lt;/strong&gt;, como mostra o comentário no início da classe. Esta action irá executar o mesmo código que criamos no &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx"&gt;primeiro post&lt;/a&gt; para fazer a animação. Devemos alterar também o tipo de objeto em que ela atua. Usaremos o &lt;strong&gt;FrameworkElement&lt;/strong&gt;, pois este elemento tem as propriedades &lt;strong&gt;ActualWidth &lt;/strong&gt;e &lt;strong&gt;ActualHeight&lt;/strong&gt;.&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a16d03a3-720a-4b4b-90af-d5b6a20fb5e1" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:43px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; TransitionControlAction : TargetedTriggerAction&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;FrameworkElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Inicialmente, iremos criar a enumeração para as posições e duas DependencyProperties com o tipo de animação desejada e a duração, de modo que ela possa ser selecionada no Blend. &lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:22824cb0-82e0-4e6e-93bc-4ac67f04dd6a" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:525px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;enum&lt;/span&gt;&lt;span style="color:#000000;"&gt; TipoAnimacao
{
    Direita,
    Esquerda,
    Cima,
    Baixo
}

[Category(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Common Properties&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; TipoAnimacao Tipo
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; (TipoAnimacao)GetValue(TipoProperty); }
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { SetValue(TipoProperty, value); }
}

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;readonly&lt;/span&gt;&lt;span style="color:#000000;"&gt; DependencyProperty TipoProperty &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    DependencyProperty.Register(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Tipo&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(TipoAnimacao), &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(TransitionControlAction));


[Category(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Common Properties&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; TimeSpan Duracao
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; (TimeSpan)GetValue(DuracaoProperty); }
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { SetValue(DuracaoProperty, value); }
}

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;readonly&lt;/span&gt;&lt;span style="color:#000000;"&gt; DependencyProperty DuracaoProperty &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    DependencyProperty.Register(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Duracao&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(TimeSpan), &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(TransitionControlAction), 
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; UIPropertyMetadata(TimeSpan.FromMilliseconds(&lt;/span&gt;&lt;span style="color:#800080;"&gt;500&lt;/span&gt;&lt;span style="color:#000000;"&gt;)));
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note que colocamos o atributo &lt;strong&gt;Category&lt;/strong&gt; nas propriedades &lt;strong&gt;Tipo&lt;/strong&gt; e &lt;strong&gt;Duração &lt;/strong&gt;para que elas apareçam junto com o grupo &lt;em&gt;Common Properties&lt;/em&gt;. Ao compilarmos o projeto e abri-lo no Blend, vemos que nossa action aparece na aba &lt;em&gt;Assets.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6278.image_5F00_6CED524E.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2330.image_5F00_thumb_5F00_595FF2AD.png" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao arrastarmos uma &lt;strong&gt;TransitionControlAction&lt;/strong&gt; para um botão, as propriedades aparecem no editor de propriedades:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8156.image_5F00_1059D0E7.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1667.image_5F00_thumb_5F00_2AB9C3FE.png" width="247" height="343" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas nossa action ainda não faz nada. Para fazer algo, devemos sobrescrever o método &lt;strong&gt;Invoke&lt;/strong&gt; da action, colocando ali o código que deve ser executado. Usaremos o código que escrevemos na primeira postagem, modificando um pouco para usar o controle Target:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:69b2b836-04f7-4a24-91f6-609292acc1a2" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:478px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimaControle(FrameworkElement controle, TimeSpan dura&amp;#231;&amp;#227;o, TipoAnimacao tipo)
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; xFinal &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; yFinal &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; TipoAnimacao.Esquerda)
        xFinal &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;controle.ActualWidth;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; TipoAnimacao.Direita)
        xFinal &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; controle.ActualWidth;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; TipoAnimacao.Cima)
        yFinal &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;controle.ActualHeight;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; TipoAnimacao.Baixo)
        yFinal &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; controle.ActualHeight;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; cria a transforma&amp;#231;&amp;#227;o e atribui ao controle&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    var translate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TranslateTransform(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
    controle.RenderTransform &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; translate;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; cria a anima&amp;#231;&amp;#227;o e anima-a&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; TipoAnimacao.Esquerda &lt;/span&gt;&lt;span style="color:#000000;"&gt;||&lt;/span&gt;&lt;span style="color:#000000;"&gt; tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; TipoAnimacao.Direita)
    {
        var da &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DoubleAnimation(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, xFinal, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration(dura&amp;#231;&amp;#227;o));
        translate.BeginAnimation(TranslateTransform.XProperty, da);
    }
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        var da &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DoubleAnimation(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, yFinal, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration(dura&amp;#231;&amp;#227;o));
        translate.BeginAnimation(TranslateTransform.YProperty, da);
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finalmente, basta chamar o método &lt;strong&gt;AnimaControle&lt;/strong&gt; a partir do método &lt;strong&gt;Invoke&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:6a9cc834-24fc-40df-81a2-57dddffa4663" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:89px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Invoke(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; o)
{
    AnimaControle(Target, Duracao, Tipo);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;













&lt;p&gt;Com isto, nosso behavior está completo. Podemos abrir o projeto no Blend, arrastar a action para o botão, configurar o objeto &lt;strong&gt;Target&lt;/strong&gt; apontando para a grid e executar o projeto. Ao clicar o botão, a grid faz uma transição animada para a direção selecionada. Note que não precisamos fazer nada. Basta arrastar a action para o botão, configurar o elemento &lt;strong&gt;Target&lt;/strong&gt; e as propriedades. A action está pronta para ser executada.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2605.image_5F00_0C8C064A.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2158.image_5F00_thumb_5F00_6AC02DB8.png" width="402" height="269" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Conclusão&lt;/h3&gt;

&lt;p&gt;Foi um longo trajeto até aqui. Vimos quatro maneiras diferentes de animar a transição, começamos com código e terminamos usando o mesmo código. No meio do caminho vimos diversos conceitos: partir de um código fixo para um código mais refatorado e flexível, usar componentes para transição, eliminar o code behind usando MVVM, usando o Nuget, Templates Implícitos, usar Visual States para criar animações sem usar código e, finalmente, behaviors, para criar ações que podem ser usadas por designers, de maneira flexível e sem usar código. Espero que tenham gostado!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1805159" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/dEqz3nIU8nI" height="1" width="1"/&gt;</description><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/01/21/animando-transi-231-245-es-em-wpf-silverlight-parte-iv-behaviors.aspx</feedburner:origLink></item><item><title>Animando transições em WPF/Silverlight–Parte III–Visual States</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/c_0DM6EzrS0/animando-transi-231-245-es-em-wpf-silverlight-parte-iii-visual-states.aspx</link><pubDate>Tue, 17 Jan 2012 10:05:37 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1804990</guid><dc:creator>bsonnino</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1804990</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/01/17/animando-transi-231-245-es-em-wpf-silverlight-parte-iii-visual-states.aspx#comments</comments><description>&lt;p&gt;Nos dois últimos posts, mostrei como animar uma transição usando código. O &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx"&gt;primeiro post&lt;/a&gt; mostrou como animar a transição usando code behind, criando uma animação em código. O &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/14/animando-transi-231-245-es-em-wpf-silverlight-parte-ii-usando-componentes.aspx"&gt;segundo post&lt;/a&gt; mostrou o uso de componentes para facilitar estas transições. Embora o uso de componentes seja uma boa alternativa a criar as animações em código, ainda tem algumas desvantagens:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;É necessário incluir uma referência à dll do componente ou incluir o código do componente no projeto. &lt;/li&gt;    &lt;li&gt;Está sujeito a bugs – embora muitas pessoas usem estes componentes nada impede que eles tenham bugs. O fato de serem open source e terem seu código disponível pode minimizar isto, mas nem sempre é fácil debugar este código.&lt;/li&gt;    &lt;li&gt;Pode ficar defasado. Com novas versões do Silverlight e WPF, um componente que não é mantido há muito tempo pode não funcionar nas novas versões &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Assim, vamos ver aqui uma nova opção para animar as transições, que não usam código. “Como assim, não usam código?”, você deve estar se perguntando. Sim, o WPF 4 (ou o 3.5, com o WPF Toolkit) e o Silverlight introduziram um novo recurso, que dispensa o uso de código em C# ou VB para animar as transições: os Visual States. Com Visual States, você define qual é o estado de seu controle em diversas situações e transiciona entre eles sem usar código. Tudo é feito com o XAML.&lt;/p&gt;  &lt;p&gt;Para este projeto, não usaremos o VisualStudio. A criação de Visual States é muito mais fácil usando o Blend.&lt;/p&gt;  &lt;p&gt;Abra o Blend e crie um novo projeto WPF.&lt;/p&gt;  &lt;p&gt;Neste projeto, inclua uma linha na Grid principal, na parte de baixo da janela, com 40 pixels de altura e, na segunda linha, coloque um botão com a propriedade &lt;strong&gt;Content&lt;/strong&gt; configurada para o texto &lt;em&gt;Esconde&lt;/em&gt;. Na primeira linha da grid, coloque outra grid, com fundo vermelho.&lt;/p&gt;  &lt;p&gt;No painel do projeto, escolha a aba States. Ela deve estar vazia.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7103.image_5F00_2759336F.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8512.image_5F00_thumb_5F00_5F2B7792.png" width="244" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Clique no primeiro botão da barra superior da aba para adicionar um novo grupo de estados. Mude o nome do grupo para &lt;strong&gt;EstadosGrid&lt;/strong&gt;. Clique no segundo botão deste grupo para adicionar um novo estado. Mude seu nome para &lt;strong&gt;Aparente&lt;/strong&gt;. Adicione um novo estado e mude o nome dele para &lt;strong&gt;Escondido&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Note que o tempo padrão de transição (mostrado na frente do texto Default Transition) é de 0s&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2287.image_5F00_56C7A23B.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1157.image_5F00_thumb_5F00_6A748BCF.png" width="243" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Mude este tempo para 1. Mude também o Easing Function para CubicInOut, clicando no segundo botão&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1184.image_5F00_0FFE0931.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3107.image_5F00_thumb_5F00_3991D464.png" width="244" height="151" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Olhando a figura acima, você pode notar que estamos em modo de gravação, “gravando” o estado &lt;strong&gt;Escondido&lt;/strong&gt;. Quando selecionamos um estado, todas as alterações que fazemos no layout são atribuídos a este estado. Assim, podemos mudar a aparência de nossos controles apenas mudando de um estado para outro. O estado &lt;strong&gt;Aparente&lt;/strong&gt; é o nosso estado padrão. No estado &lt;strong&gt;Escondido&lt;/strong&gt; iremos esconder a grid. A transição é feita automaticamente quando mudarmos de um estado para outro.&lt;/p&gt;  &lt;p&gt;Selecione a grid e mude a propriedade &lt;strong&gt;RenderTransform&lt;/strong&gt; X para –625, a propriedade &lt;strong&gt;Opacity&lt;/strong&gt; para 0 e a propriedade &lt;strong&gt;Visibility&lt;/strong&gt; para &lt;em&gt;Collapsed&lt;/em&gt;. Desta maneira, a grid irá para a esquerda, ao mesmo tempo que fica cada vez mais transparente. Nossos estados estão prontos. Poderíamos mudar de estado usando o code behind, colocando o seguinte código no event Click do botão:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:c7e0844e-5ec6-44c9-ac42-f2957641aa51" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:92px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; button_Click(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, System.Windows.RoutedEventArgs e)
{
  VisualStateManager.GoToElementState(LayoutRoot, &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Escondido&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mas assim estaríamos na mesma situação do post anterior, onde temos code behind. Além disso, eu prometi que não iríamos colocar código. E promessa é dívida!&lt;/p&gt;

&lt;p&gt;O Blend tem um recurso muito interessante para executar ações sem a necessidade de código: Behaviors. Behaviors são ações personalizadas, usadas diretamente nos componentes, sem que seja preciso escrever código para executá-las (na realidade, você precisa escrever código para escrever um behavior mas, uma vez criado, basta arrastá-lo para um componente para ser usado). O Blend venm com diversos behaviors pré definidos. Para usá-los, basta ir na janela do projeto, na aba &lt;strong&gt;Assets&lt;/strong&gt; e selecionar a opção &lt;strong&gt;Behaviors&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0410.image_5F00_663A8E3D.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3808.image_5F00_thumb_5F00_24BFDBE4.png" width="244" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usaremos o behavior &lt;strong&gt;GoToStateAction&lt;/strong&gt;. Atribuímos este behavior a um componente, dizemos qual é o evento que o ativa e qual é o novo estado que se deve ativar quando o evento foi acionado. Selecione o &lt;strong&gt;GoToStateAction&lt;/strong&gt; e arraste-o para o botão. Note que um &lt;strong&gt;GoToStateAction&lt;/strong&gt; é adicionado ao botão, no inspetor de objetos.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;



&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0207.image_5F00_74B58A62.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7587.image_5F00_thumb_5F00_215E443C.png" width="244" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No editor de propriedades, iremos configurar a ação.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6457.image_5F00_39157BA2.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7485.image_5F00_thumb_5F00_577FBC8B.png" width="164" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Trigger já está configurado: queremos ativar a action quando o evento &lt;strong&gt;Click&lt;/strong&gt; do botão foi acionado. Falta apenas configurar o estado que queremos selecionar quando o botão for clicado. Para isto, basta configurar a propriedade &lt;strong&gt;StateName&lt;/strong&gt; para &lt;em&gt;Escondido&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3225.image_5F00_03BC4370.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4744.image_5F00_thumb_5F00_6D19F528.png" width="164" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nossa aplicação está pronta. Ao executá-la e clicar no botão, ocorre a transição animada, que movimenta a grid para fora. E tudo isso sem uma única linha de código!&lt;/p&gt;

&lt;p&gt;Vamos fazer agora uma pequena mudança para dar um pouco mais de funcionalidade à nossa aplicação. Mude a visualização do editor para Split, clicando no terceiro botão de mudança de visualização.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2475.image_5F00_0464F99A.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7282.image_5F00_thumb_5F00_5E22A041.png" width="619" height="394" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso, podemos alterar o código XAML diretamente e alterar o nosso botão. Queremos que ele não seja um botão normal, e sim um &lt;strong&gt;ToggleButton&lt;/strong&gt;. Para isso, altere o componente no XAML, mudando o seu tipo de &lt;strong&gt;Button&lt;/strong&gt; para &lt;strong&gt;ToggleButton&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9c081ca2-25ad-4c58-a039-9964da315405" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:150px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ToggleButton &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Content&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Esconde&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
    VerticalAlignment&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;65&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Height&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;25&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;i:EventTrigger &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;EventName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ei:GoToStateAction &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;StateName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Escondido&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;i:EventTrigger&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ToggleButton&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;







&lt;p&gt;O &lt;strong&gt;ToggleButton&lt;/strong&gt; pode estar checado ou não. Faremos que quando ele está checado, mostre o estado &lt;em&gt;Escondido&lt;/em&gt; e, quando não está checado, mostre o estado &lt;em&gt;Aparente. &lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para isso, devemos mudar o evento que ativa o estado &lt;em&gt;Escondido&lt;em&gt;&lt;/em&gt;. &lt;/em&gt;No inspetor de objetos, selecione o &lt;strong&gt;GoToStateAction&lt;/strong&gt; e mude a propriedade &lt;strong&gt;EventName&lt;/strong&gt; para &lt;em&gt;Checked&lt;/em&gt;. Na paleta do projeto, selecione o &lt;strong&gt;GoToStateAction&lt;/strong&gt; e arraste um segundo &lt;strong&gt;GoToStateAction&lt;/strong&gt; para o botão. Configure a propriedade &lt;strong&gt;EventName&lt;/strong&gt; para &lt;em&gt;Unchecked&lt;/em&gt; e a propriedade &lt;strong&gt;StateName&lt;/strong&gt; para &lt;em&gt;Aparente&lt;/em&gt;. Execute o programa.&lt;/p&gt;

&lt;p&gt;Agora temos uma animação para esconder a grid quando o botão é checado e outra para mostrar a grid, quando o botão não está checado. Fácil, não?&lt;/p&gt;

&lt;p&gt;Aqui pudemos ver a quantidade de recursos que temos à disposição para criar estados e ativá-los, tudo feito visualmente, sem precisar escrever código. Ainda não terminamos nossa jornada, ainda temos maneiras de animar transições, mas isto é assunto para um outro post. Até lá!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1804990" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/c_0DM6EzrS0" height="1" width="1"/&gt;</description><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/01/17/animando-transi-231-245-es-em-wpf-silverlight-parte-iii-visual-states.aspx</feedburner:origLink></item><item><title>Animando transições em WPF/Silverlight–Parte II–Usando Componentes</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/OG-pWIOvoWs/animando-transi-231-245-es-em-wpf-silverlight-parte-ii-usando-componentes.aspx</link><pubDate>Sat, 14 Jan 2012 21:57:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1804829</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1804829</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/01/14/animando-transi-231-245-es-em-wpf-silverlight-parte-ii-usando-componentes.aspx#comments</comments><description>&lt;p&gt;No &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx"&gt;post anterior&lt;/a&gt; vimos como animar uma transição usando código. Como falei, não acho aquela a melhor solução, pois obriga a usar code behind, o que não é de fácil manutenção. Poderíámos refatorar o código, criando uma classe para a animação e usá-la. Isto traria um pouco mais de separação, mas ainda teríamos de usar code behind.&lt;/p&gt;  &lt;p&gt;Nesta segunda parte, usaremos um enfoque diferente: o uso de componentes prontos. Podemos usar diversos componentes, como o Kevin Bag-O-Tricks (&lt;a title="https://github.com/thinkpixellab/bot" href="https://github.com/thinkpixellab/bot"&gt;https://github.com/thinkpixellab/bot&lt;/a&gt;), FluidKit (&lt;a href="http://fluidkit.com"&gt;http://fluidkit.com&lt;/a&gt;), Silverlight Toolkit (&lt;a href="http://silverlight.codeplex.com"&gt;http://silverlight.codeplex.com&lt;/a&gt; – só para Silverlight), o Transitionals (&lt;a href="http://transitionals.codeplex.com"&gt;http://transitionals.codeplex.com&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Usaremos aqui o Transitionals, para WPF. Se quisermos fazer animações em Silverlight, devemos escolher outro dos componentes acima.&lt;/p&gt;  &lt;p&gt;Seu uso é muito simples: após baixar o componente e adicionar uma referência ao projeto para a dll Transitionals.dll, devemos adicionar um componente TransitionElement no local onde queremos a animação, configurar a animação e colocar um conteúdo para o componente. Ao mudar o conteúdo, ocorre a transição selecionada.&lt;/p&gt;  &lt;p&gt;Vamos então fazer o nosso projeto de animação. Crie um novo projeto WPF e adicione uma referência a Transitionals.dll. Em seguida, coloque um TransitionElement na grid principal:&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:709995e9-0a5c-43f8-8c3c-e69cfdea18eb" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:895px;height:251px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RowDefinition Height&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;*&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RowDefinition Height&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;40&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement x:Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TransitionBox&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transt:TranslateTransition  StartPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; EndPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0:0:1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
       
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Button Width&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;65&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Content&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Esconde&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;5&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Click&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Button_Click&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Devemos definir os namespaces para o TransitionElement e para a TranslateTransition na definição da janela:&lt;/p&gt;

&lt;p&gt;
  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:c9def6d2-d14f-49a8-8392-01d853f315f8" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:134px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Window x:Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WpfApplication2.MainWindow&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:x&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:transc&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clr-namespace:Transitionals.Controls;assembly=Transitionals&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:transt&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clr-namespace:Transitionals.Transitions;assembly=Transitionals&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Title&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;MainWindow&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Height&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;350&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Width&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;525&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Em seguida, é só colocar um conteúdo no TransitionElement:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:b7a0b246-5257-4f31-a751-7d6a73e9ecc9" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:134px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement x:Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TransitionBox&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transt:TranslateTransition  StartPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; EndPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0:0:1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid Background&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Red&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O código do botão muda o conteúdo do TrasitionElement e, com isso ativa a transição:&lt;/p&gt;

&lt;p&gt;
  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:790fd78b-e30b-4ee5-97b9-f9c7ad7f71d2" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:94px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Button_Click(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, RoutedEventArgs e)
{
    TransitionBox.Content &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Grid() {Background &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Brushes.Blue};
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Desta maneira, o código fica muito mais fácil, só precisamos mudar o conteúdo do elemento. Além disso, o componente Transitionals tem muitos tipos de transições, e podemos configurá-las de diversas maneiras. Por exemplo, o TranslateTrasition tem as propriedades StartPoint e EndPoint, dizendo onde começa e onde termina a transição. Para fazer da esquerda para direita, StartPoint deve ser –1,0 e EndPoint, 0,0. De cima para baixo, StartPoint deve ser 0,-1 e EndPoint, 0,0. Podemos inclusive fazer uma transição diagonal usando os pontos 1,1 e 0,0.&lt;/p&gt;

&lt;h3&gt;Eliminando o Code Behind&lt;/h3&gt;

&lt;p&gt;Uma das coisas que podem ser melhoradas aqui é a eliminação do code behind, usando o padrão de projeto MVVM. Para isso, usaremos o framework MVVM Light, que pode ser obtido gratuitamente em &lt;a href="http://galasoft.ch"&gt;http://galasoft.ch&lt;/a&gt;, ou ainda instalado diretamente no projeto usando o Nuget, uma extensão para o Visual Studio que facilita o download e instalação de bibliotecas e ferramentas no Visual Studio. Se você ainda não baixou o Nuget, vá imediatamente para &lt;a href="http://nuget.org"&gt;http://nuget.org&lt;/a&gt; e baixe-o. Vale a pena!&lt;/p&gt;

&lt;p&gt;Uma vez instalado o Nuget, clique com o botão direito em References, no Solution Explorer e&amp;#160; selecione “Manage Nuget Packages”. Tecle “mvvm” na caixa de pesquisa e instale o pacote MVVM Light:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/8475.image_5F00_7C1E2822.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3000.image_5F00_thumb_5F00_520AB1D5.png" width="609" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isto instala o MVVM Light em nosso projeto, adiciona as referências necessárias e cria uma pasta ViewModel, com dois arquivos, MainViewModel.cs e ViewModelLocator.cs. MainViewModel.cs é o ViewModel referente à janela princiapl e ViewModelLocator é um localizador de ViewModel, referente à View.&lt;/p&gt;

&lt;p&gt;Em MainViewModel.cs, colocamos uma propriedade, do tipo ViewModelBase, que conterá os ViewModel referente à View do conteúdo atual: &lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:65237c99-f48b-47f3-bd27-dc3908c9e485" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:215px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelBase conteudo;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelBase Conteudo
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; conteudo; }
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        conteudo &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
        RaisePropertyChanged(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Conteudo&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Criaremos em seguida dois ViewModels, que serão referentes à nossas Views. Os dois ViewModels são muito semelhantes e têm apenas uma propriedade:&lt;/p&gt;

&lt;p&gt;
  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:291f285a-944e-460a-bddb-214c101ee1d5" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:523px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelA : ViewModelBase
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; texto;

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Texto
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; texto; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        {
            texto &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
            RaisePropertyChanged(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Texto&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
        }
    }
}

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelB : ViewModelBase
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; texto;

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Texto
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; texto; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        {
            texto &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
            RaisePropertyChanged(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Texto&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
        }
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Em seguida, crie no Solution Explorer um diretório chamado View e coloque lá dois UserControls, com apenas uma Grid com um TextBlock:&lt;/p&gt;

&lt;p&gt;
  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:245dda96-c45f-4f30-ac7d-8983a2b2d21e" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:220px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;UserControl x:Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WpfApplication2.View.ViewA&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
             xmlns&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
             xmlns:x&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
             xmlns:mc&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
             xmlns:d&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/expression/blend/2008&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
             mc:Ignorable&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;d&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
             d:DesignHeight&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;300&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; d:DesignWidth&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;300&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid Background&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Red&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TextBlock Text&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{Binding Texto}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; FontSize&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;36&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;UserControl&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Para eliminar o code behind, precisamos fazer um data binding da propriedade Content do TransitionElement com a propriedade conteúdo do ViewModel:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:0a179c08-a760-4eda-9411-fad60d57253c" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:117px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement x:Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TransitionBox&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Content&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{Binding Conteudo}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;transt:TranslateTransition  StartPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; EndPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0,0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0:0:1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement.Transition&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;transc:TransitionElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;e eliminar o clique do botão, substituindo-o por um Command:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:5c69c5c0-d7ac-4f41-b572-59f36793ba80" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:40px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Button Width&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;65&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Content&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Esconde&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;5&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Command&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{Binding EscondeCommand}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O command é definido no MainViewModel:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:09ae30cb-861f-4911-ad39-52eeb080b1f3" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:224px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ICommand escondeCommand;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ICommand EscondeCommand
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; escondeCommand &lt;/span&gt;&lt;span style="color:#000000;"&gt;??&lt;/span&gt;&lt;span style="color:#000000;"&gt; (escondeCommand &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; RelayCommand(MudaConteudo)); }
}

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; MudaConteudo()
{
    Conteudo &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; conteudo &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;is&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelA &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        (ViewModelBase)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelB() { Texto &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ViewModel B&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} : 
        (ViewModelBase)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ViewModelA() {Texto &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt; ViewModel A&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;};
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finalmente, devemos definir o DataContext para a View principal:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:c202a6c7-5e2d-4272-a15e-4474b5ce5515" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:153px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Window x:Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WpfApplication2.MainWindow&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:x&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:transc&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clr-namespace:Transitionals.Controls;assembly=Transitionals&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        xmlns:transt&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clr-namespace:Transitionals.Transitions;assembly=Transitionals&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        Title&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;MainWindow&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Height&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;350&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Width&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;525&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        DataContext&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{Binding Source={StaticResource Locator}, Path=Main}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ao executar o programa, temos algo como mostrado na figura abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/7217.image_5F00_66CC8488.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0310.image_5F00_thumb_5F00_23A1065B.png" width="396" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A view não é mostrada, apenas o nome da classe do conteúdo. Isso era de se esperar, pois a propriedade Conteúdo é do tipo ViewModelBase e sua representação é o método ToString(). Poderíamos ter colocado a View como sendo o conteúdo, mas isto vai contra o padrão MVVM: o ViewModel não deve conhecer a View. Uma solução para mostrar a View a partir do ViewModel é usar um recurso disponível no WPF ou no Silverlight 5: Data Templates implícitos. Em um Data Template implicito, não explicitamos a Key, apenas dizemos qual é o DataType e, com isso o WPF/Silverlight renderezam este DataTemplate toda vez que um conteúdo for do tipo referente a ele.&lt;/p&gt;

&lt;p&gt;Definimos então os DataTemplates na seção Resources da janela:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:ecefd076-ef81-4005-918c-01e7b0bd208d" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:853px;height:157px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataTemplate DataType&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{x:Type ViewModel:ViewModelA}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;View:ViewA &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataTemplate DataType&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{x:Type ViewModel:ViewModelB}&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;View:ViewB &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Agora, ao executar, temos a transição entre as duas views, sem o uso de code behind.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3005.image_5F00_3E00F972.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0121.image_5F00_thumb_5F00_07439E6E.png" width="402" height="269" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Conclusões&lt;/h3&gt;

&lt;p&gt;Usando componentes de animação de transições, temos a possibilidade de fazer transições muito sofisticadas, de maneira muito simples bastando mudar o conteúdo do componente. &lt;/p&gt;

&lt;p&gt;Em seguida, vimos como tirar o código do code behind, colocando-o em um ViewModel, o que facilita na manutenção e permite maior testabilidade do código. Como bonus, vimos como usar implicit templates para ligar uma view a um viewmodel sem usar código. Este recurso está disponível apenas no WPF e no Silverlight 5. Embora você possa achar que não vale a pena (eliminamos apenas uma linha de código e incluímos dois viemodels, duas views, um novo componente MVVM, entre outros), minha intenção aqui foi mostrar como usar outros recursos, como a introdução do MVVM ao invés do code behind e como usar novos recursos, como o DataTemplate implícito. Numa aplicação maior, que requer maiores cuidados, estas mudanças se justificam plenamente.&lt;/p&gt;

&lt;p&gt;Mas estas não são as únicas maneiras de se fazer transições de controles. Nos próximos artigos, veremos quais são as outras maneiras. Até lá!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1804829" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/OG-pWIOvoWs" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Animacoes/default.aspx">Animacoes</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/01/14/animando-transi-231-245-es-em-wpf-silverlight-parte-ii-usando-componentes.aspx</feedburner:origLink></item><item><title>Animando transições em WPF e Silverlight–Parte I–Code Behind</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/Hjrny0JsVxY/animando-transi-231-245-es-em-wpf-e-silverlight-parte-i-code-behind.aspx</link><pubDate>Wed, 11 Jan 2012 09:15:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805667</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1805667</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-e-silverlight-parte-i-code-behind.aspx#comments</comments><description>&lt;p&gt;Quando eu vi uma pergunta de um usuário nos forums do MSDN sobre animação de um user control para dar o efeito de saída ao clicar um botão, eu pensei que esta seria uma excelente oportunidade de criar uma série de posts aqui no blog, mostrando diversas maneiras de fazê-lo.&lt;/p&gt;  &lt;p&gt;Apesar de colocar as alternativas aqui, algumas podem não ser tão boas: este post onde eu ponho animação no code behind, apesar de ser fácil de implementar, tem algumas desvantagens:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;O código da animação é posto no code behind, uma técnica que eu não gosto. Eu nao acho que o padrão MVVM deva ter zero code behind, mas eu não gosto de por código lá, a menos que seja indispensável e estritamente relacionado com a view.&lt;/li&gt;    &lt;li&gt;Não é design-friendly – se o designer quer mudar a animação, o código deve ser alterado.&lt;/li&gt;    &lt;li&gt;Não é portável – se você quer criar a mesma animação em outros lugares, o código deve ser copiado ou refatorado para ser acessado de outros lugares.&lt;/li&gt;    &lt;li&gt;Não é fácil de manipular – tudo é feito em código. Quaisquer mudanças, como a duração da animação deve ser alterado em código.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Temos o seguinte problema: temos um controle na janela e queremos escondê-lo quando o botão é clicado, usando uma animação, como vemos abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4300.image_5F00_thumb_5F00_34CED7BB.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image_thumb" border="0" alt="image_thumb" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2677.image_5F00_thumb_5F00_thumb_5F00_6CA11BDE.png" width="244" height="165" /&gt;&lt;/a&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6330.image_5F00_thumb1_5F00_20691230.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image_thumb1" border="0" alt="image_thumb1" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4606.image_5F00_thumb1_5F00_thumb_5F00_6364E09D.png" width="244" height="165" /&gt;&lt;/a&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3073.image_5F00_thumb3_5F00_3028A734.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image_thumb3" border="0" alt="image_thumb3" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4064.image_5F00_thumb3_5F00_thumb_5F00_7CEC6DCA.png" width="244" height="165" /&gt;&lt;/a&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3022.image_5F00_thumb4_5F00_6DD58EF0.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image_thumb4" border="0" alt="image_thumb4" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/0333.image_5F00_thumb4_5F00_thumb_5F00_219D8542.png" width="244" height="165" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para fazer isso, devemos criar uma animação para o controle, do tipo RenderTransform e animá-la. Podemos fazer tudo em código desta maneira: no clique do botão, criamos a transformação, adicionamos ao controle e animamos ela:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:14c91097-9557-4b1b-ac3d-19fff86faeb7" class="wlWriterSmartContent"&gt;   &lt;pre style="background-color:white;width:895px;height:158px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Button_Click(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, RoutedEventArgs e)
{ 
  &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; create the transformation and add it to the control&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;  var translate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TranslateTransform(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;);     
  gridLogin.RenderTransform &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; translate;     
  &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; create the animation and start it    &lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;  var da &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DoubleAnimation(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;ActualWidth, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration(TimeSpan.FromMilliseconds(&lt;/span&gt;&lt;span style="color:#800080;"&gt;1000&lt;/span&gt;&lt;span style="color:#000000;"&gt;)));
  translate.BeginAnimation(TranslateTransform.XProperty, da);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Este código tem muitos inconvenientes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ele só pode ser aplicado ao nosso controle. Para adicioná-lo a outro controle, devemos copiar o código. &lt;/li&gt;

  &lt;li&gt;A duração da animação é 1 segundo – a duração é fixa. &lt;/li&gt;

  &lt;li&gt;Somente anima da direita para a esquerda. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesta primeira fase, refatoraremos o código para deixá-lo mais genérico:&lt;/p&gt;



&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:f3819e35-7df1-4a10-86a8-c8d9bed8c28d" class="wlWriterSmartContent"&gt;
  &lt;pre style="background-color:white;width:821px;height:688px;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType
{
    Right,
    Left,
    Up,
    Down
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Button_Click(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, RoutedEventArgs e)
{
    AnimateControl(gridLogin, TimeSpan.FromMilliseconds(&lt;/span&gt;&lt;span style="color:#800080;"&gt;1000&lt;/span&gt;&lt;span style="color:#000000;"&gt;), AnimationType.Left);
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimateControl(UIElement control, TimeSpan duration, AnimationType type)
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; xEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; yEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (type &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Left)
        xEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;ActualWidth;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Right)
        xEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ActualWidth;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Up)
        yEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;ActualHeight;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Down)
        yEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ActualHeight;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; create the transformation and add it to the control&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    var translate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TranslateTransform(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
    control.RenderTransform &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; translate;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; create the animation and start it&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Left &lt;/span&gt;&lt;span style="color:#000000;"&gt;||&lt;/span&gt;&lt;span style="color:#000000;"&gt; tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Right)
    {
        var da &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DoubleAnimation(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, xEnd, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration(duration));
        translate.BeginAnimation(TranslateTransform.XProperty, da);
    }
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        var da &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DoubleAnimation(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, yEnd, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration(duration));
        translate.BeginAnimation(TranslateTransform.YProperty, da);
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;



&lt;p&gt;Apesar do código ser maior, ele é mais genérico e permite ser reutilizado. Podemos usar qualquer controle, configurar a deuração e a direção da animação. Ainda não é o idela, mas é melhor que o código anterior, não reutilizável. Nos próximos posts veremos outras maneiras de fazer isso. Até lá!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1805667" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/Hjrny0JsVxY" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Animacoes/default.aspx">Animacoes</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-e-silverlight-parte-i-code-behind.aspx</feedburner:origLink></item><item><title>Animating transitions in WPF/Silverlight–Part I–Code Behind</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/CcfLJM2xYr4/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx</link><pubDate>Wed, 11 Jan 2012 08:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1804579</guid><dc:creator>bsonnino</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1804579</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx#comments</comments><description>&lt;p&gt;When I saw a question from an user in the MSDN forums about animating an user control to give the exit effect while clicking a button, I thought this would be an excelent opportunity to create a series of posts here in the blog, showing many ways to do it.&lt;/p&gt;  &lt;p&gt;Although I will put the alternatives here, some can be not so good: this post, putting animation on the code behind, although easy to implement, has these disadvantages:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The animation code is put on the code behind, a technique I don’t like. I don’t think that the MVVM pattern should have zero code behind, but I don’t like to put code behind, unless is indispensable and strictly related to the view. &lt;/li&gt;    &lt;li&gt;It’s not design friendly – if the designer wants to change the animation, the code should be changed. &lt;/li&gt;    &lt;li&gt;It’s not portable – if you want to create the same animation on other places, the code must be copied or refactored to be accessed from other places. &lt;/li&gt;    &lt;li&gt;It’s not easy to manipulate – everything is on the code. Any changes, like the duration of the animation must be changed in code. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We have the following problem: we have a control in the window and we want to hide it when the button is clicked with an animation, like we see below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3125.image_5F00_3CD175E6.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3568.image_5F00_thumb_5F00_10484600.png" width="244" height="164" /&gt;&lt;/a&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/2438.image_5F00_481A8A23.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/3652.image_5F00_thumb_5F00_3FB6B4CC.png" width="244" height="164" /&gt;&lt;/a&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/6131.image_5F00_7788F8EF.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/1768.image_5F00_thumb_5F00_0AC9AF8F.png" width="244" height="164" /&gt;&lt;/a&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/4861.image_5F00_098516B0.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino.metablogapi/5852.image_5F00_thumb_5F00_6106349B.png" width="244" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To do that, we should create a transformation for the control, of type RenderTransform and animate it. We can do everything in code this way: at the button click, we create the transform, add it to the control and animate it:&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:b8da3021-72ea-4215-9c15-31bc7d63ea17" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:895px;height:158px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Button_Click(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, RoutedEventArgs e)
{ 
  &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; create the transformation and add it to the control&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;  var translate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TranslateTransform(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;);     
  gridLogin.RenderTransform &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; translate;     
  &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; create the animation and start it    &lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;  var da &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DoubleAnimation(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;ActualWidth, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration(TimeSpan.FromMilliseconds(&lt;/span&gt;&lt;span style="color:#800080;"&gt;1000&lt;/span&gt;&lt;span style="color:#000000;"&gt;)));
  translate.BeginAnimation(TranslateTransform.XProperty, da);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;This code has many shortcomings:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It can only be applied to our control. To add it to another control, we must copy the code. &lt;/li&gt;

  &lt;li&gt;The animation duration is 1 second – the duration is fixed. &lt;/li&gt;

  &lt;li&gt;It only animates from right to left. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this first phase, we can refactor the code and leave it more generic:&lt;/p&gt;



&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:5f593a85-e50e-48a6-b21b-694d112b723a" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:821px;height:688px;background-color:White;overflow:visible;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;enum&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType
{
    Right,
    Left,
    Up,
    Down
}

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Button_Click(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, RoutedEventArgs e)
{
    AnimateControl(gridLogin, TimeSpan.FromMilliseconds(&lt;/span&gt;&lt;span style="color:#800080;"&gt;1000&lt;/span&gt;&lt;span style="color:#000000;"&gt;), AnimationType.Left);
}

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimateControl(UIElement control, TimeSpan duration, AnimationType type)
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; xEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; yEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (type &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Left)
        xEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;ActualWidth;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Right)
        xEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ActualWidth;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Up)
        yEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;ActualHeight;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Down)
        yEnd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ActualHeight;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; create the transformation and add it to the control&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    var translate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TranslateTransform(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
    control.RenderTransform &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; translate;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; create the animation and start it&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Left &lt;/span&gt;&lt;span style="color:#000000;"&gt;||&lt;/span&gt;&lt;span style="color:#000000;"&gt; tipo &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; AnimationType.Right)
    {
        var da &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DoubleAnimation(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, xEnd, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration(duration));
        translate.BeginAnimation(TranslateTransform.XProperty, da);
    }
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        var da &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DoubleAnimation(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, yEnd, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Duration(duration));
        translate.BeginAnimation(TranslateTransform.YProperty, da);
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Although the code is larger, it is more generic and allows to be reutilized. We can use any control, set the duration and the animation direction. It still isn’t ideal, but it’s better than last code, non reutilizable. On the next posts, we will see other ways to do it. See you then!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1804579" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/CcfLJM2xYr4" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Animations/default.aspx">Animations</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2012/01/11/animando-transi-231-245-es-em-wpf-silverlight-parte-i-code-behind.aspx</feedburner:origLink></item><item><title>Silverlight 5 Beta Preview</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/g5d0thX8S1s/silverlight-5-beta-preview.aspx</link><pubDate>Thu, 14 Apr 2011 18:34:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1791825</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1791825</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2011/04/14/silverlight-5-beta-preview.aspx#comments</comments><description>&lt;p&gt;O Silverlight 5 beta preview foi lan&amp;ccedil;ado no Mix 2011 (&lt;a href="http://live.visitmix.com"&gt;http://live.visitmix.com&lt;/a&gt;), com uma s&amp;eacute;rie de recursos novos:&lt;/p&gt;
&lt;li&gt;XAML Debugging (voc&amp;ecirc; pode setar um breakpoint no XAML e examinar o binding)&lt;/li&gt;
&lt;li&gt;Data Templates impl&amp;iacute;citos, onde voc&amp;ecirc; pode usar um mesmo data template para&amp;nbsp;um determinado tipo, sem explicitar o seu uso&lt;/li&gt;
&lt;li&gt;Suporte para duplo-clique (precisa falar mais?)&lt;/li&gt;
&lt;li&gt;Gr&amp;aacute;ficos 3D e 2D acelerados pela GPU&lt;/li&gt;
&lt;li&gt;Efeitos de som de baixa lat&amp;ecirc;ncia e suporte a WAV&lt;/li&gt;
&lt;li&gt;Suporte a m&amp;uacute;ltiplos displays&lt;/li&gt;
&lt;p&gt;Se voc&amp;ecirc; quer saber mais, veja os v&amp;iacute;deos em &lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;http://www.silverlight.net/getstarted/silverlight-5-beta/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Se voc&amp;ecirc; quer come&amp;ccedil;ar a trabalhar com ele, baixe as seguintes ferramentas (colobora&amp;ccedil;&amp;atilde;o do @fernandomartin - Caverna):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class="tweet-row"&gt;Visual Studio 2010 SP1 &lt;a target="_blank" rel="nofollow" href="http://go.microsoft.com/fwlink/?LinkID=186892" title="http://www.microsoft.com/downloads/en/details.aspx/?FamilyID=26bae65f-b0df-4081-ae6e-1d828993d4d0&amp;amp;displaylang=en" class="twitter-timeline-link"&gt;&lt;span style="color:#2d76b9;"&gt;http://go.microsoft.com/fwlink/?LinkID=186892&lt;/span&gt;&lt;/a&gt;&amp;nbsp;ou Visual Web Developer Express 2010 SP1 &lt;a target="_blank" rel="nofollow" href="http://www.microsoft.com/express/Web/" title="http://www.microsoft.com/express/Web/" class="twitter-timeline-link"&gt;&lt;span style="color:#2d76b9;"&gt;http://www.microsoft.com/express/Web/&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="tweet-row"&gt;Silverlight 5 Tools for Visual Studio &lt;a target="_blank" rel="nofollow" href="http://bit.ly/gjdloV" title="http://www.microsoft.com/downloads/en/details.aspx/?FamilyID=41c85cc4-de12-4bdb-a60f-f120266e9780&amp;amp;displaylang=en" class="twitter-timeline-link"&gt;&lt;span style="color:#2d76b9;"&gt;http://bit.ly/gjdloV&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="tweet-row"&gt;Expression Blend Preview for Silverlight 5 &lt;a target="_blank" rel="nofollow" href="http://bit.ly/dW49Nk" title="http://www.microsoft.com/downloads/en/details.aspx/?FamilyID=22feb67c-4f65-4ced-97cf-5f8ada296445&amp;amp;displaylang=en" class="twitter-timeline-link"&gt;&lt;span style="color:#2d76b9;"&gt;http://bit.ly/dW49Nk&lt;/span&gt;&lt;/a&gt;&amp;nbsp;(opcional)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="tweet-row"&gt;Silverlight 5 SDK CHM &lt;a target="_blank" rel="nofollow" href="http://bit.ly/dPIzRv" title="http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx/?DownloadId=15258&amp;amp;ProjectName=silverlightsdk" class="twitter-timeline-link"&gt;&lt;span style="color:#2d76b9;"&gt;http://bit.ly/dPIzRv&lt;/span&gt;&lt;/a&gt;&amp;nbsp;(opcional, se voc&amp;ecirc; quiser o arquivo de ajuda)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="stream-item-content tweet stream-tweet "&gt;
&lt;div class="tweet-content"&gt;Agora, m&amp;atilde;os &amp;agrave; obra!&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1791825" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/g5d0thX8S1s" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Silverlight/default.aspx">Silverlight</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2011/04/14/silverlight-5-beta-preview.aspx</feedburner:origLink></item><item><title>New WPF Videos (English)</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/SBp-7j3SCy4/new-wpf-videos-english.aspx</link><pubDate>Fri, 25 Mar 2011 20:21:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1790560</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1790560</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2011/03/25/new-wpf-videos-english.aspx#comments</comments><description>&lt;p&gt;My new WPF videos were just published in MSDN Brazil (in portuguese). Although they are geared towards the Windows Application Developer certification (70-511), it&amp;#39;s worth taking a look at them, because they contain may useful tips. The videos are:&lt;/p&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/pt-br/netframework/video/gg675278"&gt;Asynchronous Processes&lt;/a&gt;&amp;nbsp;- With the popularization of multicore processors, it&amp;#39;s very important that our applications use this resource. This video will show how to desing the program in order to create processes that run in parallel, thus using the multiple processors in the machine&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/pt-br/netframework/video/gg675280"&gt;Using Drag &amp;amp; Drop in WPF&lt;/a&gt;&amp;nbsp;- One of the resources for data interchange is Drag &amp;amp; Drop. This video will show how to develop an application that allows dragging and dropping&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/pt-br/netframework/video/gg675279"&gt;Globalization and Localization in .net&lt;/a&gt;&amp;nbsp;- When your program ust run in many countries, you must design it in a way it can change its interface easily to adapt to the new country. This video will show how to design a localized application&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/pt-br/netframework/video/gg675274"&gt;Integration between WPF and Windows Forms&lt;/a&gt;&amp;nbsp;- The introduction of WPF doesn&amp;#39;t mean that Winforms is obsolete. This video shows how you can embed WPF controls in WinForms programs and vice-versa and how these two platforms interact between them&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/pt-br/netframework/video/gg675281"&gt;Security in .net applications&lt;/a&gt;&amp;nbsp;- When you develop an application, you should know what the OS allows in terms of security, or the program will fail when it tries to execute an operation not allowed. This video shows the Windows security resources and how you must design your programs to work fine with security restrictions&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/pt-br/netframework/video/gg675275"&gt;Application Settings in .net&lt;/a&gt;&amp;nbsp;- This video shows the application settings in .net and how to use them&lt;/li&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1790560" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/SBp-7j3SCy4" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/.net+Framework/default.aspx">.net Framework</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2011/03/25/new-wpf-videos-english.aspx</feedburner:origLink></item><item><title>Novos vídeos de WPF</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/jWdgkaYMl48/novos-v-237-deos-de-wpf.aspx</link><pubDate>Fri, 25 Mar 2011 20:20:27 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1790559</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1790559</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2011/03/25/novos-v-237-deos-de-wpf.aspx#comments</comments><description>&lt;p&gt;Meus vídeos de WPF acabaram de ser publicados no MSDN Brasil. Embora eles sejam voltados para a certificação Windows Application Developer (70-511), vale a pena dar uma olhada neles, pois eles contém muitas dicas interessantes. São eles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/pt-br/netframework/video/gg675278"&gt;Processos assíncronos&lt;/a&gt; - Com a popularização de processadores multi-core, torna-se imperativo que nossos programas façam uso deste recurso, tanto para melhorar sua performance como para evitar o bloqueio da interface enquanto o programa executa um outro processamento. Este vídeo irá mostrar técnicas para executar o processamento em paralelo, mostrando como sincronizar o processamento com alterações na interface&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/pt-br/netframework/video/gg675280"&gt;Usando Drag &amp;amp; Drop em WPF&lt;/a&gt; - Um dos recursos do Windows que permitem o intercâmbio de informações é o &amp;quot;Arrastar e Soltar&amp;quot; (Drag &amp;amp; Drop). Você arrasta uma informação de um lugar para outro e, &amp;quot;magicamente&amp;quot;, a informação aparece no destino. Este vídeo irá mostrar como implementar o Drag &amp;amp; Drop em uma mesma aplicação e entre o Explorer e uma aplicação&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/pt-br/netframework/video/gg675279"&gt;Globalização e Localização em .net&lt;/a&gt; - Quando você quer que sua aplicação seja executada em muitos países, você deve projetá-lo de maneira a permitir que a interface mude conforme o país onde está send executado: idioma, configurações regionais, etc. Este vídeo irá mostrar dicas de como projetar uma interface globalizada e como localizar sua aplicação, para que o idioma da interface mude conforme selecionado.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/pt-br/netframework/video/gg675274"&gt;Integração entre WPF e Windows Forms&lt;/a&gt; - A introdução do WPF não significa a completa obsolescência dos programas WinForms. Você pode continuar a desenvolver os programas Winforms e incluir partes em WPF, bem como criar programas WPF que hospedam partes em WinForms. Este vídeo irá mostrar como fazer esta integração entre as duas plataformas e como elas podem interagir entre si.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/pt-br/netframework/video/gg675281"&gt;Segurança em aplicações .net&lt;/a&gt; - Quando você desenvolve uma aplicação, deve ter em mente o que o sistema operacional permite e o que ele não permite, em relação à segurança, senão ele falhará quando executar uma operação não permitida. Este vídeo irá mostrar os recursos de segurança do Windows e como você deve projetar seus programas para que eles comportem-se como projetados em tempo de execução&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/pt-br/netframework/video/gg675275"&gt;Application Settings em .net&lt;/a&gt; - Quando você desenvolve uma aplicação, deve ter em mente o que o sistema operacional permite e o que ele não permite, em relação à segurança, senão ele falhará quando executar uma operação não permitida. Este vídeo irá mostrar os recursos de segurança do Windows e como você deve projetar seus programas para que eles comportem-se como projetados em tempo de execução&lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1790559" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/jWdgkaYMl48" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/.net+Framework/default.aspx">.net Framework</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2011/03/25/novos-v-237-deos-de-wpf.aspx</feedburner:origLink></item><item><title>Pro Business Applications with Silverlight 4 (English)</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/uAp9wPPTgbk/pro-business-applications-with-silverlight-4-english.aspx</link><pubDate>Wed, 08 Dec 2010 12:56:59 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1783749</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1783749</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2010/12/08/pro-business-applications-with-silverlight-4-english.aspx#comments</comments><description>&lt;p&gt;I see that there is a lot of interest in developing business applications with Silverlight, although there are not many books about that subject. The book &lt;a href="http://www.amazon.com/gp/product/1430272074?ie=UTF8&amp;amp;tag=delphistop&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1430272074"&gt;Pro Business Applications with Silverlight 4&lt;/a&gt;&lt;img border="0" src="http://www.assoc-amazon.com/e/ir?t=delphistop&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1430272074" width="1" height="1" alt="" /&gt;, from Chris Anderson, Apress Publishing, brings Silverlight learning under a different concept the business applications development.&lt;/p&gt;  &lt;p&gt;Usually, the Silverlight books bring the platform concepts under a difficulty sequence, but with no concerns with the real world application development. This book concern is the creation of applications: in chapter 5, just after showing an introduction to Silverlight and to XAML and showing an introduction to the navigation framework, it shows RIA Services for data access with Entity Framework.&lt;/p&gt;  &lt;p&gt;In the sequence, the author talks about list generation and data entry forms, following with application security, an unusual topic in books on this subject. The following chapters are on Data Binding, custom control creation and MVVM pattern, a subject almost mandatory in the WPF/Silverlight development.&lt;/p&gt;  &lt;p&gt;The last chapters are about reporting and printing, Out of Browser applications and interaction with the operating system and application deployment. The book is well written and touches many subjects not touched by other books, although they are very important for the business application development.&lt;/p&gt;  &lt;p&gt;The book is focused in using RIA Services, and it lets aside other technologies for data access, like WCF, REST or JSon and there is barely nothing about network access, needed when you want to upload a file to the server or download a file. In the printing chapter, the author showed very little about the printing technology in Silverlight 4, spending a lot of pages to show how you can display PDF files generated on the server. Although this is a viable way to show reports, I don’t think it’s the best one, because we need to resort to tricks like use an IFrame over the Silverlight control, with several problems: it doesn’t work Out of Browser (we need to use the WebBrowser in this case), you cannot show a ChildWindow while it’s visible (the IFrame stays on top of the Silverlight control and hides the ChildWindow) and needs Acrobat Reader installed in the user’s machine. It would be better that, in this chapter, the author had written a mini report generator to aid report generation using Silverlight technology.&lt;/p&gt;  &lt;p&gt;On the other side, the book shows Silverlight under a different aspect, geared towards business applications, what, in my opinion is the real Silverlight vocation. The RIA Services explanation is very complete, and encompasses from the basics through validation, metadata and the use of a presentation layer, that eases the use with the MVVM pattern and the use of authentication.&lt;/p&gt;  &lt;p&gt;In summary, the book is very good for those who want to develop a business application with Silverlight using RIA Services, it contains a lot of information and, as and added bonus, its text contains links to tools, controls or articles that will aid the Silverlight development.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1783749" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/uAp9wPPTgbk" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Livros/default.aspx">Livros</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2010/12/08/pro-business-applications-with-silverlight-4-english.aspx</feedburner:origLink></item><item><title>Pro Business Applications with Silverlight 4</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/xOtCsLypIi8/pro-business-applications-with-silverlight-4.aspx</link><pubDate>Wed, 08 Dec 2010 09:43:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1783736</guid><dc:creator>bsonnino</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1783736</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2010/12/08/pro-business-applications-with-silverlight-4.aspx#comments</comments><description>&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US;"&gt;Vejo que h&amp;aacute; um grande interesse no desenvolvimento de aplica&amp;ccedil;&amp;otilde;es comerciais com Silverlight, embora n&amp;atilde;o haja muita bibliografia sobre o assunto. O livro &lt;a href="http://www.amazon.com/gp/product/1430272074?ie=UTF8&amp;amp;tag=delphistop&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1430272074"&gt;Pro Business Applications with Silverlight 4&lt;/a&gt;&lt;img height="1" width="1" src="http://www.assoc-amazon.com/e/ir?t=delphistop&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1430272074" border="0" alt="" /&gt;, do Chris Anderson, editora Apress, &lt;/span&gt;traz o aprendizado de Silverlight sob um conceito diferente, o desenvolvimento de aplica&amp;ccedil;&amp;otilde;es de neg&amp;oacute;cios.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;Normalmente os livros de Silverlight trazem os conceitos da plataforma em uma sequ&amp;ecirc;ncia l&amp;oacute;gica de dificuldade, mas sem uma preocupa&amp;ccedil;&amp;atilde;o com o desenvolvimento de aplica&amp;ccedil;&amp;otilde;es para o mundo real. J&amp;aacute; este livro preocupa-se com a cria&amp;ccedil;&amp;atilde;o de aplica&amp;ccedil;&amp;otilde;es: logo no cap&amp;iacute;tulo 5, ap&amp;oacute;s mostrar uma introdu&amp;ccedil;&amp;atilde;o ao Silverlight e ao XAML e mostrar o framework de navega&amp;ccedil;&amp;atilde;o, ele mostra o WCF RIA Services para acesso a dados com o Entity Framework. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;Em seguida, o autor fala de gera&amp;ccedil;&amp;atilde;o de listas e de formul&amp;aacute;rios de entrada de dados, seguindo com o t&amp;oacute;pico de seguran&amp;ccedil;a da aplica&amp;ccedil;&amp;atilde;o, t&amp;oacute;pico raramente visto nos livros do assunto. Os cap&amp;iacute;tulos seguintes s&amp;atilde;o sobre Data Binding e a cria&amp;ccedil;&amp;atilde;o de controles personalizados, seguido pelo pattern MVVM, um tema que agora &amp;eacute; quase obrigat&amp;oacute;rio no desenvolvimento WPF/Silverlight. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;Os &amp;uacute;ltimos cap&amp;iacute;tulos s&amp;atilde;o sobre impress&amp;atilde;o e relat&amp;oacute;rios, Out of Browser e intera&amp;ccedil;&amp;atilde;o com o sistema operacional e distribui&amp;ccedil;&amp;atilde;o de aplica&amp;ccedil;&amp;otilde;es. O livro &amp;eacute; bem escrito e aborda diversos t&amp;oacute;picos que normalmente n&amp;atilde;o s&amp;atilde;o tocados pelos livros tradicionais, embora sejam fundamentais para o desenvolvimento de aplica&amp;ccedil;&amp;otilde;es de neg&amp;oacute;cios. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;O livro &amp;eacute; muito centrado em RIA Services, deixando de lado outras tecnologias de acesso a dados, como servi&amp;ccedil;os WCF, REST, Json, al&amp;eacute;m de tocar pouco no acesso a rede, indispens&amp;aacute;vel quando se quer fazer upload de arquivos ou baixar dados do servidor. No cap&amp;iacute;tulo de impress&amp;atilde;o, o autor mostrou muito pouco a tecnologia de impress&amp;atilde;o do Silverlight 4, gastando muitas p&amp;aacute;ginas para mostrar como podemos mostrar arquivos PDF gerados no servidor. Embora esta seja uma forma razo&amp;aacute;vel de mostrar relat&amp;oacute;rios, n&amp;atilde;o considero a melhor, pois devemos recorrer a truques como usar um IFrame sobre o controle Silverlight, com diversos problemas: n&amp;atilde;o funciona OutOfBrowser (devemos usar o WebBrowser, neste caso), n&amp;atilde;o permite mostrar uma ChildWindow quando ativo (ele fica sobre o controle Silverlight e esconde a ChildWindow) e necessita que o Acrobat Reader esteja instalado. Seria muito melhor que, neste cap&amp;iacute;tulo, o autor tivesse escrito um mini gerador de relat&amp;oacute;rios para auxiliar a cria&amp;ccedil;&amp;atilde;o de relat&amp;oacute;rios com a tecnologia do Silverlight.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;Por outro lado, o livro aborda o Silverlight com um enfoque diferente, voltado para aplica&amp;ccedil;&amp;otilde;es de neg&amp;oacute;cios, o que, a meu ver, &amp;eacute; a verdadeira voca&amp;ccedil;&amp;atilde;o do Silverlight. A explica&amp;ccedil;&amp;atilde;o do RIA Services &amp;eacute; bem completa, compreendendo desde o b&amp;aacute;sico, at&amp;eacute; a valida&amp;ccedil;&amp;atilde;o, metadata e o uso de uma camada de apresenta&amp;ccedil;&amp;atilde;o, o que facilita o uso com o pattern MVVM, at&amp;eacute; o uso de autentica&amp;ccedil;&amp;atilde;o.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;"&gt;Em resumo, o livro &amp;eacute; muito bom para quem quer desenvolver uma aplica&amp;ccedil;&amp;atilde;o de neg&amp;oacute;cios com Silverlight usando o RIA Services, ele cont&amp;eacute;m muita informa&amp;ccedil;&amp;atilde;o e, como b&amp;ocirc;nus, seu texto cont&amp;eacute;m links para ferramentas, controles ou artigos que ir&amp;atilde;o auxiliar o desenvolvimento de programas com Silverlight.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1783736" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/xOtCsLypIi8" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Livros/default.aspx">Livros</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2010/12/08/pro-business-applications-with-silverlight-4.aspx</feedburner:origLink></item><item><title>Desenvolvendo com Multi Touch para Windows 7</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/rTT4lOmXSdQ/desenvolvendo-com-multi-touch-para-windows-7.aspx</link><pubDate>Sat, 28 Nov 2009 07:37:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1742668</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1742668</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2009/11/28/desenvolvendo-com-multi-touch-para-windows-7.aspx#comments</comments><description>&lt;p&gt;Se voc&amp;ecirc; quer saber como desenvolver para multitouch em Windows 7, n&amp;atilde;o pode perder o webcast que irei fazer no dia 3/12/2009, &amp;agrave;s 12:00.&lt;/p&gt;
&lt;p&gt;L&amp;aacute; irei mostrar como desenvolver aplica&amp;ccedil;&amp;otilde;es que usam o recurso do multitouch, usando .net Framework 3.5 e tamb&amp;eacute;m mostrando como programar multitouch com o WPF4, que vem por a&amp;iacute;. Ah, e se voc&amp;ecirc; n&amp;atilde;o tem um hardware multitouch, n&amp;atilde;o tem problema: eu irei mostrar como contornar isso, usando dois mouses.&lt;/p&gt;
&lt;p&gt;A inscri&amp;ccedil;&amp;atilde;o &amp;eacute; gratuita e pode ser feita em &lt;a href="https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032433821&amp;amp;EventCategory=4&amp;amp;culture=pt-BR&amp;amp;CountryCode=BR"&gt;https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032433821&amp;amp;EventCategory=4&amp;amp;culture=pt-BR&amp;amp;CountryCode=BR&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At&amp;eacute; l&amp;aacute;&lt;/p&gt;
&lt;p&gt;Bruno&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1742668" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/rTT4lOmXSdQ" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/.net+Framework/default.aspx">.net Framework</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Multitouch/default.aspx">Multitouch</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Windows+7/default.aspx">Windows 7</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2009/11/28/desenvolvendo-com-multi-touch-para-windows-7.aspx</feedburner:origLink></item><item><title>Você sabe o que é um Mashup?</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/pirfE01mkoA/voc-234-sabe-o-que-233-um-mashup.aspx</link><pubDate>Tue, 23 Jun 2009 12:47:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696377</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1696377</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2009/06/23/voc-234-sabe-o-que-233-um-mashup.aspx#comments</comments><description>&lt;p&gt;Se voc&amp;ecirc; n&amp;atilde;o sabe o que &amp;eacute; um mashup, vale a pena saber: mashups s&amp;atilde;o &amp;quot;misturas&amp;quot; de dados que permitem combinar dados de diversas fontes, criando uma visualiza&amp;ccedil;&amp;atilde;o unica, resumida. Por exemplo, voc&amp;ecirc; pode pegar dados de clientes, com suas localiza&amp;ccedil;&amp;otilde;es e colocar &amp;quot;pins&amp;quot; no mapa, com indica&amp;ccedil;&amp;otilde;es dos clientes. Ou voc&amp;ecirc; pode pegar dados estat&amp;iacute;sticos e plotar gr&amp;aacute;ficos ou criar mapas que mostram a atividade no mundo.&lt;/p&gt;
&lt;p&gt;Enfim, as oportunidades para criar um mashup s&amp;atilde;o praticamente infinitas. A Microsoft criou um gerador de mashops, o PopFly creator, onde voc&amp;ecirc; pode criar seus blocos, que extraem os dados de diversas fontes e geram sa&amp;iacute;das diversas. Estes blocos s&amp;atilde;o criados usando Javascript, isto &amp;eacute;, n&amp;atilde;o necessitam de nenhuma linguagem especial. Se voc&amp;ecirc; acha que pode ser complicado criar um bloco, n&amp;atilde;o precisa se aventurar a tanto, no in&amp;iacute;cio: voc&amp;ecirc; pode usar os blocos criados por outras pessoas, que est&amp;atilde;o dispon&amp;iacute;veis e que, inclusive, podem ser alterados por voc&amp;ecirc;.&lt;/p&gt;
&lt;p&gt;Para mostrar como &amp;eacute; f&amp;aacute;cil criar um mashup, vamos fazer um. Para isso, vamos usar os blocos criados pelo meu filho Roberto e pelo Bruno Reis, que est&amp;atilde;o concorrendo na etapa mundial da ImagineCup 2009, na categoria Mashup, o &lt;a href="http://virtualdreams.com.br/knoworld"&gt;KnoWorld&lt;/a&gt;. Os blocos criados por eles tem diversas funcionalidades. Por exemplo, o GapMinder extrai dados de diversos indicadores (voc&amp;ecirc; pode ter a lista completa em &lt;a href="http://tinyurl.com/gap-ind"&gt;http://tinyurl.com/gap-ind&lt;/a&gt;) e disponibiliza-os em formato ano/valor ou pa&amp;iacute;s/valor, de maneira que voc&amp;ecirc; pode obter uma s&amp;eacute;rie temporal (quando quer ver a evolu&amp;ccedil;&amp;atilde;o de um indicador num pa&amp;iacute;s) ou espacial (quando quer ver a distribui&amp;ccedil;&amp;atilde;o de um indicador no mundo, num determinado ano).&lt;/p&gt;
&lt;p&gt;A partir da&amp;iacute;, voc&amp;ecirc; pode plotar estes dados usando os blocos TimePlot (que mostra os dados, ligando-os a uma s&amp;eacute;rie de eventos), ou Google Charts (que plota um gr&amp;aacute;fico de barras, de linha, ou mesmo um mapa mundi colorido).&lt;/p&gt;
&lt;p&gt;No meu caso, eu queria verificar a correla&amp;ccedil;&amp;atilde;o entre o consumo de &amp;oacute;leo no Brasil, com a emiss&amp;atilde;o de CO2, para ver se h&amp;aacute; correspond&amp;ecirc;ncia entre os dois indicadores. Fui at&amp;eacute; &lt;a href="http://www.popfly.com/mashupcreator"&gt;http://www.popfly.com/mashupcreator&lt;/a&gt;, dei meu login do passport e comecei a criar o mashup. Inicialmente, coloquei dois blocos GapMinder (basta teclar na caixa de pesquisa, que ele aparece). Configurei o primeiro GapMinder para a opera&amp;ccedil;&amp;atilde;o &amp;quot;getByCountry&amp;quot; e o indicador &amp;quot;Oil consumption&amp;quot;. Selecionei o pa&amp;iacute;s Brasil. O segundo GapMinder foi configurado para o indicador &amp;quot;Total CO2 emissions (thousand tonnes)&amp;quot;. Em seguida, coloquei dois blocos Filter. Estes blocos filtram os dados para as condi&amp;ccedil;&amp;otilde;es selecionadas. Como o GapMinder gera&amp;nbsp;muitas informa&amp;ccedil;&amp;otilde;es, iremos filtrar os dados&amp;nbsp;a partir de 1965, mostrando os dados de 5 em 5 anos.&amp;nbsp;Em seguida, liguei a sa&amp;iacute;da dos GapMinders aos Filters. Configurei os&amp;nbsp;blocos Filter como&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;List: Source - GapMinder - Value: [entire TimeSeries object]&lt;/li&gt;
&lt;li&gt;Condition: Custom - Value: x.year &amp;gt;= 1965 &amp;amp;&amp;amp; x.year % 5 == 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;Finalmente, adicionei um bloco Google Charts e liguei a sa&amp;iacute;da dos dois Filters &amp;agrave; entrada do Google Charts. Configurei o Google Charts como&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Operations: plotLineChart&lt;/li&gt;
&lt;li&gt;X Values: Filter - Value: year&lt;/li&gt;
&lt;li&gt;Y Values: Filter - Value: value&lt;/li&gt;
&lt;li&gt;XValues2: Custom - Value:&amp;nbsp; (deixar um espa&amp;ccedil;o em branco para plotar o gr&amp;aacute;fico)&lt;/li&gt;
&lt;li&gt;Y Values2: Filter(2) - Value: value&lt;/li&gt;
&lt;li&gt;ShowImage: true&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pronto. Isto &amp;eacute; tudo o que precisamos. O Mashup ficou como a figura abaixo&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino/6355.Mashup.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino/6355.Mashup.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A&amp;iacute; &amp;eacute; s&amp;oacute; executar o mashup e ver o resultado, como em:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino/2642.MashupGraph.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/bsonnino/2642.MashupGraph.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como voc&amp;ecirc;s podem ver, o consumo de &amp;oacute;leo corre em paralelo com a emiss&amp;atilde;o de CO2. Se voc&amp;ecirc;s quiserem ver o mashup, ele est&amp;aacute; em &lt;a href="http://www.popfly.com/users/BSonnino/Oil%20consumption%20vs%20CO2%20Emission%20in%20Brazil"&gt;http://www.popfly.com/users/BSonnino/Oil%20consumption%20vs%20CO2%20Emission%20in%20Brazil&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Como voc&amp;ecirc;s podem ver, criar um mashup &amp;eacute; muito f&amp;aacute;cil, j&amp;aacute; imaginaram as possibilidades?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696377" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/pirfE01mkoA" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Knoworld/default.aspx">Knoworld</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/PopFly/default.aspx">PopFly</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Mashup/default.aspx">Mashup</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2009/06/23/voc-234-sabe-o-que-233-um-mashup.aspx</feedburner:origLink></item><item><title>Campeão ImagineCup Brasil 2009</title><link>http://feedproxy.google.com/~r/BrunoSonnino/~3/2psgdv3Ar9E/campe-227-o-imaginecup-brasil-2009.aspx</link><pubDate>Sat, 25 Apr 2009 13:09:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1690908</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1690908</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2009/04/25/campe-227-o-imaginecup-brasil-2009.aspx#comments</comments><description>&lt;p&gt;Meus filhos Roberto e Eduardo, juntamente com o Bruno Reis foram campe&amp;otilde;es na etapa Brasil de Software Design da ImagineCup, com o projeto HealthTag, um projeto que permite o apoio a projetos de sa&amp;uacute;de para pacientes em locais remotos, usando uma s&amp;eacute;rie de recursos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Tag&lt;/li&gt;
&lt;li&gt;Microsoft HealthVault&lt;/li&gt;
&lt;li&gt;Microsoft Azure&lt;/li&gt;
&lt;li&gt;WPF&lt;/li&gt;
&lt;li&gt;Mobile&lt;/li&gt;
&lt;li&gt;Multitouch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A pr&amp;oacute;xima etapa &amp;eacute; no Egito, onde eles tentar&amp;atilde;o conquistar o t&amp;iacute;tulo mundial de SD, um t&amp;iacute;tulo in&amp;eacute;dito para o Brasil. O press release oficial est&amp;aacute; em &lt;a href="http://s2.com.br/scripts/release.asp?clienteId=361&amp;amp;releaseId=22559"&gt;http://s2.com.br/scripts/release.asp?clienteId=361&amp;amp;releaseId=22559&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1690908" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/BrunoSonnino/~4/2psgdv3Ar9E" height="1" width="1"/&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Imagine+Cup/default.aspx">Imagine Cup</category><feedburner:origLink>http://msmvps.com/blogs/bsonnino/archive/2009/04/25/campe-227-o-imaginecup-brasil-2009.aspx</feedburner:origLink></item></channel></rss>
