<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" 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/"><channel><title>Bruno Sonnino : WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx</link><description>Tags: WPF</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Desenvolvendo com Multi Touch para Windows 7</title><link>http://msmvps.com/blogs/bsonnino/archive/2009/11/28/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 xmlns:wfw="http://wellformedweb.org/CommentAPI/">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;</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></item><item><title>Interoperabilidade entre WPF e Windows Forms</title><link>http://msmvps.com/blogs/bsonnino/archive/2009/02/14/interoperabilidade-entre-wpf-e-windows-forms.aspx</link><pubDate>Sat, 14 Feb 2009 06:30:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1672238</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1672238</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2009/02/14/interoperabilidade-entre-wpf-e-windows-forms.aspx#comments</comments><description>&lt;p&gt;Se voc&amp;ecirc; tem aplica&amp;ccedil;&amp;otilde;es Windows Forms e quer port&amp;aacute;-las para WPF, n&amp;atilde;o precisa fazer todo o trabalho de uma &amp;uacute;nica vez. Voc&amp;ecirc; pode misturar controles e janelas WPF nas aplica&amp;ccedil;&amp;otilde;es Windosw Forms (e tamb&amp;eacute;m colocar controles WinForms em aplica&amp;ccedil;&amp;otilde;es WPF). Se quer saber mais sobre isso, pode dar uma olhada em meu artigo no portal MSDN Brasil: &lt;a href="http://msdn.microsoft.com/pt-br/library/dd448660.aspx"&gt;http://msdn.microsoft.com/pt-br/library/dd448660.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;L&amp;aacute; eu mostro como colocar um controle WPF em janelas WinForms, controles WinForms em janelas WPF e como chamar janelas WinForms em programas WPF.&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=1672238" width="1" height="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></item><item><title>10K Smart Coding Challenge</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/12/18/10k-smart-coding-challenge.aspx</link><pubDate>Thu, 18 Dec 2008 18:43:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1657157</guid><dc:creator>bsonnino</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1657157</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/12/18/10k-smart-coding-challenge.aspx#comments</comments><description>&lt;p&gt;Voc&amp;ecirc; quer ir ao Mix 2009, em Las Vegas, mas o dinheiro est&amp;aacute; curto? Bem, aqui est&amp;aacute; sua oportunidade de ir ao Mix, com entrada, hotel e mais $1500 no bolso: o concurso 10K Smart Coding Challenge: crie um programa Silverlight ou WPF com at&amp;eacute; 10K de c&amp;oacute;digo fonte e concorra a uma viagem ao Mix. O regulamento e os dados est&amp;atilde;o em &lt;a href="http://2009.visitmix.com/MIXtify/TenKGallery.aspx"&gt;http://2009.visitmix.com/MIXtify/TenKGallery.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Boa Sorte!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1657157" width="1" height="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></item><item><title>Usando a DataGrid WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/12/12/usando-a-datagrid-wpf.aspx</link><pubDate>Fri, 12 Dec 2008 20:30:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1656625</guid><dc:creator>bsonnino</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1656625</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/12/12/usando-a-datagrid-wpf.aspx#comments</comments><description>&lt;p&gt;Uma das cr&amp;iacute;ticas ao WPF &amp;eacute; que n&amp;atilde;o havia uma DataGrid para mostrar os dados em formato de tabela. Bem, isso &amp;eacute; passado. A Microsoft lan&amp;ccedil;ou a Datagrid no WPF toolkit, que pode ser baixado em &lt;a href="http://www.codeplex.com/wpf"&gt;http://www.codeplex.com/wpf&lt;/a&gt;. Ela &amp;eacute; bastante poderosa e vers&amp;aacute;til. Se voc&amp;ecirc; n&amp;atilde;o sabe como us&amp;aacute;-la, pode checar meu artigo no portal Linha de C&amp;oacute;digo em &lt;a href="http://www.linhadecodigo.com.br/Artigo.aspx?id=2163"&gt;http://www.linhadecodigo.com.br/Artigo.aspx?id=2163&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vale a pena dar uma conferida!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1656625" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Criação de aplicativos LOB (Line-of-Business) com WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/11/21/cria-231-227-o-de-aplicativos-lob-line-of-business-com-wpf.aspx</link><pubDate>Fri, 21 Nov 2008 20:42:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1654777</guid><dc:creator>bsonnino</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1654777</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/11/21/cria-231-227-o-de-aplicativos-lob-line-of-business-com-wpf.aspx#comments</comments><description>&lt;p&gt;Se voc&amp;ecirc; achava que &amp;eacute; muito dif&amp;iacute;cil desenvolver aplica&amp;ccedil;&amp;otilde;es LOB com WPF, precisa ver este meu novo artigo que foi publicado no site Linha de C&amp;oacute;digo (&lt;a href="http://www.linhadecodigo.com.br/Artigo.aspx?id=2138"&gt;http://www.linhadecodigo.com.br/Artigo.aspx?id=2138&lt;/a&gt;). L&amp;aacute; eu mostro como desenvolver uma aplica&amp;ccedil;&amp;atilde;o LOB com WPF, usando LINQ to SQL. &lt;/p&gt;
&lt;p&gt;No artigo eu mostro como fazer a inclus&amp;atilde;o, altera&amp;ccedil;&amp;atilde;o e exclus&amp;atilde;o&amp;nbsp;usando LINQ to SQL. L&amp;aacute; tamb&amp;eacute;m mostro como criar um UserControl que &amp;eacute; instanciado em tempo de execu&amp;ccedil;&amp;atilde;o e permite editar os registros detalhes&amp;nbsp;tabelas relacionadas como mestre-detalhe.&amp;nbsp;Vale a pena dar uma olhada e ver que n&amp;atilde;o &amp;eacute; t&amp;atilde;o complicado desenvolver aplica&amp;ccedil;&amp;otilde;es LOB com WPF&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=1654777" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Gravação de meu Webcast no MSDN</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/11/08/grava-231-227-o-de-meu-webcast-no-msdn.aspx</link><pubDate>Sat, 08 Nov 2008 08:37:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653490</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1653490</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/11/08/grava-231-227-o-de-meu-webcast-no-msdn.aspx#comments</comments><description>&lt;p&gt;Se voc&amp;ecirc; n&amp;atilde;o teve oportunidade de assistir meu webcast Aplica&amp;ccedil;&amp;otilde;es = Desenvolvedores + Designers do dia 30/10, agora pode baix&amp;aacute;-lo no MediaCenter do MSDN. O link &amp;eacute; &lt;a href="https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&amp;amp;EventID=1032392195&amp;amp;CountryCode=BR"&gt;https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&amp;amp;EventID=1032392195&amp;amp;CountryCode=BR&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vale a pena assistir, ele mostra como a intera&amp;ccedil;&amp;atilde;o entre designers e desenvolvedores pode transformar uma aplica&amp;ccedil;&amp;atilde;o simples como um cat&amp;aacute;logo de m&amp;oacute;veis numa bonita aplica&amp;ccedil;&amp;atilde;o. Este webcast foi baseado numa apresenta&amp;ccedil;&amp;atilde;o dada no Mix 2008, pelo &lt;a href="http://blog.kirupa.com/"&gt;&lt;span style="color:#003366;"&gt;Kirupa Chinnathambi&lt;/span&gt;&lt;/a&gt;&amp;nbsp;e pelo &lt;a href="http://www.nibblestutorials.net/"&gt;Celso Gomes&lt;/a&gt;, dois feras do time de Expression Blend.&lt;/p&gt;
&lt;p&gt;O c&amp;oacute;digo fonte da aplica&amp;ccedil;&amp;atilde;o est&amp;aacute; anexo a este post&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1653490" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.65.34.90/FurnitureShowroom.zip" length="4093350" type="application/x-zip-compressed" /><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Novos controles para WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/10/31/novos-controles-para-wpf.aspx</link><pubDate>Fri, 31 Oct 2008 15:05:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1652662</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1652662</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/10/31/novos-controles-para-wpf.aspx#comments</comments><description>&lt;p&gt;Uma das cr&amp;iacute;ticas mais ouvidas sobre o WPF &amp;eacute; a falta de alguns controles, como a Grid, o DateTimePicker, entre outros. Pouco a pouco, a Microsoft est&amp;aacute; lan&amp;ccedil;ando estes controles. Voc&amp;ecirc; pode baixar o c&amp;oacute;digo fonte da Grid e do DateTimePicker no CodePlex em &lt;a href="http://www.codeplex.com/wpf/Release/ProjectReleases.aspx?ReleaseId=15598"&gt;http://www.codeplex.com/wpf/Release/ProjectReleases.aspx?ReleaseId=15598&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Se quiser, pode baixar tamb&amp;eacute;m o Ribbon para WPF. Para isso, voc&amp;ecirc; deve it para o site de licenciamento do Office, aceitar a licen&amp;ccedil;a do Office UI e baixar o c&amp;oacute;digo fonte. Os passos para isso est&amp;atilde;o em &lt;a href="http://www.codeplex.com/wpf/Wiki/View.aspx?title=WPF%20Ribbon%20Preview"&gt;http://www.codeplex.com/wpf/Wiki/View.aspx?title=WPF%20Ribbon%20Preview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mas isto n&amp;atilde;o &amp;eacute; tudo, porque a&amp;iacute; vem mais. D&amp;ecirc;em uma olhada em &lt;a href="http://www.codeplex.com/wpf/Wiki/View.aspx?title=Futures%20Roadmap&amp;amp;referringTitle=Home"&gt;http://www.codeplex.com/wpf/Wiki/View.aspx?title=Futures%20Roadmap&amp;amp;referringTitle=Home&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=1652662" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Webcast sobre criação de aplicações WPF com Visual Studio e Blend</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/10/27/webcast-sobre-cria-231-227-o-de-aplica-231-245-es-wpf-com-visual-studio-e-blend.aspx</link><pubDate>Mon, 27 Oct 2008 18:25:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1652148</guid><dc:creator>bsonnino</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1652148</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/10/27/webcast-sobre-cria-231-227-o-de-aplica-231-245-es-wpf-com-visual-studio-e-blend.aspx#comments</comments><description>&lt;p&gt;Na quinta feira, dia 30/10/2008, &amp;agrave;s 12:00, estarei apresentando um novo webcast no MSDN, sobre desenvolvimento de aplica&amp;ccedil;&amp;otilde;es WPF com o Visual Studio e o Blend. Este webcast vai mostrar a intera&amp;ccedil;&amp;atilde;o entre designers e desenvolvedores, com a finalidade de criar uma bonita aplica&amp;ccedil;&amp;atilde;o em WPF. Vale apena assistir. O link para inscri&amp;ccedil;&amp;atilde;o &amp;eacute; &lt;a href="https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032392194&amp;amp;EventCategory=4&amp;amp;culture=pt-BR&amp;amp;CountryCode=BR"&gt;https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032392194&amp;amp;EventCategory=4&amp;amp;culture=pt-BR&amp;amp;CountryCode=BR&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=1652148" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Lançado o starter kit para criação de readers em WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/01/16/lan-231-ado-o-starter-kit-para-cria-231-227-o-de-readers-em-wpf.aspx</link><pubDate>Wed, 16 Jan 2008 20:27:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1466355</guid><dc:creator>bsonnino</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1466355</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/01/16/lan-231-ado-o-starter-kit-para-cria-231-227-o-de-readers-em-wpf.aspx#comments</comments><description>&lt;p&gt;Se você ainda não conhece o &lt;a href="http://firstlook.nytimes.com/"&gt;New York Times Reader&lt;/a&gt; vale a pena conhecê-lo, pois é um ótimo exemplo de aplicação WPF. &lt;/p&gt;&lt;p&gt;Se você gostou mesmo dele e quer desenvolver algo semelhante, chegou a hora: a Microsoft lançou o reader toolkit, com o nome de &lt;a href="http://windowsclient.net/wpf/starter-kits/sce.aspx"&gt;Syndicated Client Experiences Starter Kit&lt;/a&gt; para que qualquer um possa desenvolver seus readers. Além diss, ela disponibilizou um reader muito interessante do &lt;a href="http://windowsclient.net/apps/MsdnReaderSetup.exe"&gt;MSDN Magazine&lt;/a&gt; com &lt;a href="http://download.microsoft.com/download/1/b/e/1beee8a1-6131-4ea2-b9f6-f9b2684f4295/SceReaderSourceCode.EXE"&gt;código fonte&lt;/a&gt;. Vale a pena dar uma olhada!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1466355" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Zoom no canvas em WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/01/11/zoom-no-canvas-em-wpf.aspx</link><pubDate>Fri, 11 Jan 2008 13:50:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1455558</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1455558</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/01/11/zoom-no-canvas-em-wpf.aspx#comments</comments><description>&lt;p&gt;Muitas vezes, queremos fazer um zoom em componentes WPF. Como todo o desenho é vetorial, não há perda de resolução neste processo.&lt;/p&gt;&lt;p&gt;Uma maneira de fazer o zoom é usar uma transformação, do tipo &lt;b&gt;ScaleTransform&lt;/b&gt;. O &lt;b&gt;ScaleTransform&lt;/b&gt; aumenta ou diminui o tamanho do componente, segundo suas propriedades &lt;b&gt;ScaleX&lt;/b&gt; e &lt;b&gt;ScaleY&lt;/b&gt;. Por exemplo, se quisermos aumentar ou diminuir o zoom no canvas do &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2008/01/09/movendo-shapes-com-o-mouse-em-wpf.aspx"&gt;post anterior&lt;/a&gt;, podemos fazer o seguinte: no arquivo xaml, criamos um &lt;b&gt;DockPanel &lt;/b&gt;para armazenar os botões e o canvas:&lt;/p&gt;&lt;p&gt;
&lt;code&gt;&amp;nbsp; &amp;lt;DockPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StackPanel Orientation=&amp;quot;Horizontal&amp;quot; Height=&amp;quot;40&amp;quot; DockPanel.Dock=&amp;quot;Top&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button x:Name=&amp;quot;maisZoom&amp;quot; Click=&amp;quot;maisZoom_Click&amp;quot; Margin=&amp;quot;5&amp;quot; Content=&amp;quot;Mais zoom&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button x:Name=&amp;quot;menosZoom&amp;quot; Click=&amp;quot;menosZoom_Click&amp;quot; Margin=&amp;quot;5&amp;quot; Content=&amp;quot;Menos zoom&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock x:Name=&amp;quot;textZoom&amp;quot; Text=&amp;quot;Zoom: 100%&amp;quot; VerticalAlignment=&amp;quot;Center&amp;quot; Margin=&amp;quot;5&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;Canvas....&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Canvas&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/DockPanel&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Na parte superior do DockPanel colocamos um StackPanel. Nesse StackPanel colocamos dois botões e um textblock que irá mostrar o zoom atual.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Em seguida, criamos uma transformação (&lt;b&gt;LayoutTransform&lt;/b&gt;) para o canvas, inicializando a escala para 1:&lt;/p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Canvas...&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Canvas.LayoutTransform&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScaleTransform x:Name=&amp;quot;canvasZoom&amp;quot; ScaleX=&amp;quot;1&amp;quot; ScaleY=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Canvas.LayoutTransform&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;/code&gt;&lt;p&gt;&amp;nbsp;Finalmente, colocamos o código para o evento Click dos botões:&lt;/p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void maisZoom_Click(object sender, RoutedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvasZoom.ScaleX += 0.1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvasZoom.ScaleY += 0.1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; textZoom.Text = String.Format(&amp;quot;Zoom: {0}%&amp;quot;, canvasZoom.ScaleX * 100);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void menosZoom_Click(object sender, RoutedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvasZoom.ScaleX -= 0.1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvasZoom.ScaleY -= 0.1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; textZoom.Text = String.Format(&amp;quot;Zoom: {0}%&amp;quot;, canvasZoom.ScaleX * 100);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;/code&gt;&lt;p&gt;Executando o programa, vemos que os botões aumentam ou diminuem o zoom do canvas, sem nenhuma perda de resolução.&lt;/p&gt;&lt;p&gt;Quando aumentamos o zoom, o Canvas aumenta de tamanho, mas não há nenhuma indicação disso: devemos aumentar nossa janela para ver o restante da imagem. Podemos usar barras de rolagem para ver o restante da imagem quando o zoom é maior que 100%. Para isso, colocamos o Canvas dentro de um &lt;b&gt;ScrollViewer&lt;/b&gt;:&lt;/p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScrollViewer HorizontalScrollBarVisibility=&amp;quot;Auto&amp;quot; VerticalScrollBarVisibility=&amp;quot;Auto&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Canvas ...&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; .... &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Canvas&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScrollViewer&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;p&gt;O ScrollViewer apresenta barras de rolagem que são mostradas quando o tamanho de seu conteúdo é maior que seu tamanho. Assim, se dermos um zoom no Canvas que faça que ele fique maior que a área útil do ScrollViewer, as barras de rolagem aparecerão.&lt;/p&gt;&lt;p&gt;O projeto completo pode ser baixado &lt;a href="http://www.revolution.com.br/dragshapes2.zip"&gt;aqui&lt;/a&gt;&amp;nbsp;&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=1455558" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Movendo Shapes com o mouse em WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2008/01/09/movendo-shapes-com-o-mouse-em-wpf.aspx</link><pubDate>Wed, 09 Jan 2008 07:30:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1449702</guid><dc:creator>bsonnino</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1449702</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2008/01/09/movendo-shapes-com-o-mouse-em-wpf.aspx#comments</comments><description>&lt;p&gt;Em WPF, uma Shape (retângulos, elipses, linhas,..) é um FrameworkElement e recebe os eventos de mouse e teclado, como qualquer outro FrameworkElement (botões, por exemplo). Isto é muito diferente de WinForms, onde as formas desenhadas usando GDI+ são apenas desenhos na tela e não recebem nenhum evento.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Podemos usar isso para movimentar nossas shapes com o mouse usando os eventos &lt;i&gt;PreviewMouseLeftButtonDown&lt;/i&gt;, &lt;i&gt;PreviewMouseLeftButtonUp&lt;/i&gt; e &lt;i&gt;PreviewMouseMove&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;Inicialmente, colocamos algumas shapes no Canvas:&lt;/p&gt;&lt;p&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Canvas x:Name=&amp;quot;canvas1&amp;quot; PreviewMouseLeftButtonDown=&amp;quot;canvas1_PreviewMouseDown&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PreviewMouseMove=&amp;quot;canvas1_PreviewMouseMove&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PreviewMouseLeftButtonUp=&amp;quot;canvas1_PreviewMouseUp&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle Canvas.Top=&amp;quot;10&amp;quot; Canvas.Left=&amp;quot;10&amp;quot; Width=&amp;quot;20&amp;quot; Height=&amp;quot;40&amp;quot; Fill=&amp;quot;Fuchsia&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Ellipse Canvas.Top=&amp;quot;25&amp;quot; Canvas.Left=&amp;quot;50&amp;quot; Width=&amp;quot;40&amp;quot; Height=&amp;quot;40&amp;quot; Fill=&amp;quot;DarkSeaGreen&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Line Canvas.Top=&amp;quot;120&amp;quot; Canvas.Left=&amp;quot;50&amp;quot; X1=&amp;quot;10&amp;quot; Y1=&amp;quot;10&amp;quot; X2=&amp;quot;50&amp;quot; Y2=&amp;quot;50&amp;quot; Stroke=&amp;quot;Navy&amp;quot; StrokeThickness=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Polygon Canvas.Top=&amp;quot;50&amp;quot; Canvas.Left=&amp;quot;120&amp;quot; Points=&amp;quot;30,20 80,24 80,54 30,20&amp;quot; Fill=&amp;quot;Red&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Canvas&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Como podemos ver, colocamos os manipuladores de eventos no Canvas. Devido ao recurso de Bubbling e Tunneling, os eventos são propagados por toda a árvore de elementos e, quando clicamos em qualquer uma das shapes, o Canvas recebe o evento também. Assim, podemos processar os eventos em um único local, não nos preocupando de atribuir os manipuladores para cada shape do desenho.&lt;/p&gt;&lt;p&gt;&amp;nbsp;No código fonte, definimos alguns campos auxiliares:&lt;/p&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point start; // Ponto base para a movimentação&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int currentZ = 0; // Z-Index atual&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool isDragging = false; // Está movendo?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Shape movedElement; // Elemento sendo movido&lt;br /&gt;&lt;/code&gt;
&lt;p&gt;O manipulador para o evento &lt;i&gt;PreviewMouseLeftButtonDown&lt;/i&gt; é:&lt;/p&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void canvas1_PreviewMouseDown(object sender, MouseButtonEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Verifica se clicamos numa Shape&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (e.Source is Shape)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pega posição atual do mouse&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start = e.GetPosition(canvas1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Inicializa variáveis e configura opacidade da shape para 0.5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; isDragging = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; movedElement = (Shape)e.Source;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Shape)e.Source).Opacity = 0.5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvas1.CaptureMouse();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Handled = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;
&lt;p&gt;Aqui, inicializamos a variável &lt;b&gt;start&lt;/b&gt; com a posição que o mouse foi clicado, configuramos &lt;b&gt;isDragging&lt;/b&gt; para &lt;b&gt;true&lt;/b&gt;, deixamos o elemento semi-transparente e capturamos o mouse. O manipulador para o evento &lt;i&gt;PreviewMouseMove&lt;/i&gt; é:&lt;/p&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void canvas1_PreviewMouseMove(object sender, MouseEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (isDragging)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point Pt = e.GetPosition(canvas1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pega posição atual da shape&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; double CurrentLeft = (double)movedElement.GetValue(Canvas.LeftProperty);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; double CurrentTop = (double)movedElement.GetValue(Canvas.TopProperty);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calcula nova posição&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; double newLeft = CurrentLeft + Pt.X - start.X;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; double newTop = CurrentTop + Pt.Y - start.Y;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reposiciona elemento&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; movedElement.SetValue(Canvas.LeftProperty, newLeft);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; movedElement.SetValue(Canvas.TopProperty, newTop);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start = Pt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Handled = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;
&lt;p&gt;Aqui verificamos se estamos arrastando um elemento. Se estivermos, pegamos a nova posição do mouse, recalculamos a posição da Shape e movemos. Como a posição é dada por attached properties, devemos usar &lt;i&gt;SetValue &lt;/i&gt;e &lt;i&gt;GetValue&lt;/i&gt; para obter e alterar as propriedades &lt;b&gt;Canvas.Left&lt;/b&gt; e &lt;b&gt;Canvas.Top&lt;/b&gt;. Finalmente, fechamos o movimento no evento &lt;i&gt;PreviewMouseLeftButtonUp&lt;/i&gt;:&lt;/p&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void canvas1_PreviewMouseUp(object sender, MouseButtonEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Restaura valores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; movedElement.Opacity = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; movedElement.SetValue(Canvas.ZIndexProperty, ++currentZ);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; isDragging = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvas1.ReleaseMouseCapture();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;
&lt;p&gt;Aqui apenas restauramos os valores. Uma coisa que deve ser notada é que estamos alterando a propriedade &lt;b&gt;Canvas.ZIndex&lt;/b&gt;. Isto é devido ao fato que queremos que os elementos que movemos fiquem sempre por cima dos outros. Assim, usamos a variável &lt;i&gt;currentZ&lt;/i&gt; para guardar o ZIndex, incrementando-o a cada movimento, de maneira que a cada vez que movemos um elemento, ele tenha um ZIndex maior que o anterior.&lt;/p&gt;&lt;p&gt;Desta maneira, podemos mover os elementos dentro de uma janela WPF. Note que este código pode ser estendido a qualquer FrameworkElement, não sendo apenas para Shapes.&lt;br /&gt; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1449702" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Trocando o Enter pelo Tab em WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/12/27/trocando-o-enter-pelo-tab-em-wpf.aspx</link><pubDate>Thu, 27 Dec 2007 12:25:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1421886</guid><dc:creator>bsonnino</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1421886</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/12/27/trocando-o-enter-pelo-tab-em-wpf.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;Uma pergunta muito comum que vejo por aí é como trocar o Enter pelo Tab. Normalmente, deve-se manipular o evento de tecla pressionada, verificar se é um Enter e mudar o foco para o elemento seguinte na lista de tabulação. Em WPF, podemos criar um manipulador para o evento &lt;b&gt;PreviewKeyDown&lt;/b&gt; da janela (no WPF, os eventos são propagados por toda a árvore de elementos, assim, os eventos de tecla obrigatoriamente passam pela janela, independente de onde tenham sido gerados), como o seguinte:&lt;/p&gt;&lt;font size="2"&gt;
&lt;/font&gt;&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; Window_PreviewKeyDown(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt; sender, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;KeyEventArgs&lt;/font&gt;&lt;font size="2"&gt; e)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (e.Key == 
&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Key&lt;/font&gt;&lt;font size="2"&gt;.Return)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; {&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FocusNavigationDirection&lt;/font&gt;&lt;font size="2"&gt; focusDirection = &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;FocusNavigationDirection&lt;/font&gt;&lt;font size="2"&gt;.Next;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TraversalRequest&lt;/font&gt;&lt;font size="2"&gt; 
request = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;TraversalRequest&lt;/font&gt;&lt;font size="2"&gt;(focusDirection);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#2b91af" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UIElement&lt;/font&gt;&lt;font size="2"&gt; 
elementWithFocus = &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Keyboard&lt;/font&gt;&lt;font size="2"&gt;.FocusedElement &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;as&lt;/font&gt;&lt;font size="2"&gt; 
&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;UIElement&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; 
(elementWithFocus != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elementWithFocus.MoveFocus(request);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Handled = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;}&lt;/font&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=1421886" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Entrevista comigo no XAMLCast</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/12/27/entrevista-comigo-no-xamlcast.aspx</link><pubDate>Thu, 27 Dec 2007 11:10:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1421821</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1421821</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/12/27/entrevista-comigo-no-xamlcast.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;Meu filho Roberto e o Rodrigo Kono criaram um podcast sobre WPF e XAML, que vale a pena conferir. Eles estão fazendo uma série de entrevistas com os palestrantes de WPF/Silverlight do TechEd e fizeram uma entrevista comigo, de 30 minutos. Vale a pena dar uma conferida em &lt;a href="http://www.xamlcast.net"&gt;http://www.xamlcast.net&lt;/a&gt; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1421821" width="1" height="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></item><item><title>Artigo meu sobre acesso a banco de dados com WPF e LINQ</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/12/21/artigo-meu-sobre-acesso-a-banco-de-dados-com-wpf-e-linq.aspx</link><pubDate>Fri, 21 Dec 2007 20:43:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1410416</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1410416</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/12/21/artigo-meu-sobre-acesso-a-banco-de-dados-com-wpf-e-linq.aspx#comments</comments><description>&lt;p&gt;Hoje postei um novo artigo no CodeProject sobre acesso a dados com WPF e LINQ, mostrando como você pode criar um visual bonito, filtrar, classificar e agrupar os dados sem código usando WPF. Isso ligado ao LINQ, que sem dúvida é uma tecnologia que veio para ficar. Se você quer saber mais, dê uma conferida em &lt;a href="http://www.codeproject.com/KB/WPF/wpfviews.aspx"&gt;http://www.codeproject.com/KB/WPF/wpfviews.aspx&lt;/a&gt;. Se você gostar do artigo, cadastre-se e vote nele.&lt;/p&gt;&lt;p&gt;Meu filho Roberto também postou um artigo sobre 3D interativo, a tecnologia introduzida com o .net 3.5, vale a pena conferir em &lt;a href="http://www.codeproject.com/KB/WPF/3D-BookWriter.aspx"&gt;http://www.codeproject.com/KB/WPF/3D-BookWriter.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1410416" width="1" height="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></item><item><title>Family.Show 2.0</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/07/29/family-show-2-0.aspx</link><pubDate>Sun, 29 Jul 2007 13:09:22 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1069979</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1069979</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/07/29/family-show-2-0.aspx#comments</comments><description>&lt;p&gt;Se você gostou do&amp;nbsp;Family.Show, que descrevi &lt;a href="http://msmvps.com/blogs/bsonnino/archive/2007/07/17/exemplo-de-programa-em-wpf.aspx"&gt;aqui&lt;/a&gt;, você não foi o único. Os downloads e o feedback para&amp;nbsp;o programa foram tão grandes, que está sendo lançada a versão 2.0, com novos recursos, como temas, entrada de dados em uma grid, visual mais&amp;nbsp;rico.&lt;/p&gt; &lt;p&gt;Se você ainda não conferiu, pode baixar a nova versão no &lt;a href="http://www.codeplex.com/familyshow"&gt;CodePlex&lt;/a&gt;.&amp;nbsp;O código fonte também está disponível para você analisar.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1069979" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Tutoriais de WPF/Silverlight</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/07/29/tutoriais-de-wpf-silverlight.aspx</link><pubDate>Sun, 29 Jul 2007 12:56:52 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1069954</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1069954</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/07/29/tutoriais-de-wpf-silverlight.aspx#comments</comments><description>&lt;p&gt;Celso Gomes, um brasileiro que está trabalhando na Microsoft, em Redmond, na equipe do Expression Blend, é um designer de mão cheia, com trabalhos muito bonitos.&lt;/p&gt; &lt;p&gt;Ele criou um site com tutoriais de Silverlight e WPF, o &lt;a href="http://www.nibblestutorials.net/"&gt;NibblesTutorials&lt;/a&gt;, vale a pena conferir. Se você prefere os tutoriais em português, dê uma olhada &lt;a href="http://www.nibblestutorials.net/br/"&gt;aqui&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1069954" width="1" height="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></item><item><title>Zoom na aplicação</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/07/20/zoom-na-aplica-231-227-o.aspx</link><pubDate>Fri, 20 Jul 2007 12:44:33 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1043296</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1043296</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/07/20/zoom-na-aplica-231-227-o.aspx#comments</comments><description>&lt;p&gt;Um efeito muito interessante é aquele que temos no Expression Blend, quando selecionamos &lt;strong&gt;Tools/Options&lt;/strong&gt; e mudamos o valor de &lt;strong&gt;Workspace zoom&lt;/strong&gt;: podemos mudar o tamanho dos controles, aumentando-os ou diminuindo-os como um todo, permitindo que a visualização fique mais comoda.&lt;/p&gt; &lt;p&gt;A obtenção deste efeito com WPF é muito simples: basta colocar todos os controles que queremos dar o zoom num conteiner, por exemplo, num Canvas e aplicar uma transformação de escala (&lt;strong&gt;ScaleTransform&lt;/strong&gt;) sobre ele. Todos os controles dentro dele serão aumentados ou diminuídos simultaneamente, dando o mesmo efeito que temos no Blend.&lt;/p&gt; &lt;p&gt;Ao digitar este código no XamlPad ou XamlCruncher, você verá que pode alterar o zoom dos componentes na janela ao mudar a posição do Slider:&lt;/p&gt;&lt;code&gt; &lt;p&gt;&amp;lt;Window&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid RenderTransformOrigin=&amp;quot;0,0&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;0.85*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;0.15*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StackPanel Margin=&amp;quot;8,8,8,8&amp;quot; Grid.Row=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Slider Width=&amp;quot;308&amp;quot; Height=&amp;quot;16&amp;quot; Maximum=&amp;quot;2&amp;quot; x:Name=&amp;quot;Slider&amp;quot; Value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Canvas&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Canvas.RenderTransform&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TransformGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScaleTransform&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ScaleX=&amp;quot;{Binding Path=Value, ElementName=Slider, Mode=Default}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ScaleY=&amp;quot;{Binding Path=Value, ElementName=Slider, Mode=Default}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/TransformGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Canvas.RenderTransform&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBox Text=&amp;quot;TextBox&amp;quot; Canvas.Left=&amp;quot;10&amp;quot; Canvas.Top=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Label Content=&amp;quot;Label&amp;quot; Canvas.Left=&amp;quot;10&amp;quot; Canvas.Top=&amp;quot;50&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CheckBox Content=&amp;quot;CheckBox&amp;quot; Canvas.Left=&amp;quot;10&amp;quot; Canvas.Top=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBox Width=&amp;quot;188&amp;quot;&amp;nbsp;Height=&amp;quot;100&amp;quot; Canvas.Left=&amp;quot;10&amp;quot; Canvas.Top=&amp;quot;150&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBoxItem Content=&amp;quot;Item 1&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBoxItem Content=&amp;quot;Item 2&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBoxItem Content=&amp;quot;Item 3&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBoxItem Content=&amp;quot;Item 4&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBoxItem Content=&amp;quot;Item 5&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ListBox&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ComboBox Width=&amp;quot;196&amp;quot; Canvas.Left=&amp;quot;10&amp;quot; Canvas.Top=&amp;quot;282&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ComboBoxItem Content=&amp;quot;Item 1&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ComboBoxItem Content=&amp;quot;Item 2&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ComboBoxItem Content=&amp;quot;Item 3&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ComboBox&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Canvas&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/Window&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/code&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/bsonnino/WindowsLiveWriter/Zoomnaaplicao_88FB/Zoom.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="463" alt="Zoom" src="http://msmvps.com/blogs/bsonnino/WindowsLiveWriter/Zoomnaaplicao_88FB/Zoom_thumb.png" width="621" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;O segredo está nestas linhas:&lt;/p&gt;&lt;code&gt; &lt;p&gt;&amp;lt;Canvas.RenderTransform&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;TransformGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScaleTransform&amp;nbsp;ScaleX=&amp;quot;{Binding Path=Value, ElementName=Slider, Mode=Default}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ScaleY=&amp;quot;{Binding Path=Value, ElementName=Slider, Mode=Default}&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/TransformGroup&amp;gt;&lt;br /&gt;&amp;lt;/Canvas.RenderTransform&amp;gt;&lt;/p&gt;&lt;/code&gt; &lt;p&gt;Aqui fazemos a escala do canvas que contém os outros componentes. Note que estamos fazendo o data binding com a posição do slider. Assim, quando movimentamos o slider, todos os componentes aumentam ou diminuem.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1043296" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Novo artigo de WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/07/17/novo-artigo-de-wpf.aspx</link><pubDate>Tue, 17 Jul 2007 15:43:45 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1032979</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1032979</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/07/17/novo-artigo-de-wpf.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.virtualdreams.com.br/blog"&gt;Meu filho Roberto&lt;/a&gt;&amp;nbsp;e eu escrevemos um novo artigo sobre WPF, o sexto da série, sobre animação. Se você quer conhecer um pouco sobre este recurso do WPF, confira em &lt;a href="http://www.microsoft.com/brasil/msdn/tecnologias/netframework/Animacao_WPF.mspx"&gt;http://www.microsoft.com/brasil/msdn/tecnologias/netframework/Animacao_WPF.mspx&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1032979" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Exemplo de programa em WPF</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/07/17/exemplo-de-programa-em-wpf.aspx</link><pubDate>Tue, 17 Jul 2007 11:08:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1031756</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1031756</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/07/17/exemplo-de-programa-em-wpf.aspx#comments</comments><description>&lt;p&gt;Se você ainda não está convencido que o WPF irá mudar a maneira que desenvolvemos programas (e a maneira que nossos usuários irão vê-las), sugiro que dê uma olhada no Family.Show, em &lt;a href="http://www.vertigo.com/familyshow.aspx"&gt;http://www.vertigo.com/familyshow.aspx&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Esta é uma aplicação de árvore genealógica, porém ela dá uma renovada no aspecto da aplicação: seu design é muito bonito, a interface com o usuário é simples mas, ao mesmo tempo, o programa é completo e eficiente.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/bsonnino/WindowsLiveWriter/ExemplodeprogramaemWPF_7245/familyshow.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="423" alt="familyshow" src="http://msmvps.com/blogs/bsonnino/WindowsLiveWriter/ExemplodeprogramaemWPF_7245/familyshow_thumb.jpg" width="534" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;O programa mostra a árvore genealógica na parte esquerda da janela. À direita, é mostrada a pessoa selecionada. Podem-se acrescentar fotos, dados sobre a pessoa ou mesmo textos que descrevam-na. Quando você seleciona outra pessoa, a árvore genealógica se desloca, mostrando o ramo referente a ela.&amp;nbsp;&lt;/p&gt; &lt;p&gt;Uma característica interessante é&amp;nbsp;o slider de visualização da linha do tempo:&amp;nbsp;à medida que alteramos a posição (mudando o ano), as pessoas ficam transparentes (não nascidas) ou escuras (já falecidas). &amp;nbsp;Este é um exemplo típico de data binding, que pode ser feito sem código no WPF.&lt;/p&gt; &lt;p&gt;Neste programa vemos exemplos de data binding, animações, visual rico, textos WYSIWYG, estilos e templates e muito mais...&lt;/p&gt; &lt;p&gt;Você pode instalá-lo via ClickOnce e montar sua própria árvore genealógica, ou mesmo estudar o código fonte, que está disponível &lt;a href="http://www.vertigo.com/downloads/familyshow/FamilyShowSource.zip"&gt;aqui&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1031756" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Crie um tablet com uma linha de código</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/07/13/crie-um-tablet-com-uma-linha-de-c-243-digo.aspx</link><pubDate>Fri, 13 Jul 2007 09:26:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1018837</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1018837</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/07/13/crie-um-tablet-com-uma-linha-de-c-243-digo.aspx#comments</comments><description>&lt;p&gt;Se você ainda não está convencido do que é possível fazer com o WPF, sugiro que teste&amp;nbsp;a seguinte linha no XamlPad (ou então crie um arquivo no bloco de notas e salve-o com extensão XAML):&lt;/p&gt; &lt;p&gt;&lt;code&gt;&amp;lt;InkCanvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Você acabou de criar um tablet. No XamlPad, você pode desenhar usando o mouse ou, se tiver um tablet, usando a caneta. Você pode ainda incrementar um pouco seu desenho mudando as cores de desenho, com&lt;/p&gt; &lt;p&gt;&lt;code&gt;&amp;lt;InkCanvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;InkCanvas.DefaultDrawingAttributes&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DrawingAttributes Color=&amp;quot;Red&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/InkCanvas.DefaultDrawingAttributes&amp;gt;&lt;br /&gt;&amp;lt;/InkCanvas&amp;gt;&lt;/code&gt;&lt;/p&gt;Se quiser, pode ainda suavizar as curvas desenhadas, transformando-as em splines com o atributo &lt;strong&gt;FitToCurve&lt;/strong&gt;:  &lt;p&gt;&lt;code&gt;&amp;lt;InkCanvas xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;InkCanvas.DefaultDrawingAttributes&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DrawingAttributes Color=&amp;quot;Red&amp;quot; FitToCurve=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/InkCanvas.DefaultDrawingAttributes&amp;gt;&lt;br /&gt;&amp;lt;/InkCanvas&amp;gt;&lt;/code&gt; &lt;/p&gt;Fácil, não? Mas isso não é tudo. Se você salvar este código em um arquivo com extensão XAML e abri-lo no Internet Explorer, você terá transformado seu browser num tablet.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1018837" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/WPF/default.aspx">WPF</category></item></channel></rss>