<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-641384594223208870</id><updated>2011-12-09T17:25:50.705+01:00</updated><category term='Cryptography'/><category term='ProgressBar'/><category term='Add-In'/><category term='Pivot'/><category term='How To'/><category term='Columnar Transposition'/><category term='Path'/><category term='Game'/><category term='Image'/><category term='Attached Dependency Property'/><category term='Completed'/><category term='HalfSquare'/><category term='UI'/><category term='VB.NET'/><category term='Navigation'/><category term='PathListBox'/><category term='Syntax Highlighting'/><category term='Microsoft Translator'/><category term='RippleEffect'/><category term='Loaded Event'/><category term='Flexible Surface'/><category term='Custom Control'/><category term='MSAF'/><category term='Effects'/><category term='ListBoxItem'/><category term='RichTextBox.Xaml Builder'/><category term='Windows Phone 7.1'/><category term='Text Trimming'/><category term='CompositionTarget.Rendering'/><category term='TextBox'/><category term='Silverlight 3'/><category term='Animation'/><category term='Video'/><category term='GridSplitter'/><category term='InkPresenter'/><category term='Style'/><category term='Clipboard'/><category term='Storyboard'/><category term='HyperlinkButton'/><category term='UserControl'/><category term='Doppelte Spaltentransposition'/><category term='Silverlight 4'/><category term='Sonstiges'/><category term='DependencyProperty'/><category term='Behavior'/><category term='WPF 4'/><category term='ChildWindow'/><category term='RichTextBox'/><category term='Hello World'/><category term='Accordion'/><category term='Textverschlüsselung'/><category term='Windows Phone 7'/><category term='LocalMessaging'/><category term='Browser'/><category term='Google Analytics'/><category term='Triangle'/><category term='CodeBox'/><category term='Clipping Path'/><category term='Blend 4'/><category term='Out Of Browser'/><category term='Data Binding'/><category term='RegularPolygon'/><category term='Thumb'/><category term='Event'/><title type='text'>SilverLaw</title><subtitle type='html'>Silverlight Design &amp;amp; Development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>81</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-2102070839374773400</id><published>2011-09-07T17:29:00.000+02:00</published><updated>2011-09-07T17:29:23.721+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sonstiges'/><title type='text'>Nokia Tune Remake --- Create And Vote</title><content type='html'>Schon gehört? Nokia sucht einen neuen "Nokia Tune". Bis zum 05.10.2011 läuft ein &lt;a href="http://nokiatune.audiodraft.com/"&gt;öffentlicher Wettbewerb&lt;/a&gt;. Der Gewinner wird am 07.10.2011 bekanntgegeben. Es lohnt sich übrigens, die bisherigen Einsendungen anzuhören. Mein Favorit ist&amp;nbsp;#367 "Nokia One World". Und wer weiß, vielleicht findet sich ja bald Euer Favorit auf dem neuen &lt;a href="http://www.youtube.com/watch?feature=player_embedded&amp;amp;v=F6oidCTUw4s"&gt;Nokia Windows Phone&lt;/a&gt;. So ... Create And Vote!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-2102070839374773400?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/2102070839374773400/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/09/nokia-tune-remake-create-and-vote.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2102070839374773400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2102070839374773400'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/09/nokia-tune-remake-create-and-vote.html' title='Nokia Tune Remake --- Create And Vote'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-387921810270665178</id><published>2011-08-24T12:46:00.000+02:00</published><updated>2011-08-24T12:46:41.019+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ListBoxItem'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='Text Trimming'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>ListBoxItem Style: Vergrößerung des getrimmten Textes bei MouseOver</title><content type='html'>In der Expression Gallery habe ich einen &lt;a href="http://gallery.expression.microsoft.com/SLETTLBISL4?SRC=Home"&gt;neuen ListBoxItem style&lt;/a&gt; veröffentlicht. Er bietet die Funktionalität, längeren, aber getrimmten Text beim Bewegen des Mauszeigers über das ListBoxItem zu erweitern, so dass der Text vollständig sichtbar wird. Wir alle kennen dieses Verhalten, das vergleichbar ist dem Verhalten des Windows Explorer bei der Anzeige von Dateinamen oder Ordnernamen, der zu lang ist für die Anzeige in einer bestimmten Spalte.&lt;br /&gt;&lt;br /&gt;Viel Spaß damit. Ich hoffe, ich finde in nächster Zukunft die Zeit, hierüber einen kurzen Artikel zu schreiben.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;a href="http://gallery.expression.microsoft.com/SLETTLBISL4?SRC=Home"&gt;Vollständiger Quellcode des Beispielprojekts in der Expression Gallery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;P.S.&lt;/u&gt;: Es ist wirklich sehr lange her, seit meinem letzten Blog-Post. Danke an alle, die weiterhin meinen Blog lesen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-387921810270665178?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/387921810270665178/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/08/listboxitem-style-vergroerung-des.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/387921810270665178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/387921810270665178'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/08/listboxitem-style-vergroerung-des.html' title='ListBoxItem Style: Vergrößerung des getrimmten Textes bei MouseOver'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-2312799655438708184</id><published>2011-05-25T11:27:00.001+02:00</published><updated>2011-05-25T11:53:42.049+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7.1'/><title type='text'>Windows Phone Developer Tools 7.1 Beta veröffentlicht - inklusive Visual Basic-Unterstützung für Silverlight und XNA</title><content type='html'>Es gibt&amp;nbsp;großartige Neuigkeiten für die VB.Net-Community: Die &lt;a href="http://msdn.microsoft.com/en-us/library/hh237342(v=VS.96).aspx"&gt;Windows Phone Developer Tools 7.1 Beta&lt;/a&gt; sind veröffentlicht worden und stehen zum &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=77586864-ab15-40e1-bc38-713a95a56a05&amp;amp;displaylang=en"&gt;Download&lt;/a&gt; bereit. &lt;a href="http://msdn.microsoft.com/en-us/library/ff637516(v=VS.92).aspx"&gt;Hier&lt;/a&gt; kann man nachlesen, dass &lt;span _mstchunk="true" _msthash="3986424" lang="de"&gt;&lt;strong&gt;Visual Basic&amp;nbsp;jetzt für Silverlight und XNA  Framework-Anwendungen verfügbar ist&lt;/strong&gt;. &lt;/span&gt;&lt;span _mstchunk="true" _msthash="3353181" lang="de"&gt;Visual Basic ist also vollständig in die Windows Phone Developer Tools  7.1 Beta integriert&lt;/span&gt;&lt;span _mstchunk="true" _msthash="1096199" lang="de"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span _mstchunk="true" _msthash="1096199" lang="de"&gt;Einen wichtigen Hinweis gibt es &lt;a href="http://expression.microsoft.com/en-us/ff798014"&gt;hier&lt;/a&gt;, wonach empfohlen wird, die Windows Phone Developer Tools 7.1 Beta auf einer separaten Maschine zu installieren.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Außerdem wurde das &lt;a href="http://watoolkitwp7.codeplex.com/"&gt;Windows Azure Toolkit for Windows Phone 7&lt;/a&gt;&amp;nbsp;veröffentlicht, das mit den Windows Phone Developer Tools 7.1 Beta zusammen verwendet werden kann. Für VB.NET-Entwickler gibt es insofern &lt;a href="http://www.wadewegner.com/2011/05/vb-net-and-bug-fixes-for-windows-azure-toolkit-for-windows-phone-7-v1-2-1/"&gt;hier&lt;/a&gt; einen ergänzenden Hinweis zu wichtigen Updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-2312799655438708184?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/2312799655438708184/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/05/windows-phone-developer-tools-71-beta.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2312799655438708184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2312799655438708184'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/05/windows-phone-developer-tools-71-beta.html' title='Windows Phone Developer Tools 7.1 Beta veröffentlicht - inklusive Visual Basic-Unterstützung für Silverlight und XNA'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-8738759012969257035</id><published>2011-05-10T19:54:00.001+02:00</published><updated>2011-05-10T19:55:45.885+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Textverschlüsselung'/><category scheme='http://www.blogger.com/atom/ns#' term='Columnar Transposition'/><category scheme='http://www.blogger.com/atom/ns#' term='Cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Binding'/><title type='text'>Teil 2: Spaltentransposition Chiffre mit "CubeCrypt 2011" - Verwendung von "CubeCrypt 2011"</title><content type='html'>Dies ist der zweite Teil der dreiteiligen Artikelserie über das Tool "&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;". Dieser zweite Teil zeigt die Verwendung von "&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;". Hier sind nochmal alle Teile der Artikelserie in der Übersicht:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://silverlawone.blogspot.com/2011/05/teil-1-spaltentransposition-chiffre-mit.html"&gt;Teil 1: Das Verfahren der "Spaltentransposition"&lt;/a&gt;&lt;br /&gt;Teil 2: Verwendung von "CubeCrypt 2011"&lt;br /&gt;Teil 3: Kryptologie und Kryptanalyse der "Spaltentransposition" (noch nicht veröffentlicht)&lt;br /&gt;&lt;br /&gt;Dieser zweite Teil behandelt die Verwendung von "&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;" und die Implementierung des Werkzeugs&amp;nbsp;in eine Silverlight-Anwendung. Im Abschnitt "Implementierung mit Datenbindung" zeige ich eine Lösung auf, wie man "&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;" auch im Rahmen einer Datenbindung nutzen kann, ohne dass im Quellcode (weder Xaml noch C# oder VB) ein Klartext-Passwort vorhanden ist.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Implementierung von "CubeCrypt 2011" für Silverlight&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;" ist eine Silverlight-Assembly. Sie ist verfügbar als Bestandteil des Beispielprojekts, das in der &lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;Expression Gallery heruntergeladen werden kann&lt;/a&gt;. Die Assembly heißt CubeCrypt.dll. Um "&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;" zu verwenden, muss zu einem Silverlight 4-Projekt ein Verweis auf die Datei CubeCrypt.dll hinzugefügt werden. Außerdem muss in der Klasse, in der CubeCrypt verwendet wird, eine Imports-Anweisung für den Namespace "ColumnarTransposition" hinzugefügt werden.&lt;br /&gt;&lt;br /&gt;&lt;div style="background: rgb(195, 202, 204); color: black; font-family: Courier New; font-size: 10pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; ColumnarTransposition&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; ColumnarTransposition.&lt;span style="color: blue;"&gt;CubeCrypt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Um mit CubeCrypt eine Zeichenfolge zu verschlüsseln oder zu entschlüsseln, muss zunächst ein neues CubeCrypt-Objekt (Namespace ColumnTransposition) erstellt werden. Der Konstruktor der neuen Objektinstanz erfordert die Übergabe eines Parameters. Dieser Parameter erfordert entweder die Übergabe eines Wertes vom Typ "&lt;strong&gt;En&lt;/strong&gt;cryptionMode" oder die Übergabe eines Werts vom Typ "&lt;strong&gt;De&lt;/strong&gt;cryptionMode". Die Übergabe eines Wertes vom Typ "EncryptionMode'" erzeugt eine Objektinstanz, die zum Verschlüsseln einer Zeichenfolge benutzt werden kann. Die Übergabe eines Wertes vom Typ "DecryptionMode'" erzeugt eine Objektinstanz, die zum Entschlüsseln einer Zeichenfolge benutzt werden kann. &lt;br /&gt;&lt;br /&gt;EncryptionMode und DecryptionMode sind jeweils vom Typ Enum. EncryptionMode kennt die beiden Werte EncryptionMode.SingleEncryption und EncryptionMode.DoubleEncryption. DecryptionMode kennt die beiden Werte DecryptionMode.SingleDecryption und DecryptionMode.DoubleDecryption. Die Auswahl des Enumerationswertes entscheidet darüber, ob die Verschlüsselung bzw. die Entschlüsselung mit einer einzelnen Spaltentransposition erfolgen soll, oder ob die Verschlüsselung bzw. die Entschlüsselung mit einer doppelten Spaltentransposition erfolgen soll. Die folgenden Grafiken veranschaulichen das:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8yx5NMYYEn8/TcEEWG6U3fI/AAAAAAAAAMU/04UmxypMvwk/s1600/IMG_1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-8yx5NMYYEn8/TcEEWG6U3fI/AAAAAAAAAMU/04UmxypMvwk/s1600/IMG_1.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;u&gt;Abbildung 1&lt;/u&gt;: Enum: &lt;strong&gt;EncryptionMode&lt;/strong&gt; (Namespace: ColumnarTransposition. Class: CubeCrypt)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BeDkdcENoeM/TcEFZjlzIsI/AAAAAAAAAMY/NWckLI_cetg/s1600/IMG_2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-BeDkdcENoeM/TcEFZjlzIsI/AAAAAAAAAMY/NWckLI_cetg/s1600/IMG_2.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;u&gt;Abbildung 2&lt;/u&gt;: Enum: &lt;strong&gt;DecryptionMode&lt;/strong&gt; (Namespace: ColumnarTransposition. Class: CubeCrypt)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Verschlüsselung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Klasse CubeCrypt stellt die öffentliche Methode Encrypt() zur Verfügung. Die Methode Encrypt() ist überladen. Der Methode wird als Parameter der Klartext übergeben und zusätzlich entweder ein oder zwei Passworte. Abhängig davon, ob der Methode Encrypt() ein oder zwei Passworte übergeben wird, wird der Klartext entweder mit einer einzelnen Spaltentransposition verschlüsselt oder er wird mit einer doppelten Spaltentransposition verschlüsselt. Der Geheimtext wird, wiederum abhängig davon, ob eine einzelne Spaltentransposition durchgeführt wurde, oder ob eine doppelte Spaltentransposition durchgeführt wurde, von den Eigenschaften SingleEncyrptedCiphertext oder DoubleEncryptedCiphertext zurückgegeben. Die Eigenschaften SingleEncyrptedCiphertext und DoubleEncryptedCiphertext sind beide ReadOnly. Der nachfolgende Quellcode verdeutlicht diese Logik:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Beispiel-Quellcode&lt;/u&gt;:&lt;br /&gt;&lt;div style="background: rgb(195, 202, 204); color: black; font-family: Courier New; font-size: 10pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; EncryptString(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; plaintext &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; pw1 &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; pw2 &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; rv &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;.IsNullOrEmpty(pw2) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; ct &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CubeCrypt&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;EncryptionMode&lt;/span&gt;.SingleEncryption)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; ct.Encrypt(plaintext, pw1)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; rv = ct.SingleEncryptedCipherText&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; ct &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CubeCrypt&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;EncryptionMode&lt;/span&gt;.DoubleEncryption)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; ct.Encrypt(plaintext, pw1, pw2)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; rv = ct.DoubleEncryptedCipherText&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; rv&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Entschlüsselung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Der Vorgang der Entschlüsselung erfolgt entsprechend der Logik der Entschlüsselung. Im Unterschied zur Verschlüsselung, wird bei der Entschlüsselung eine Objektinstanz erzeugt, der als Parameter ein Wert vom Typ DecryptionMode übergeben wird. Die Entschlüsselung erfolgt mit der ebenfalls überladenen Methode "Decrypt()". Der Methode "Decrypt()" wird der Geheimtext übergeben. Außerdem werden ihr entweder ein einzelnes Passwort oder zwei Passworte übergeben. Der entschlüsselte Klartext wird entweder von der Eigenschaft SingleDecryptedPlaintext oder von der Eigenschaft DoubleDecryptedPlaintext zurückgegeben.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Beispiel-Quellcode&lt;/u&gt;:&lt;br /&gt;&lt;div style="background: rgb(195, 202, 204); color: black; font-family: Courier New; font-size: 10pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; DecryptString(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; ciphertext &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; pw1 &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; pw2 &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; rv &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;.IsNullOrEmpty(pw2) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; cr &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CubeCrypt&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;DecryptionMode&lt;/span&gt;.SingleDecryption)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; cr.Decrypt(ciphertext, pw1)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; rv = cr.SingleDecryptedPlainText&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; cr &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CubeCrypt&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;DecryptionMode&lt;/span&gt;.DoubleDecryption)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; cr.Decrypt(ciphertext, pw1, pw2)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; rv = cr.DoubleDecryptedPlainText&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; rv&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Implementierung mit Datenbindung (Datenbindung von Element zu Element)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Beispielanwendung, die in der Expression Gallery zum Download bereitgestellt ist, verwendet Datenbindung. Die Implementierung der Verschlüsselung und der Entschlüsselung mittels Datenbindung ist ziemlich einfach. &lt;br /&gt;&lt;br /&gt;In der Beispielanwendung ist es so, dass bei einer Texteingabe von Klartext oder bei der Eingabe eines Passwortes oder eines zweiten Passwortes automatisch der Geheimtext  geändert wird. Klartext, Passwort1, Passwort2, Geheimtext und der wieder entschlüsselte Klartext sind jeweils in TextBox-Steuerelementen enthalten. Die TextBox-Steuerelemente kommunizieren über Datenbindung miteinander. Die TextBox, die den Geheimtext enthält, ist mit der "TextProperty"-Abhängigkeitseigenschaft datengebunden an die Text-Eigenschaft der TextBox, die den Klartext enthält. Die TextBox, die den entschlüsselten Klartext anzeigen soll, ist mit der "TextProperty"-Abhängigkeitseigenschaft datengebunden an die Text-Eigenschaft der Textbox, die den Geheimtext enthält. Die Datenbindung funktioniert über jeweils ein Binding-Objekt. Eingebunden in jede dieser Datenbindungen bzw. in das jeweilige Binding-Objekt ist ein jeweils unterschiedlicher Converter. Ein Converter (EncryptConverter.vb) ist für die Verschlüsselung zuständig, ein anderer Converter (DecryptConverter.vb) ist für die Entschlüsselung zuständig. Jedem Binding-Objekt wird zusätzlich ein Parameter-Wert übergeben. Dieser Parameter beinhaltet das Passwort bzw. die beiden Passworte. Der Wert für den ConverterParameter wird in der Funktion GetConverterParameter() zurückgegeben. Diese Funktion erzeugt den Parameter-Wert aus dem Inhalt der beiden TextBox-Steuerelemente, die die Passworte enthalten.  &lt;br /&gt;&lt;br /&gt;Die nachfolgenden Grafiken veranschaulichen diese Funktionsweise:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-FTX7AQ2pltM/TcJrY6pzB2I/AAAAAAAAAMc/UCsDSKUBdQM/s1600/EncryptDataBinding.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-FTX7AQ2pltM/TcJrY6pzB2I/AAAAAAAAAMc/UCsDSKUBdQM/s640/EncryptDataBinding.png" width="580" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;u&gt;Abbildung 3&lt;/u&gt;: Logic of encryption using DataBinding element to element&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-faZY657eE-E/TcJskYv_4uI/AAAAAAAAAMg/wrPGFlox7CY/s1600/DecryptDataBinding.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-faZY657eE-E/TcJskYv_4uI/AAAAAAAAAMg/wrPGFlox7CY/s640/DecryptDataBinding.png" width="580" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;u&gt;Abbildung 4&lt;/u&gt;: Logic of encryption using DataBinding element to element&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Bei einer Datenbindung von Element zu Element besteht im Rahmen einer Verschlüsselung ein grundsätzliches Problem. Wenn der ConverterParameter im Xaml-Quellcode angegeben ist, kann das Passwort leicht ausgelesen werden. Denn der ConverterParameter stellt das Passwort bzw. die Passworte zur Verfügung, die innerhalb der Converter für die Verschlüsselung bzw. für die Entschlüsselung benötigt werden.&amp;nbsp;&lt;strong&gt;Dieses Problem habe ich in der Beispielanwendung&amp;nbsp;so gelöst, dass ein lesbares Passwort im Xaml-Quellcode und auch im Code Behind nicht explizit auftaucht!&lt;/strong&gt; Um das zu erreichen, wird das DataBindung vollständig im Code Behind implementiert. Jeder der beiden implementierten Converter bezieht die Passworte jeweils nur zur Laufzeit über den Inhalt der TextBox-Steuerelemente, die für die beiden Passworte vorgesehen sind. Um das zu erreichen, wird die Datenbindung mit jedem Feuern des TextChanged()-Ereignisses neu definiert. Das&amp;nbsp;heißt,&amp;nbsp;die Passworte werden dem Bindungsobjekt jedesmal neu übergeben, wenn sich der Text in einer der TextBox-Steuerelemente für die Passworte ändert.&lt;br /&gt;&lt;br /&gt;Im Ergebnis dieses Modells der Datenbindung verbleiben die Passworte jeweils nur im Arbeitspeicher des Computers. Es erfolgt keine explizite Speicherung&amp;nbsp;der Passworte auf einem dauerhaften Speicherträger. Ich möchte jedoch darauf hinweisen, dass Silverlight derzeit nicht die Klasse &lt;a href="http://msdn.microsoft.com/de-de/library/system.security.securestring(VS.80).aspx"&gt;SecureString&lt;/a&gt; unterstützt. Es kann daher auch im Rahmen einer Datenbindung nur der normale String-Typ benutzt werden. Im Gegensatz zu einem SecureString erfolgt bei der Verwendung von einem normalen String keine automatische Verschlüsselung des Werts der Zeichenfolge. Das ist allerdings eine allgemeine Einschränkung, die bei Silverlight derzeit hingenommen werden muss.&lt;br /&gt;&lt;br /&gt;Den Quellcode der Beispielanwendung, die das beschriebene Modell der Datenbindung von Element zu Element implementiert, steht in der &lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;Expression Gallery zum Download bereit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Über Feedback, Fragen&amp;nbsp;und Anregungen würde ich mich sehr freuen. Bitte schickt mir eine E-Mail&amp;nbsp;an silverlaw [at] t-online.de oder schreibt&amp;nbsp;einen Kommentar zu diesem Artikel.&lt;br /&gt;&lt;br /&gt;Im nächsten Artikel dieser Reihe werde ich ausführlich die Kryptologie und die Kryptanalyse des Verfahrens der Spaltentransposition darstellen. Das wird eine spannende Reise.&lt;br /&gt;&lt;br /&gt;Bis dahin .... Viel Spass mit "CubeCrypt 2011".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-8738759012969257035?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/8738759012969257035/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/05/teil-2-spaltentransposition-chiffre-mit.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8738759012969257035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8738759012969257035'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/05/teil-2-spaltentransposition-chiffre-mit.html' title='Teil 2: Spaltentransposition Chiffre mit &quot;CubeCrypt 2011&quot; - Verwendung von &quot;CubeCrypt 2011&quot;'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-8yx5NMYYEn8/TcEEWG6U3fI/AAAAAAAAAMU/04UmxypMvwk/s72-c/IMG_1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-3054550545136089031</id><published>2011-05-03T10:28:00.003+02:00</published><updated>2011-05-10T19:59:06.697+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Textverschlüsselung'/><category scheme='http://www.blogger.com/atom/ns#' term='Columnar Transposition'/><category scheme='http://www.blogger.com/atom/ns#' term='Cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Teil 1: Spaltentransposition Chiffre mit CubeCrypt 2011 - Das Verfahren der "Spaltentransposition"</title><content type='html'>Seit gestern ist "&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;" in der Expression Gallery zum Download bereitgestellt. "&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;" ist ein Tool für Silverlight. Es ermöglicht das Verschlüsseln und Entschlüsseln von Text mithilfe eines speziellen Verschlüsselungsverfahrens. Dieses Verschlüsselungsverfahren wird "Spaltentransposition" genannt. &lt;br /&gt;&lt;br /&gt;Diese dreiteilige Artikelreihe stellt das Verschlüsselungsverfahren der "Spaltentransposition" kurz vor und zeigt, wie man "&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;CubeCrypt 2011&lt;/a&gt;" in einer Silverlight-Anwendung verwendet. Schließlich werde ich&amp;nbsp;auf die kryptologische Sicherheit des Verfahrens und mögliche kryptanalytische Angriffe eingehen. Hier ist der Inhalt dieser Artikelreihe in der Übersicht:&lt;br /&gt;&lt;br /&gt;Teil 1: Das Verfahren der "Spaltentransposition"&lt;br /&gt;&lt;a href="http://silverlawone.blogspot.com/2011/05/teil-2-spaltentransposition-chiffre-mit.html"&gt;Teil 2: Verwendung von "CubeCrypt 2011"&lt;/a&gt;&lt;br /&gt;Teil 3: Zur Kryptologie und Kryptanalyse der "Spaltentransposition" (noch nicht veröffentlicht)&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Das Verfahren der "Spaltentransposition"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"Spaltentransposition" ist von seiner Herkunft her ein einfach anwendbares Handverfahren. Es kann überall und jederzeit sehr einfach nur mithilfe von Papier und Bleistift angewendet werden. Die Funktionsweise des Verschlüsselungsalgorithmus ist dadurch gekennzeichnet, dass die Positionen der Alphabetzeichen von einem Klartext durch Anwendung eines Passwortes auf den Klartext geändert werden. &lt;br /&gt;&lt;br /&gt;Dabei werden die Zeichen von einem Klartext in Reihen geschrieben, die jeweils der Länge des Passwortes entsprechen.. Ein Beispiel:&lt;br /&gt;&lt;br /&gt;Passwort: BERLIN&lt;br /&gt;&lt;br /&gt;Diese Passwort hat die Länge 6.&lt;br /&gt;&lt;br /&gt;Klartext: WE ARRIVE AT TEN PAST EIGHT&lt;br /&gt;&lt;br /&gt;Die Leerzeichen werden entfernt, so dass der Klartext dann lautet:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;WEARRIVEATTENPASTEIGHT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dieser Klartext wird nun in Reihen, die jeweils der Länge des Passwortes entsprechen niedergeschrieben:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dmzTSg14ElI/Tb-3OP9ATJI/AAAAAAAAALg/Wpkhz_B7txw/s1600/IM_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-dmzTSg14ElI/Tb-3OP9ATJI/AAAAAAAAALg/Wpkhz_B7txw/s1600/IM_1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nun werden die Spalten numeriert, und zwar nach der Reihenfolge, in der die Buchstaben des Passworts im Alphabet auftreten:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-rnGsIs0Q88w/Tb-3Tp6bi0I/AAAAAAAAALk/2KuShczLV1A/s1600/IM_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-rnGsIs0Q88w/Tb-3Tp6bi0I/AAAAAAAAALk/2KuShczLV1A/s1600/IM_2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In alphabetischer Reihenfolge tritt als erstes der Buchstabe "B" auf. Die Spalte, die durch den Buchstaben "B" markiert ist, wird deswegen mit der Ziffer "1" numeriert. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-X5_13yX2RY8/Tb-3XVwmg1I/AAAAAAAAALo/uTWmiLy97BY/s1600/IM_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-X5_13yX2RY8/Tb-3XVwmg1I/AAAAAAAAALo/uTWmiLy97BY/s1600/IM_3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In alphabetischer Reihenfolge tritt als nächtes der Buchstabe "E" auf. Die Spalte, die durch den Buchstaben "E" markiert ist, wird deswegen mit der Ziffer "2" numeriert. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-u4gP_amVCxQ/Tb-3cyrOOhI/AAAAAAAAALs/n_7fi8TdUfs/s1600/IM_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-u4gP_amVCxQ/Tb-3cyrOOhI/AAAAAAAAALs/n_7fi8TdUfs/s1600/IM_4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Entsprechend dieser Logik werden alle Buchstaben des Passworts bzw. alle Spalten numeriert.&lt;br /&gt;&lt;br /&gt;Um den Geheimtext zu erhalten, werden dann die Buchstaben im Klartext Spalte für Spalte in der Reihenfolge der Numerierungen ausgelesen und in einer Zeile aufgeschrieben. Als erstes werden die Buchstaben der ersten Spalte ausgelesen, danach die Buchstaben der zweiten Spalte, dann die Buchstaben der dritten Spalte, und so weiter. Die nachfolgende Grafik veranschaulicht diesen Vorgang.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-BQ4rF7AXuxs/Tb-3iyvRqQI/AAAAAAAAALw/jLftzLuzl-o/s1600/IM_5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="344" src="http://3.bp.blogspot.com/-BQ4rF7AXuxs/Tb-3iyvRqQI/AAAAAAAAALw/jLftzLuzl-o/s640/IM_5.png" width="580" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Im Ergebnis erhalten wir den folgenden Geheimtext:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;WVNIEEPGRTTRTSTIEEAAAH&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dieser Geheimtext ist das Ergebnis einer einzelnen Spaltentransposition. Bei einer doppelten Spaltentransposition wird auf den Geheimtext erneut eine einzelne Spaltentransposition angewendet.&lt;br /&gt;&lt;br /&gt;Gegeben sei das weitere Passwort "HAMBURG". Der Geheimtext, der das Resultat der ersten einzelnen Spaltentransposition war, wird erneut in Reihen unterhalb des zweiten Passworts geschrieben. Die Buchstaben des Passworts bzw. die Spalten werden erneut entsprechend der oben beschriebenen Logik numeriert.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9xNNOMm03Tw/Tb-3sCQigqI/AAAAAAAAAL0/rWgWSdP0GmE/s1600/IM_6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-9xNNOMm03Tw/Tb-3sCQigqI/AAAAAAAAAL0/rWgWSdP0GmE/s1600/IM_6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die Spalten werden erneut in der numerischen Reihenfolge ausgelesen. Das Resultat ist der zweite Geheimtext.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;VRIITEPSAWGTHNTEETAERA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das ist das Ergebnis der doppelten Spaltentransposition.&lt;br /&gt;&lt;br /&gt;Das ist fast alles, was zu der Anwendung der Spaltentransposition zu sagen ist. Eines fehlt noch. Wenn in einem Passwort ein Buchstabe mehrfach vorkommt, dann werden sie in der Reihenfolge ihres Auftretens im Passwort numeriert. Dazu ein Beispiel. In dem Passwort "HAMM" tritt der Buchstabe "M" zweimal auf. Die Buchstaben dieses Passworts werden wie folgt numeriert:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7uDKQ2s2eQg/Tb-3ztExS3I/AAAAAAAAAL4/_NBH_SQSHng/s1600/IM_7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-7uDKQ2s2eQg/Tb-3ztExS3I/AAAAAAAAAL4/_NBH_SQSHng/s1600/IM_7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Der Vorgang der Entschlüsselung funktioniert folgendermaßen. Bekannt sind die folgenden Informationen:&lt;br /&gt;&lt;br /&gt;Passwort 1: BERLIN&lt;br /&gt;&lt;br /&gt;Passwort 2: HAMBURG&lt;br /&gt;&lt;br /&gt;Geheimtext: &lt;span style="font-size: large;"&gt;VRIITEPSAWGTHNTEETAERA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Der Geheimtext hat 22 Zeichen. Das Passwort 1 hat 6 Zeichen. Das Passwort 2 hat 7 Zeichen.&lt;br /&gt;&lt;br /&gt;Um den Geheimtext mithilfe der Passworte zu entschlüsseln, wird zunächst das Passwort 2 auf den Geheimtext angewendet. Auf den sich nach diesem Vorgang ergebenden Geheimtext wird das Passwort 1 angewendet. Das Ergebnis ist der Klartext. Bei der Entschlüsselung wird grundsätzlich das oben beschriebene Verfahren verwendet, nur in umgekehrter Reihenfolge.&lt;br /&gt;&lt;br /&gt;Das folgende Beispiel veranschaulicht den Vorgang der Entschlüsselung:&lt;br /&gt;&lt;br /&gt;Zunächst wird das zweite Passwort "HAMBURG" niedergeschrieben, die Buchstaben des Passworts werden numeriert und der Geheimtext "VRIITEPSAWGTHNTEETAERA" wird in Reihen unterhalb der Buchstaben des Passworts Spalte für Spalte eingetragen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Aih4o4pAbHk/Tb_Op2R_7tI/AAAAAAAAAL8/w7Ih4z8HPjc/s1600/IM_6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Aih4o4pAbHk/Tb_Op2R_7tI/AAAAAAAAAL8/w7Ih4z8HPjc/s1600/IM_6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Weil der Geheimtext spaltenweise eingetragen wird, muss vorher bekannt sein, wieviele kurze Spalten und wieviel lange Spalten es gibt. Der Grund ist, dass die Anzahl der langen Spalten abhängt von der Anzahl der Zeichen im Passwort. Die Anzahl der langen Spalten wird anhand der folgenden Formel berechnet:&lt;br /&gt;&lt;br /&gt;Anzahl der Geheimtextzeichen "MODULO" Anzahl der Passwortzeichen &lt;br /&gt;&lt;br /&gt;Angewendet auf unser Beispiel:&lt;br /&gt;&lt;br /&gt;22 MODULO 7&lt;br /&gt;&lt;br /&gt;22 geteilt durch 7 ergibt 3 mit einem Rest von 1.&lt;br /&gt;&lt;br /&gt;Das Ergebnis ist, dass es 1 lange Spalte gibt. Das ganzzahlige Ergebnis der obigen Berechnung gibt die Anzahl der vollständig ausgefüllten Reihen wieder. &lt;br /&gt;&lt;br /&gt;Der Geheimtext wird nun zeilenweise ausgelesen. Das ergibt die folgende Zeichenfolge.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;WVNIEEPGRTTRTSTIEEAAAH&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Diese Zeichenfolge stellt das Ergebnis der ersten Verschlüsselung dar. Die Zeichenfolge muss nun mit dem ersten Passwort entschlüsselt werden. Dazu wird das erste Passwort aufgeschrieben und die Buchstaben des Passworts werden erneut numeriert. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qC4XnOaC7QQ/Tb_OxAumocI/AAAAAAAAAMA/pxKGYUIyaNI/s1600/IM_8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-qC4XnOaC7QQ/Tb_OxAumocI/AAAAAAAAAMA/pxKGYUIyaNI/s1600/IM_8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Die Anzahl der langen Spalten und die Anzahl der vollständig ausgefüllten Reihen werden berechnet.&lt;br /&gt;&lt;br /&gt;22 MODULO 6&lt;br /&gt;&lt;br /&gt;22 geteilt durch 6 ergibt 3 mit einem Rest von 4&lt;br /&gt;&lt;br /&gt;Jetzt kann die Zeichenfolge der ersten Entschlüsselung unter das erste Passwort Spalte für Spalte eingetragen werden. Die numerische Reihenfolge der Spalten muss eingehalten werden. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0_R_GlZGZj8/Tb_POcupCiI/AAAAAAAAAMI/m3La32a7Afs/s1600/IM_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-0_R_GlZGZj8/Tb_POcupCiI/AAAAAAAAAMI/m3La32a7Afs/s1600/IM_2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Dann werden die Reihen nacheinander ausgelesen. Das Resultat ist der ursprüngliche Klartext.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;WEARRIVEATTENPASTEIGHT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Im zweiten&amp;nbsp;Teil dieser Artikelreihe werde ich das Tool "CubeCrypt 2011" für Silverlight vorstellen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-3054550545136089031?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/3054550545136089031/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/05/teil-1-spaltentransposition-chiffre-mit.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3054550545136089031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3054550545136089031'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/05/teil-1-spaltentransposition-chiffre-mit.html' title='Teil 1: Spaltentransposition Chiffre mit CubeCrypt 2011 - Das Verfahren der &quot;Spaltentransposition&quot;'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-dmzTSg14ElI/Tb-3OP9ATJI/AAAAAAAAALg/Wpkhz_B7txw/s72-c/IM_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-8773246257797897285</id><published>2011-05-02T15:56:00.003+02:00</published><updated>2011-05-02T16:26:30.786+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Textverschlüsselung'/><category scheme='http://www.blogger.com/atom/ns#' term='Columnar Transposition'/><category scheme='http://www.blogger.com/atom/ns#' term='Cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Doppelte Spaltentransposition'/><title type='text'>CubeCrypt 2011 - Columnar Transposition Cipher For Silverlight 4</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="background-color: white; color: black;"&gt;&lt;strong&gt;Password1&lt;/strong&gt;: SilverLaw&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black;"&gt;&lt;strong&gt;Password2&lt;/strong&gt;: Solutions&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black;"&gt;&lt;strong&gt;Ciphertext&lt;/strong&gt;: &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CIPHER/s1.html" style="height: 151px; width: 225px;"&gt;&amp;lt;p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br /&amp;gt; &amp;lt;/p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/p&amp;gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://gallery.expression.microsoft.com/SLCC2011SL4"&gt;&lt;strong&gt;Decrypt with CubeCrypt 2011&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-8773246257797897285?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/8773246257797897285/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/05/cubecrypt-2011-columnar-transposition.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8773246257797897285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8773246257797897285'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/05/cubecrypt-2011-columnar-transposition.html' title='CubeCrypt 2011 - Columnar Transposition Cipher For Silverlight 4'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-225947033408187830</id><published>2011-04-27T11:02:00.001+02:00</published><updated>2011-04-27T11:04:00.835+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Navigation'/><category scheme='http://www.blogger.com/atom/ns#' term='Attached Dependency Property'/><category scheme='http://www.blogger.com/atom/ns#' term='HyperlinkButton'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Benutzerdefinierte angefügte Abhängigkeitseigenschaft IsKeepFocusVisual für den HyperlinkButton</title><content type='html'>Kürzlich habe ich ein HyperlinkButton Custom Control veröffentlicht. Dieses Custom Control hat&amp;nbsp;die zusätzliche Funktion, visuell anzuzeigen, ob der HyperlinkButton geklickt wurde, auch wenn er den visuellen Focus verloren hat. &lt;br /&gt;&lt;br /&gt;Die selbe Funktionalität habe ich nun mithilfe einer benutzerdefinierten angefügten Abhängigkeitseigenschaft für einen regulären HyperlinkButton realisiert. Der &lt;strong&gt;&lt;a href="http://gallery.expression.microsoft.com/SLCADPHBSL4"&gt;Download&lt;/a&gt;&lt;/strong&gt; wird in der Expression Gallery bereitgehalten. Dort gibt es auch einen Link zu einer Beispielanwendung. &lt;br /&gt;&lt;br /&gt;Diese Lösung ist eine alternative Herangehensweise. Die Implementierung dieser Funktionalität mittels einer benutzerdefinierten angefügten Abhängigkeitseigenschaft ist meine bevorzugte Lösung. Denn sie ermöglicht die größtmögliche Freiheit bei der Gestaltung des Style bzw. der Vorlage eines regulären HyperlinkButton. &lt;br /&gt;&lt;br /&gt;Ich werde in den nächsten Tagen hier im Blog einen detaillierten Artikel über die alternativen Lösungen veröffentlichen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-225947033408187830?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/225947033408187830/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/04/benutzerdefinierte-angefugte.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/225947033408187830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/225947033408187830'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/04/benutzerdefinierte-angefugte.html' title='Benutzerdefinierte angefügte Abhängigkeitseigenschaft IsKeepFocusVisual für den HyperlinkButton'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-3896335705485557078</id><published>2011-04-15T14:40:00.003+02:00</published><updated>2011-04-15T14:53:31.963+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='RichTextBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Attached Dependency Property'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='RichTextBox.Xaml Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Binding'/><title type='text'>Datenbindung für den reichhaltigen Text eines RichTextBox-Steuerelements durch eine angefügte Abhängigkeitseigenschaft</title><content type='html'>Heute las ich einen &lt;a href="http://blogs.msdn.com/b/delay/archive/2011/04/14/quot-those-who-cannot-remember-the-past-are-condemned-to-repeat-it-quot-webbrowserextensions-stringsource-attached-dependency-property-makes-silverlight-windows-phone-wpf-s-webbrowser-control-more-xaml-and-binding-friendly.aspx"&gt;Artikel in Delay's Blog über eine angefügte Abhängigkeitseigenschaft für ein WebBrowser-Steuerelement&lt;/a&gt;. Ich kann nur empfehlen, diesen Artikel mal zu lesen. Als ich diesen Artikel gelesen hatte, dachte ich mir, dass es cool wäre, wenn es etwas vergleichbares auch für die RichTextBox.Xaml-Eigenschaft gäbe. Die RichTextBox.Xaml-Eigenschaft ist eine einfache Eigenschaft vom Typ String und keine Abhängigkeitseigenschaft. Wenn dies eine Abhängigkeitseigenschaft wäre, so wäre es möglich, den Inhalt für eine RichTextBox über Datenbindung zu setzen.&lt;br /&gt;&lt;br /&gt;Also habe ich mich hingesetzt und eine kleine Klasse geschrieben, mit deren Hilfe eine Datenbindung für den reichhaltigen Inhalt einer regulären RichTextBox möglich wird. Dabei wird die angefügte Abhängigkeitseigenschaft XamlSource verwendet.&lt;br /&gt;&lt;br /&gt;Eine Verwendung dieser angefügten Abhängigkeitseigenschaft setzt natürlich voraus, dass man einen String hat, der Xaml-Code enthält, der von der RichTextBox.Xaml-Eigenschaft verstanden wird. Hierfür verwende ich einfach xml-Dateien, die zuvor&amp;nbsp;mit meinem &lt;a href="http://silverlawone.blogspot.com/2010/11/richtextboxxaml-builder-add-in-version.html"&gt;RichTextBox.Xaml Builder Addin&lt;/a&gt; erstellt wurden.&lt;br /&gt;&lt;br /&gt;Nachfolgend stelle ich eine kleine Beispielanwendung vor und beschreibe kurz, wie einfach die Logik funktioniert.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: large;"&gt;Beispielanwendung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hier ist zunächst einmal eine kleine Beispielanwendung.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/RTBAPDB/s1.html" style="height: 602px; width: 562px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Die obige Anwendung besteht aus einer ListBox, mit mehreren ListBoxItems, und aus einer einzelnen RichTextBox. Abhängig davon, welches ListBoxItem ausgewählt ist, wird in der RichTextBox ein anderer Inhalt dargestellt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Die Logik der Beispielanwendung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Klasse XamlAP.vb stellt eine angefügte Abhängigkeitseigenschaft bereit. Dies ist die angefügte Abhängigkeitseigenschaft mit dem Namen XamlSource. Die Eigenschaft XamlSource nimmt als Wert den &lt;strong&gt;qualifizierten Dateinamen einer xml-Datei&lt;/strong&gt; entgegen. Der nachfolgende Quellcode-Ausschnitt zeigt den PropertyChangedCallBack OnXamlSourcePropertyChanged der Klasse XamlAP.vb:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Shared&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnXamlSourcePropertyChanged(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; d &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; rtb &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RichTextBox&lt;/span&gt; = &lt;span style="color: blue;"&gt;CType&lt;/span&gt;(d, &lt;span style="color: #2b91af;"&gt;RichTextBox&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; rtb &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Throw&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NotSupportedException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"XamlSource property only valid for RichTextBox instance."&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; newSource &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;CStr&lt;/span&gt;(e.NewValue)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;.IsNullOrEmpty(newSource) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; rtb.Xaml = &lt;span style="color: #2b91af;"&gt;XElement&lt;/span&gt;.Load(newSource).ToString(&lt;span style="color: #2b91af;"&gt;SaveOptions&lt;/span&gt;.DisableFormatting)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; rtb.Selection.Select(rtb.ContentStart, rtb.ContentStart)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Hier wird der Xaml-Eigenschaft der RichTextBox als Wert der in einen String umgewandelte Inhalt einer xml-Datei zugewiesen. Die xml-Datei wurde zuvor mithilfe meines RichTextBox.Xaml Builder Addin erstellt. Wie man existierenden reichhaltigen Inhalt mit dem RichTextBox.Xaml Builder Addin so in xml konvertiert, dass das xml von der RichTextBox.Xaml-Eigenschaft als Xaml verstanden wird , habe ich &lt;a href="http://silverlawone.blogspot.com/2010/11/richtextboxxaml-builder-add-in-version.html"&gt;hier&lt;/a&gt; beschrieben.&lt;br /&gt;&lt;br /&gt;Um die angefügte Abhängigkeitseigenschaft verwenden zu können, muss der Namespace für die Klasse XamlAP.vb in MainPage.xaml referenziert werden:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;UserControl&lt;/span&gt;&lt;span style="color: red;"&gt; xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;silverlaw&lt;/span&gt;&lt;span style="color: blue;"&gt;="clr-namespace:RtbAttachedXamlPropertyLab.SilverLaw"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Der Wert für XamlSource wird dann als Attribute der RichTextBox im Xaml gesetzt:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: red;"&gt;silverlaw&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;XamlAP.XamlSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; SelectedItem&lt;/span&gt;&lt;span style="color: blue;"&gt;.Content,&lt;/span&gt;&lt;span style="color: red;"&gt; ElementName&lt;/span&gt;&lt;span style="color: blue;"&gt;=fileList,&lt;/span&gt;&lt;span style="color: red;"&gt; Converter&lt;/span&gt;&lt;span style="color: blue;"&gt;={&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color: red;"&gt; ItemConverter&lt;/span&gt;&lt;span style="color: blue;"&gt;}}"&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Im obigen Code wurde die XamlSource-Eigenschaft datengebunden. Die Datenbindung ist eine Elementeigenschaftsdatenbindung an die Content-Eigenschaft der ListBoxItems. Die ListBoxItems enthalten jeweils einen String-Wert als Content-Eigenschaft. Dieser String-Wert enthält jeweils einen beschreibenden Text für den reichhaltigen Inhalt, der in der RichTextBox dargestellt werden soll. Die Datenbindung nimmt hier also den beschreibenden Text der ListBoxItem entgegen. Damit die Datenbindung versteht, welche Datei jeweils abgerufen werden soll, wurde zusätzlich ein Converter implementiert. Hier ist der Quellcode dieses Converters:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.Windows.Data&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Namespace&lt;/span&gt; SilverLaw&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ItemToFileNameConverter&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Implements&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IValueConverter&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; Convert(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; targetType &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.&lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; parameter &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; culture &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Globalization.&lt;span style="color: #2b91af;"&gt;CultureInfo&lt;/span&gt;) _&lt;/div&gt;&lt;div style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt; &lt;span style="color: blue;"&gt;Implements&lt;/span&gt; System.Windows.Data.&lt;span style="color: #2b91af;"&gt;IValueConverter&lt;/span&gt;.Convert&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; item &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;CStr&lt;/span&gt;(value)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; returnValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; item&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: blue;"&gt;Is&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;"OnXamlSourcePropertyChanged"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; returnValue = &lt;span style="color: #a31515;"&gt;"0065.xml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: blue;"&gt;Is&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;"XamlSourceProperty"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; returnValue = &lt;span style="color: #a31515;"&gt;"0066.xml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: blue;"&gt;Is&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;"MainPage.xaml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; returnValue = &lt;span style="color: #a31515;"&gt;"0067.xml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: blue;"&gt;Is&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;"MainPage.xaml.vb"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; returnValue = &lt;span style="color: #a31515;"&gt;"0068.xml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: blue;"&gt;Is&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;"XamlAP.vb"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; returnValue = &lt;span style="color: #a31515;"&gt;"0069.xml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: blue;"&gt;Is&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;"ItemToFileNameConverter.vb"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; returnValue = &lt;span style="color: #a31515;"&gt;"0070.xml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; returnValue&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; ConvertBack(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; targetType &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.&lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; parameter &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; culture &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Globalization.&lt;span style="color: #2b91af;"&gt;CultureInfo&lt;/span&gt;) _&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp; &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt; &lt;span style="color: blue;"&gt;Implements&lt;/span&gt; System.Windows.Data.&lt;span style="color: #2b91af;"&gt;IValueConverter&lt;/span&gt;.ConvertBack&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: green;"&gt;' code&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Namespace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Die Methode Convert erhält den beschreibenden Text von einem ListBoxItem als Parameter übergeben. Dieser Wert wird ausgewertet und abhängig von diesem Wert wird der qualifizierte Name der zutreffenden xml-Datei zurückgegeben. Der qualifizierte Name der xml-Datei wird dann, wie weiter oben erwähnt, im PropertyChangedCallBack der angefügten Abhängigkeitseigenschaft ausgewertet.&lt;br /&gt;&lt;br /&gt;Das war's. Bei jedem Klick auf ein ListBoxItem wird der betreffende Inhalt dargestellt.&lt;br /&gt;&lt;br /&gt;Viel Spass damit!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;strong&gt;&lt;a href="http://gallery.expression.microsoft.com/SLRTBAPSL4"&gt;Vollständiger Quellcode des Beispielprojekts&lt;/a&gt;.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-3896335705485557078?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/3896335705485557078/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/04/datenbindung-fur-den-reichhaltigen-text.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3896335705485557078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3896335705485557078'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/04/datenbindung-fur-den-reichhaltigen-text.html' title='Datenbindung für den reichhaltigen Text eines RichTextBox-Steuerelements durch eine angefügte Abhängigkeitseigenschaft'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-2340195155875436398</id><published>2011-04-06T20:58:00.001+02:00</published><updated>2011-04-27T10:47:28.355+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Navigation'/><category scheme='http://www.blogger.com/atom/ns#' term='HyperlinkButton'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Control'/><title type='text'>Stay Selected HyperlinkButton Custom Control</title><content type='html'>In einer Silverlight-Navigationsanwendung mit mehreren HyperlinkButton-Steuerelementen ist es ein bekanntes Problem: Wenn der Nutzer den Fokus beispielsweise in ein TextBox-Steuerelement setzt,&amp;nbsp;dann verliert der HyperlinkButton seinen Fokus. Mit dem Verlust des Fokus verliert der HyperlinkButton zugleich seine Indikatorwirkung, das heißt, er zeigt nicht mehr an, welche Seite derzeit aktiv ist. &lt;br /&gt;&lt;br /&gt;Der SilverLawHyperlinkButton, ein custom control, zeigt eine Lösung für dieses Problem auf.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Eine Beispielanwendung, die das Steuerelement in Aktion zeigt,&amp;nbsp;gibt es &lt;a href="http://silverlawone.de/silverlawblogde/SLHBCC/s1.html"&gt;hier&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Das Steuerelement einschließlich Quellcode gibt es &lt;a href="http://gallery.expression.microsoft.com/SLSSHBCCSL4"&gt;hier&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;UPDATE&lt;/u&gt;&lt;/strong&gt;: Eine erweiterte und verbesserte Version des Custom Control steht ab sofort in der Expression Gallery zum &lt;strong&gt;&lt;a href="http://gallery.expression.microsoft.com/SLCHBEVSL4"&gt;Download&lt;/a&gt;&lt;/strong&gt; bereit. Die Änderungen in der verbesserten Version betreffen vor allem den Aufbau der Vorlage in der Datei generic.xaml.&lt;br /&gt;Ich werde sobald wie möglich einen Artikel dazu veröffentlichen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-2340195155875436398?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/2340195155875436398/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/04/stay-selected-hyperlinkbutton-custom.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2340195155875436398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2340195155875436398'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/04/stay-selected-hyperlinkbutton-custom.html' title='Stay Selected HyperlinkButton Custom Control'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-5861461367916936396</id><published>2011-03-31T09:01:00.000+02:00</published><updated>2011-03-31T09:01:48.853+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ProgressBar'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Beispiel eines kreisrunden ProgressBar</title><content type='html'>In der Expression Gallery findet Ihr ein neues Beispielprojekt für einen kreisrunden ProgressBar-Style. Das Beispiel benutzt einen Style für das ProgressBar-Steuerelement und etwas code behind, um die Funktionalität zu implementieren.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Hier ein Screenshot:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-FgWvMrlo5IQ/TZQmMre_gQI/AAAAAAAAALM/j-bAyF7bAyQ/s1600/ss256x289.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" r6="true" src="http://4.bp.blogspot.com/-FgWvMrlo5IQ/TZQmMre_gQI/AAAAAAAAALM/j-bAyF7bAyQ/s1600/ss256x289.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Den &lt;a href="http://gallery.expression.microsoft.com/SLARPBSSL4"&gt;Download des vollständigen Quellcodes&lt;/a&gt; findet Ihr in der Expression Gallery.&lt;br /&gt;&lt;br /&gt;Viel Spass damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-5861461367916936396?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/5861461367916936396/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/beispiel-eines-kreisrunden-progressbar.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5861461367916936396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5861461367916936396'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/beispiel-eines-kreisrunden-progressbar.html' title='Beispiel eines kreisrunden ProgressBar'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-FgWvMrlo5IQ/TZQmMre_gQI/AAAAAAAAALM/j-bAyF7bAyQ/s72-c/ss256x289.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-8681906966586136999</id><published>2011-03-23T17:48:00.000+01:00</published><updated>2011-03-23T17:48:42.502+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ProgressBar'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Clipping Path'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Movie Countdown in Silverlight</title><content type='html'>In der Expression Gallery findet Ihr ein Beispiel für einen "Movie Countdown", realisiert in Silverlight. Es gibt sicherlich viele andere Herangehensweisen, um einen "Movie CountDown" zu bauen. Ich habe den Ansatz gewählt, ein ProgressBar-Steuerelement als Grundlage zu nehmen.&lt;br /&gt;&lt;br /&gt;Hier ist das Beispiel:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/MCD/s1.html" style="height: 600px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Das Interessante an der Entwicklung dieses Projekts war die Aufgabe, mit einem einigermaßen vertretbaren Aufwand eine kreisförmige Fortschrittsanzeige&amp;nbsp;mit der ProgressBar zu implementieren. Mit ein wenig Handarbeit ist das auch recht einfach umzusetzen. Auf ein wenig "code behind" kann dabei zwar nicht verzichtet werden. Aber das grundlegende Prinzip ist recht einfach. Ich werde demnächst einen kleinen Artikel hierüber schreiben.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;: &lt;a href="http://gallery.expression.microsoft.com/SLMCDSL4"&gt;Vollständiger Quellcode des Beispiel-Projekts&lt;/a&gt;.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-8681906966586136999?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/8681906966586136999/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/movie-countdown-in-silverlight.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8681906966586136999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8681906966586136999'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/movie-countdown-in-silverlight.html' title='Movie Countdown in Silverlight'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-3416258907268047767</id><published>2011-03-20T18:45:00.000+01:00</published><updated>2011-03-20T18:45:06.915+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='PathListBox'/><title type='text'>Freihändiges Zeichnen LayoutPaths zur Laufzeit</title><content type='html'>In der Expression Gallery findet Ihr ein kleines Beispiel-Projekt für das freihändige Zeichnen von LayoutPaths für eine PathListBox zur Laufzeit.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gallery.expression.microsoft.com/SLRFHDLPSL4"&gt;Hier&lt;/a&gt; geht's zum Download.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-3416258907268047767?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/3416258907268047767/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/freihandiges-zeichnen-layoutpaths-zur.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3416258907268047767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3416258907268047767'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/freihandiges-zeichnen-layoutpaths-zur.html' title='Freihändiges Zeichnen LayoutPaths zur Laufzeit'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-745286608758625863</id><published>2011-03-17T19:08:00.001+01:00</published><updated>2011-03-24T19:10:09.106+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sonstiges'/><title type='text'>Eine Umfrage - Werbung in diesem Blog?</title><content type='html'>Seit Längerem denke ich darüber nach, wie die Leser meines Blogs es wohl aufnehmen würden, wenn ich es zulassen würde, dass in diesem Blog Werbung geschaltet wird. Ich möchte das in Eure Hände legen und deswegen Eure Meinung dazu erfragen. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Die Frage ist in englischer Sprache gestellt. Denn seitdem ich diesen Blog aktiv betreibe, also seit August 2010, haben knapp 29000 Besucher meinen Blog besucht, wovon nur ca. 17% der Zugriffe aus Deutschland kamen. &lt;br /&gt;&lt;br /&gt;Für alle, die kein Englisch sprechen, ist hier die Frage in deutscher Sprache gestellt: &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;Würde es Sie stören, wenn ich es erlauben würde, &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;dass in diesem Blog Werbung platziert wird?&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="300" id="twpw_if" name="twpw_if" scrolling="no" src="http://twtpoll.com/badge/if/?twt=qt6r8v&amp;amp;tbg=1&amp;amp;b=1" width="300"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Die Beteiligung an der Umfrage ist auf 400 Stimmen begrenzt. Also ... früher Vogel fängt den Wurm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-745286608758625863?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/745286608758625863/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/eine-umfrage-werbung-in-diesem-blog.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/745286608758625863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/745286608758625863'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/eine-umfrage-werbung-in-diesem-blog.html' title='Eine Umfrage - Werbung in diesem Blog?'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-1380957313914133793</id><published>2011-03-15T18:53:00.002+01:00</published><updated>2011-03-16T09:44:55.137+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='GridSplitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Image'/><title type='text'>Bildvergleich mithilfe eines GridSplitter</title><content type='html'>Dieses Beispiel demonstriert, wie man ein GridSplitter-Steuerelement verwendet, um zwei Bilder zu vergleichen. So kann man beispielsweise einen Vergleich vorher nachher umsetzen.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CSS/s1.html" style="height: 600px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Im obigen Beispiel können zwei Bilder miteinander verglichen werden, indem der GridSplitter hin- und her bewegt wird. Es werden zwei Bilder benutzt. Sie stellen die selbe Szenerie dar, jedoch in zwei unterschiedlichen Momenten. (&lt;u&gt;&lt;strong&gt;Hinweis&lt;/strong&gt;&lt;/u&gt;: Ich hatte vorher zu Demonstrationszwecken zwei Bilder gegenübergestellt, von denen eines einen ColorTone-Effekt hatte. Ich habe die Bildauswahl geändert, um den visuellen Effekt deutlicher zu demonstrieren.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Wie es funktioniert&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das Beispiel funktioniert ziemlich einfach. Es werden zwei Bilder in einem Grid platziert. Das Grid besteht aus drei Spalten. Beide Bilder erstrecken sich über alle drei Spalten. Die zweite Spalte hat einen fixen Wert für "Width". Diese Spalte hält ein GridSplitter-Steuerelement. Für eines der Bilder wird im Xaml-Quellcode eine leere RectangleGeometry als Beschneidungspfad definiert. Die Linke Spalte des Grid wird benannt. Die RectangleGeometry wird ebenfalls benannt.&lt;br /&gt;&lt;br /&gt;Im Code behind wird dann bei der Behandlung des "MouseMove"-Ereignisses die aktuelle Breite der linken Spalte abgefragt. Dieser Wert wird verwendet, um das rect-Attribut der RectangleGeometry dynamisch zu steuern. Von dem Bild, dem der Beschneidungspfad zugewiesen ist, wird dann immer nur der über die RectangleGeometry definierte Bereich angezeigt.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;strong&gt;&lt;a href="http://gallery.expression.microsoft.com/SLCSSSL4?SRC=Home"&gt;Beispielprojekt mit vollständigem Quellcode in der Expression Gallery&lt;/a&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Viel Spass damit!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-1380957313914133793?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/1380957313914133793/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/bildvergleich-mithilfe-eines.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/1380957313914133793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/1380957313914133793'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/bildvergleich-mithilfe-eines.html' title='Bildvergleich mithilfe eines GridSplitter'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6220607974014842756</id><published>2011-03-14T09:40:00.003+01:00</published><updated>2011-03-14T09:46:25.313+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RegularPolygon'/><category scheme='http://www.blogger.com/atom/ns#' term='UserControl'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='HalfSquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Half Square UserControl</title><content type='html'>Ich habe ein UserControl entwickelt, mit dem ein Halbquadrat erstellt werden kann. Den Download gibt es als .dll in der &lt;a href="http://gallery.expression.microsoft.com/SLHSUCSL4?SRC=Home"&gt;Expression Gallery&lt;/a&gt;. Einen Artikel über die Berechnungslogik für ein Halquadrat, erstellt aus einem RegularPolygon,&amp;nbsp;findet Ihr &lt;a href="http://silverlawone.blogspot.com/2011/03/how-to-ein-halbquadrat-aus-einem.html"&gt;hier&lt;/a&gt;.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Eigenschaften&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das "HalfSquareUserControl" wird grundlegend über fünf Eigenschaften konfiguriert:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-pU7lMa5sp_c/TX3IhR8UWeI/AAAAAAAAAK4/DNeKRF3Bejo/s1600/ssUI.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" q6="true" src="https://lh3.googleusercontent.com/-pU7lMa5sp_c/TX3IhR8UWeI/AAAAAAAAAK4/DNeKRF3Bejo/s1600/ssUI.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Mithilfe der Eigenschaft "RightCornerOrientation" kann die Orientierung der durch den rechten Winkel definierten Ecke festgelegt werden. Dieser Eigenschaft können alternativ vier Werte zugewiesen werden: "TopLeft", "TopRight", "BottomRight" oder "BottomLeft".&lt;br /&gt;&lt;br /&gt;Die Eigenschaft "SquareBrush" legt den Brush des Innenbereichs fest. Diese Eigenschaft entspricht der Eigenschaft "Fill" eines herkömmlichen RegularPolygon.&lt;br /&gt;&lt;br /&gt;Die Eigenschaft "StrokeBrush" legt den Brush für den Stroke fest.&lt;br /&gt;&lt;br /&gt;Über die Eigenschaft "SquareSize" werden die Seitenlängen des Quadrats festgelegt, in welches das Halbquadrat virtuell eingebettet ist. Das Setzen dieser Eigenschaft bewirkt, dass die Eigenschaften "Height" und "Width" jeweils die gleichen Werte haben.&lt;br /&gt;&lt;br /&gt;Die Eigenschaft "StrokeThickness" bestimmt schließlich die Stärke des Stroke in Pixel.&lt;br /&gt;&lt;br /&gt;Alle Eigenschaften sind als Abhängigkeitseigenschaften implementiert.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Verwendung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Herunterladen des Beispielprojekts in der Expression Gallery.&lt;br /&gt;&lt;br /&gt;2. Dem eigenen Silverlight-Projekt wird eine Referenz zu der SilverLawHalfSquare.dll hinzugefügt. Die .dll findet man im /Bin/Release-Ordner des Beispielprojekts.&lt;br /&gt;&lt;br /&gt;3. In der Registerkarte "Objekte" wird das "HalfSquareUserControl" ausgewählt ...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-xKXHMJ7Kn-o/TX3LOjML_DI/AAAAAAAAAK8/EBxAaaKi7Lo/s1600/ss_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" q6="true" src="https://lh3.googleusercontent.com/-xKXHMJ7Kn-o/TX3LOjML_DI/AAAAAAAAAK8/EBxAaaKi7Lo/s1600/ss_2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;4. ... und mit einem Doppelklick der UI hinzugefügt. Die Eigenschaften des UserControls sind in die Kategorie "Layout" eingebettet:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-uLBno102atM/TX3MLW7eRFI/AAAAAAAAALA/agNWgzxEERg/s1600/ss_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" q6="true" src="https://lh5.googleusercontent.com/-uLBno102atM/TX3MLW7eRFI/AAAAAAAAALA/agNWgzxEERg/s1600/ss_3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;5. Nach dem Hinzufügen des UserControls hat es zunächst eine Größe von 100px. Die Eigenschaften "Width" und "Height" sollten auf "Automatisch" gesetzt werden. Denn die Größe des UserControls wird einheitlich über die Eigenschaft "SquareSize" festgelegt. Eine Veränderung des Werts von "SquareSize" wirkt sich automatisch auf die Eigenschaften "Width" und "Height" aus. Das setzt aber voraus, dass diese beiden Eigenschaften auf "Automatisch" gesetzt wurden.&lt;br /&gt;&lt;br /&gt;Eine Größenveränderung des UserControls sollte nur über die Eigenschaft "SquareSize" erfolgen, damit die quadratische Dimension immer beibehalten wird.&lt;br /&gt;&lt;br /&gt;6. Optional können die Eigenschaften "StrokeThickness", "StrokeBrush", "SquareBrush" und "RightCornerOrientation" gesetzt werden.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Wichtiger Hinweis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Überwiegend wirkt sich jede Veränderung eines der Eigenschaftswerte bereits zur Entwurfszeit auf die visuelle Gestalt des UserControls aus. Hiervon gibt es&amp;nbsp;eine Ausnahme. Nachdem die Eigenschaft "StrokeBrush" geändert wurde, sollte das Projekt neu erstellt werden, damit diese Änderung zur Entwurfszeit visuell ordentlich sichtbar wird. Andernfalls kann es passieren, dass bei einer späteren Änderung des Werts der Eigenschaft "StrokeThickness" die visuelle Darstellung &lt;u&gt;zur Entwurfszeit&lt;/u&gt; verzerrt ist:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-iNHxAM7b-SQ/TX3PNPiteqI/AAAAAAAAALE/UVXbpgZYHps/s1600/ss_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" q6="true" src="https://lh3.googleusercontent.com/-iNHxAM7b-SQ/TX3PNPiteqI/AAAAAAAAALE/UVXbpgZYHps/s1600/ss_4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dieses Verhalten tritt &lt;u&gt;nur zur Entwurfszeit&lt;/u&gt; auf. Die Neuberechnung des Halbquadrats wird im Hintergrund zwar bei jeder Änderung einer Eigenschaft durchgeführt. Jedoch wird sie&amp;nbsp;zur Entwurfszeit in der besagten Konstellation nicht sofort umgesetzt, sondern erst nach einer neuen Erstellung des Projekts:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-sln_cv25kbw/TX3Q8Kgbi3I/AAAAAAAAALI/ikwHmP0UyZA/s1600/ss_5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" q6="true" src="https://lh5.googleusercontent.com/-sln_cv25kbw/TX3Q8Kgbi3I/AAAAAAAAALI/ikwHmP0UyZA/s1600/ss_5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ich bin bemüht, diese Unannehmlichkeit&amp;nbsp;in einer kommenden Version zu bereinigen. Zur Laufzeit tritt dieses Verhalten nicht auf.&lt;br /&gt;&lt;br /&gt;Euer Feedback hilft mir bei der Weiterentwicklung des UserControls.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Was kommt als Nächstes?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Soweit ich Zeit finde, werde ich weitere Alternativen für ein wiederverwendbares HalfSquare Control entwickeln. Derzeit geplant sind eine Implementierung als CustomControl und als Subklasse, die von Path erbt.&lt;br /&gt;&lt;br /&gt;Viel Spass vorerst mit dem HalfSquareUserControl.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;: &lt;a href="http://gallery.expression.microsoft.com/SLHSUCSL4?SRC=Home"&gt;HalfSquareUserControl als .dll (ohne Quellcode) in der Expression Gallery&lt;/a&gt;.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6220607974014842756?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6220607974014842756/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/half-square-usercontrol.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6220607974014842756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6220607974014842756'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/half-square-usercontrol.html' title='Half Square UserControl'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-pU7lMa5sp_c/TX3IhR8UWeI/AAAAAAAAAK4/DNeKRF3Bejo/s72-c/ssUI.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-5092236621226785028</id><published>2011-03-08T19:50:00.003+01:00</published><updated>2011-03-08T19:57:17.174+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='DependencyProperty'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>VB.NET-Version von Beat Kiener's DependencyPropertyChangedListener für Silverlight</title><content type='html'>&lt;a href="http://blog.thekieners.com/"&gt;Beat Kiener&lt;/a&gt; veröffentlichte in seinem Blog vor einiger Zeit einen sehr nützlichen Artikel, in dem er eine von ihm entwickelte DependencyPropertyChangedListener Klasse für Silverlight vorstellte. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.thekieners.com/2010/08/27/listening-to-dependencyproperty-changes-in-silverlight/"&gt;Hier geht es zu dem lesenswerten Artikel von Beat Kiener, wo es auch&amp;nbsp;den Quellcode der&amp;nbsp;C#-Version gibt.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Der DependencyPropertyChangedListener ermöglicht es, nach Veränderungen des Werts einer Abhängigkeitseigenschaft zu lauschen und über ein Event hierüber benachrichtigt zu werden. Das ist in vielen Szenarien eine sehr nützliche Sache. &lt;br /&gt;&lt;br /&gt;Ich habe den DependencyPropertyChangedListener&amp;nbsp;von Beat Kiener übersetzt nach&amp;nbsp;VB.NET. Denn ich konnte die Klasse in einem VB.NET-Projekt sehr gut brauchen. Beat Kiener war so freundlich und gab mir die Erlaubnis, die von mir übersetzte VB.NET-Version hier in meinem Blog zu veröffentlichen. Vielen Dank nochmal dafür! &lt;br /&gt;&lt;br /&gt;Hier also ist der Quellcode der VB.NET-Version (die originalen Kommentare habe ich beibehalten):&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;DependencyPropertyChangedListener.vb:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.Windows.Data&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedListener&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#Region&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Inner types"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;' Helper element to make it possible to use the binding engine &lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'to get notified when the source element property changes.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Friend&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Shared&lt;/span&gt; _listener &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedListener&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Friend&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; listener &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedListener&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; _listener = listener&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Shared&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; ValueProperty &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt; =&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515;"&gt;"Value"&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;GetType&lt;/span&gt;(&lt;span style="color: blue;"&gt;Object&lt;/span&gt;),&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;GetType&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt;),&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyMetadata&lt;/span&gt;(&lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &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; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyChangedCallback&lt;/span&gt;(&lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; OnValueChanged)))&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; Value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; GetValue(ValueProperty)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SetValue(ValueProperty, value)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Shared&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnValueChanged(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; d &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; oldValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt; = e.OldValue&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; newValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt; = e.NewValue&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; source &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt; = &lt;span style="color: blue;"&gt;CType&lt;/span&gt;(d, &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt;.OnValueChanged(oldValue, newValue)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Shared&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnValueChanged(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; oldValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; newValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; _listener.OnValueChanged(oldValue, newValue)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#End&lt;/span&gt; &lt;span style="color: blue;"&gt;Region&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#Region&lt;/span&gt; &lt;span style="color: #a31515;"&gt;" Events "&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;' Raises when the dependency property changes.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; ValueChanged &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyValueChangedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#End&lt;/span&gt; &lt;span style="color: blue;"&gt;Region&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;' Holds a reference to the relay object in order that the GC does not collect it&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; RelayInstance &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Shared&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; Create(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sourceElement &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; propertyPath &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedListener&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' check input&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; sourceElement &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Throw&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"sourceElement"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;.IsNullOrWhiteSpace(propertyPath) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Throw&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"propertyPath is empty"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' create listener&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; listener &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedListener&lt;/span&gt; = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedListener&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' setup binding&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; binding &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Binding&lt;/span&gt; = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Binding&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding.Source = sourceElement&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding.Mode = &lt;span style="color: #2b91af;"&gt;BindingMode&lt;/span&gt;.OneWay&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding.Path = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyPath&lt;/span&gt;(propertyPath)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' create relay object&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; relay &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt; = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt;(listener)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' ...the listener holds a reference to the relay object in order that the GC does not collect it&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.RelayInstance = relay&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' set binding&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;BindingOperations&lt;/span&gt;.SetBinding(relay, &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt;.ValueProperty, binding)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; listener&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Detach()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.RelayInstance &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: green;"&gt;' first: reset member to prevent further eventing of ValueChanged event.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; temp &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt; = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.RelayInstance&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.RelayInstance = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: green;"&gt;' second: clear the binding -&amp;gt; raises property changed event...&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; temp.ClearValue(&lt;span style="color: #2b91af;"&gt;RelayObject&lt;/span&gt;.ValueProperty)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnValueChanged(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; oldValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; newValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' raise event, but only if the listener is not detached.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.RelayInstance &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; ValueChanged(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyValueChangedEventArgs&lt;/span&gt;(oldValue, newValue))&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;DependencyPropertyValueChangedEventArgs.vb:&lt;/strong&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyValueChangedEventArgs&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Friend&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; oldValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; newValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OldValue = oldValue&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.NewValue = newValue&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'///&amp;nbsp; Gets the value of the property before the change.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; OldValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'/// Gets the value of the property after the change.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; NewValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Verwendung in MainPage.xaml.vb:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Partial&lt;/span&gt; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MainPage&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UserControl&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; listener &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedListener&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener = &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedListener&lt;/span&gt;.Create(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.txTest, &lt;span style="color: #a31515;"&gt;"Text"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; listener.ValueChanged,&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyValueChangedEventArgs&lt;/span&gt;)(&lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; listener_ValueChanged)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; btDetach.Click, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; DetachListener&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; listener_ValueChanged(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyPropertyValueChangedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;MessageBox&lt;/span&gt;.Show(e.NewValue.ToString)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; DetachListener(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RoutedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; listener &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; listener.Detach()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Viel Spass damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-5092236621226785028?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/5092236621226785028/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/vbnet-version-von-beat-kieners.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5092236621226785028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5092236621226785028'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/vbnet-version-von-beat-kieners.html' title='VB.NET-Version von Beat Kiener&apos;s DependencyPropertyChangedListener für Silverlight'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-2063905168603194076</id><published>2011-03-06T17:01:00.002+01:00</published><updated>2011-03-06T18:14:48.662+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RegularPolygon'/><category scheme='http://www.blogger.com/atom/ns#' term='Triangle'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='HalfSquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>How To: Ein Halbquadrat aus einem RegularPolygon (Dreieck) erstellen</title><content type='html'>Das ist ein Halbquadrat, auch bezeichnet als gleichschenklig-rechtwinkliges Dreieck:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-cmDGtcR0ayg/TXNTflXIZqI/AAAAAAAAAJ0/vewppt7Znrs/s1600/ss_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" l6="true" src="https://lh6.googleusercontent.com/-cmDGtcR0ayg/TXNTflXIZqI/AAAAAAAAAJ0/vewppt7Znrs/s320/ss_1.png" width="314" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ein Halbquadrat wird als Halbquadrat bezeichnet, weil man es erzeugen kann, indem man ein Quadrat über seine Diagonale teilt. Dieser Artikel beschreibt, wie man ein solches Halbquadrat aus einem RegularPolygon erstellt. Dabei soll das Halbquadrat in einem quadratischen Canvas-Steuerelement platziert werden und zwar exakt so, dass es das Canvas über seine Diagonale teilt. Außerdem soll das Halbquadrat auch dann, wenn es einen Rand hat, also eine StrokeThickness mit einem Wert&amp;nbsp;größer als "0", jeweils exakt positioniert bleiben. Das ist etwas trickreich. Schließlich soll das Halbquadrat so konfiguriert werden, dass es nur über eine einzige Eigenschaftsänderung ("Rotation") die Eck-Ausrichtung des rechten Winkels ändert.&lt;br /&gt;&lt;br /&gt;Auf geht's.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Vorbemerkung&lt;/span&gt;&lt;br /&gt;Ein RegularPolygon wird in "Expression Blend" als Triangle (Dreieck) bezeichnet. Im folgenden werde ich nur die Bezeichnung "Triangle" (Dreieck) verwenden, weil ein Triangle ein RegularPolygon ist, das über drei Punkte definiert wird. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Ein bißchen Geometrie&lt;/span&gt;&lt;br /&gt;Gegeben ist ein Quadrat. Das Quadrat hat bekanntlich vier gleichlange Seiten. Die Seitenlänge des Quadrats wird mit "a" bezeichnet. Die Diagonale, die das Quadrat teilt, wird mit "d" bezeichnet. Die folgende Skizze visualisiert das:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh6.googleusercontent.com/-0wiJE7VZHG0/TXNX0M_qisI/AAAAAAAAAJ4/BS9AUSApip4/s1600/ss_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" l6="true" src="https://lh6.googleusercontent.com/-0wiJE7VZHG0/TXNX0M_qisI/AAAAAAAAAJ4/BS9AUSApip4/s320/ss_2.png" width="314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Die Länge der Diagonalen "&lt;span style="color: red;"&gt;d&lt;/span&gt;" wird wie folgt berechnet:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = √ 2&amp;nbsp;* &lt;span style="color: blue;"&gt;a&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;u&gt;Beispielrechnung&lt;/u&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;a&lt;/span&gt; = &lt;span style="color: blue;"&gt;100&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = &lt;span style="color: red;"&gt;?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = 1.4142135623730950488016887242097 * &lt;span style="color: blue;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = &lt;span style="color: red;"&gt;141.42135623730950488016887242097 &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Die Höhe des Halbquadrats ist gleich der Hälfte der Diagonalen "d", also:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;h = &lt;span style="color: red;"&gt;d&lt;/span&gt; * 0.5&lt;/div&gt;&lt;br /&gt;Mehr Mathematik wird zunächst nicht benötigt, um zu verstehen, wie ein Halbquadrat geometrisch berechnet wird. &lt;br /&gt;&lt;br /&gt;Trotzdem möchte ich an dieser Stelle bereits auf einen wichtigen Punkt hinweisen. Die Übertragung dieser geometrischen Berechnungsformel auf ein Dreieck, das in einer Silverlight-Anwendung verwendet werden soll, funktioniert nur eingeschränkt. Eingeschränkt insofern, als dass es zwar für ein Dreieck ohne Rand, nicht jedoch für ein Dreieck mit Rand funktioniert. Um das Problem zu verdeutlichen, verwende ich im folgenden Beispiel trotzdem zunächst diese reine geometrische Formel. Im weiteren Verlauf stelle ich dann die Formeln vor, die benötigt werden, um ein Dreieck mit Rand als Halbquadrat verwenden zu können.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Ein bißchen Blend&lt;/span&gt;&lt;br /&gt;Um die Vorgehensweise zu verdeutlichen, wird ein Beispielprojekt erstellt. Der Oberfläche wird ein quadratisches Canvas hinzugefügt. Die Werte für Breite und Höhe betragen jeweils "&lt;strong&gt;150&lt;/strong&gt;":&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-QG0UoAC8EG4/TXNbVvNVu9I/AAAAAAAAAJ8/3SQbZA5jTu4/s1600/ss_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh3.googleusercontent.com/-QG0UoAC8EG4/TXNbVvNVu9I/AAAAAAAAAJ8/3SQbZA5jTu4/s1600/ss_3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Mit einem Doppelklick auf die Form "Triangle" wird dem selektierten Canvas ein "Triangle"-Element hinzugefügt:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-pfGEysvvtds/TXNb8bVeuiI/AAAAAAAAAKA/NRQRKUA1WMA/s1600/ss_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh3.googleusercontent.com/-pfGEysvvtds/TXNb8bVeuiI/AAAAAAAAAKA/NRQRKUA1WMA/s1600/ss_4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Der Wert für "StrokeThickness" wird zunächst auf "0" gesetzt. Ich gehe etwas später darauf ein, wie man die Berechnung der Größe des Halbquadrats modifizieren muss, um auch mit einer "StrokeThickness" &amp;gt; "0" das Halbquadrat so zu erzeugen, dass es exakt in das quadratische Canvas paßt.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-3OvqCKXWbkY/TXNciO-KjSI/AAAAAAAAAKE/1OkVUjIQmKU/s1600/ss_5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh6.googleusercontent.com/-3OvqCKXWbkY/TXNciO-KjSI/AAAAAAAAAKE/1OkVUjIQmKU/s1600/ss_5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das Halbquadrat soll so im Canvas platziert werden, dass seine Breite der Länge der Diagonalen des Canvas entspricht. Deswegen wird anhand der oben genannten Formel die Breite des Halbquadrats berechnet. Die Seitenlänge des Canvas beträgt 150px. Also hat "&lt;span style="color: blue;"&gt;a&lt;/span&gt;" den Wert 150. Die Berechnung lautet also:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = 1.4142135623730950488016887242097 * &lt;span style="color: blue;"&gt;150&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = &lt;span style="color: red;"&gt;212.132&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Der Wert von "&lt;span style="color: red;"&gt;d&lt;/span&gt;" wird als Breite des Triangle eingetragen. Die Höhe des Triangle ist gleich der Hälfte der Länge der Diagonalen:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-ggGjlUQnBk4/TXNfnA9M1SI/AAAAAAAAAKI/qM0xhx5RtEc/s1600/ss_6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh4.googleusercontent.com/-ggGjlUQnBk4/TXNfnA9M1SI/AAAAAAAAAKI/qM0xhx5RtEc/s1600/ss_6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Danach sieht das Triangel so aus:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-h9qXszdse2s/TXNf7d8zgII/AAAAAAAAAKM/F1SS0agzQdQ/s1600/ss_7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh4.googleusercontent.com/-h9qXszdse2s/TXNf7d8zgII/AAAAAAAAAKM/F1SS0agzQdQ/s1600/ss_7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Wenn das Triangle jetzt um 45° gedreht wird, werden die gleichlangen Schenkel, die zueinander im rechten Winkel stehen, so ausgerichtet, dass sie parallel zu den Seiten des quadratischen Canvas verlaufen:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-rMxef7v4KSc/TXNg3FnhurI/AAAAAAAAAKQ/oO6qf_v_-CQ/s1600/ss_8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh5.googleusercontent.com/-rMxef7v4KSc/TXNg3FnhurI/AAAAAAAAAKQ/oO6qf_v_-CQ/s1600/ss_8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das Triangle sieht dann so aus:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-aIw-P-SJ08c/TXNg8cUS2cI/AAAAAAAAAKU/2cyAiSudK5c/s1600/ss_9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh3.googleusercontent.com/-aIw-P-SJ08c/TXNg8cUS2cI/AAAAAAAAAKU/2cyAiSudK5c/s1600/ss_9.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das obige Bild zeigt, dass das Dreieck jetzt einen leichten Versatz hat. Es ist leicht nach links und nach unten versetzt. Diesen Versatz müssen wir beseitigen. Um diesen Versatz zu beseitigen, wird eine Translation über die X-Achse und über die Y-Achse benutzt. Für ein Triangle, das einen Wert für "StrokeThickness" = "0" hat, kann man folgende Formel benutzen, um die Werte für die Translations-Transformationen zu berechnen:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;TranslateX = ((&lt;span style="color: red;"&gt;d&lt;/span&gt; - &lt;span style="color: blue;"&gt;a&lt;/span&gt;) : 2) * -1&lt;/div&gt;&lt;div style="text-align: center;"&gt;TranslateY = ((&lt;span style="color: red;"&gt;d&lt;/span&gt; - &lt;span style="color: blue;"&gt;a&lt;/span&gt;) : 2) * -1&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Damit diese Formel funktioniert, müssen die Werte für "RenderTransformOrigin" des "Triangle" folgendermaßen eingestellt werden:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-xBsyTQI-stw/TXNjY-sr2bI/AAAAAAAAAKY/n09FfKKdUtg/s1600/ss_10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="68" l6="true" src="https://lh6.googleusercontent.com/-xBsyTQI-stw/TXNjY-sr2bI/AAAAAAAAAKY/n09FfKKdUtg/s320/ss_10.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Mit diesen Werten wird der Drehmittelpunkt des "Triangle" genau in der Mitte seines unteren Randes positioniert.&lt;br /&gt;&lt;br /&gt;Jetzt wird die Formel angewendet ...&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;TranslateX = ((&lt;span style="color: red;"&gt;212.132&lt;/span&gt; - &lt;span style="color: blue;"&gt;150&lt;/span&gt;) : 2) * -1&lt;/div&gt;&lt;div style="text-align: center;"&gt;TranslateX = &lt;strong&gt;31.066&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;TranslateY = ((&lt;span style="color: red;"&gt;212.132&lt;/span&gt; - &lt;span style="color: blue;"&gt;150&lt;/span&gt;) : 2) * -1&lt;/div&gt;&lt;div style="text-align: center;"&gt;TranslateY = &lt;strong&gt;31.066&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;... und die Berechnungsergebnisse als X- bzw. Y-Translation des Triangle zugewiesen:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-eLGztamu3B4/TXNlThe5KlI/AAAAAAAAAKc/xJ8sgMIC550/s1600/ss_11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" l6="true" src="https://lh3.googleusercontent.com/-eLGztamu3B4/TXNlThe5KlI/AAAAAAAAAKc/xJ8sgMIC550/s320/ss_11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Jetzt sieht das Triangle innerhalb des Canvas folgendermaßen aus:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-R53_pKEJ_lY/TXNloJRm08I/AAAAAAAAAKg/i4jk8Esisfc/s1600/ss_12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh6.googleusercontent.com/-R53_pKEJ_lY/TXNloJRm08I/AAAAAAAAAKg/i4jk8Esisfc/s1600/ss_12.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Aber halt. Nicht zu früh freuen! Denn bisher hat das Triangle eine "StrokeThickness" mit dem Wert "0". Was passiert, wenn wir dem "Triangle" jetzt eine "StrokeThickness" mit einem Wert &amp;gt; 0 zuweisen? Es passiert das hier, bei einer "StrokeThickness"&amp;nbsp;mit einem Wert von beispielsweise "30":&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-h85z86QvOpk/TXNnFY9em-I/AAAAAAAAAKo/P-Xm6p9a_RM/s1600/ss_13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh3.googleusercontent.com/-h85z86QvOpk/TXNnFY9em-I/AAAAAAAAAKo/P-Xm6p9a_RM/s1600/ss_13.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Im obigen Bild hat der Stroke die Farbe&amp;nbsp;blau. Man sieht, dass das Dreiecks offensichtlich seine exakte Positionierung verloren hat&amp;nbsp;und das Dreieck ist auch kein gleichschenklig-rechtwinkliges Dreieck mehr.&amp;nbsp;Um dieses ungewünschte Ergebnis zu bereinigen, müssen die Formeln zur Berechnung der Werte des Triangle folgendermaßen geändert werden, wobei "&lt;span style="color: #274e13;"&gt;s&lt;/span&gt;" der Wert für die StrokeThickness ist:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;a&lt;/span&gt; = &lt;span style="color: blue;"&gt;150&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = √ 2&amp;nbsp;* (&lt;span style="color: blue;"&gt;a - &lt;span style="color: #274e13;"&gt;s&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Triangle Width = &lt;span style="color: red;"&gt;d&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = √ 2 * (&lt;span style="color: blue;"&gt;a&lt;/span&gt; - &lt;span style="color: #274e13;"&gt;s&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: red;"&gt;d&lt;/span&gt; = √ 2 * (&lt;span style="color: blue;"&gt;150&lt;/span&gt; - &lt;span style="color: #274e13;"&gt;30&lt;/span&gt;)&lt;br /&gt;&lt;strong&gt;=&amp;gt; Triangle Width = 169.7056&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Triangle Height = h&lt;br /&gt;h = (&lt;span style="color: red;"&gt;d&lt;/span&gt; : 2) + (&lt;span style="color: #274e13;"&gt;s&lt;/span&gt; * 0.5)&lt;br /&gt;h = (&lt;span style="color: red;"&gt;169.7056&lt;/span&gt; : 2) + (&lt;span style="color: #274e13;"&gt;30&lt;/span&gt; * 0.5)&lt;br /&gt;h = 99.8528&lt;br /&gt;&lt;strong&gt;=&amp;gt; Triangle Height = 99.8528&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;TranslateX = ((&lt;span style="color: red;"&gt;d&lt;/span&gt; - &lt;span style="color: blue;"&gt;a&lt;/span&gt;) * 0.5) * -1&lt;br /&gt;TranslateX = ((&lt;span style="color: red;"&gt;169.7056&lt;/span&gt; - &lt;span style="color: blue;"&gt;150&lt;/span&gt;) * 0.5) * -1&lt;br /&gt;&lt;strong&gt;=&amp;gt; TranslateX = -9.8528&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;TranslateY = (((&lt;span style="color: red;"&gt;d&lt;/span&gt; - &lt;span style="color: blue;"&gt;a&lt;/span&gt;) * 0.5) + (&lt;span style="color: #274e13;"&gt;s&lt;/span&gt; * 0.5)) * -1&lt;br /&gt;TranslateY = (((&lt;span style="color: red;"&gt;169.7056&lt;/span&gt; - &lt;span style="color: blue;"&gt;150&lt;/span&gt;) * 0.5) + (&lt;span style="color: #274e13;"&gt;30&lt;/span&gt; * 0.5)) * -1&lt;br /&gt;&lt;strong&gt;=&amp;gt; TranslateY = -24.8528&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Zur Probe werden die&amp;nbsp;obigen Berechnungsergebnisse als Eigenschaftswerte für das Triangle eingetragen:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-1xsVLUTiPf8/TXNuWQl1FJI/AAAAAAAAAKs/3JCnuypbM6s/s1600/ss_14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="134" l6="true" src="https://lh6.googleusercontent.com/-1xsVLUTiPf8/TXNuWQl1FJI/AAAAAAAAAKs/3JCnuypbM6s/s320/ss_14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-pulsnLFOlj4/TXNubB7VFoI/AAAAAAAAAKw/RXbLMmlWjbc/s1600/ss_15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="94" l6="true" src="https://lh5.googleusercontent.com/-pulsnLFOlj4/TXNubB7VFoI/AAAAAAAAAKw/RXbLMmlWjbc/s320/ss_15.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das Dreieck sieht nach diesen Änderungen so aus, wie es aussehen soll. Es fügt sich wieder exakt in das quadratische Canvas ein:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-6hRvUp6qwqk/TXNuwMjMQHI/AAAAAAAAAK0/_Bshsv88a_U/s1600/ss_16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" l6="true" src="https://lh4.googleusercontent.com/-6hRvUp6qwqk/TXNuwMjMQHI/AAAAAAAAAK0/_Bshsv88a_U/s1600/ss_16.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Änderung der Ausrichtung&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Ich hatte weiter oben den Drehmittelpunkt des Dreiecks in der Mitte seines unteren Randes positioniert. Zur Erinnerung: Das erfolgte über die Einstellungen von RenderTransformOrigin. Der Vorteil des so definierten Drehmittelpunktes ist, dass das Dreieck jetzt sehr einfach in seiner Ausrichtung verändert werden kann. Und zwar über den Wert für die Rotation. Gegenwärtig beträgt der Drehwinkel 45°. Damit zeigt das Dreieck mit seinem rechten Winkel nach oben rechts. Über die Veränderung des Rotationswinkels kann die Ausrichtung verändert werden:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;strong&gt;Rotation ----- Ausrichtung&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp; -45°&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;oben links&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp; 45&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; oben rechts&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;135&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; unten rechts&lt;/div&gt;&lt;div style="text-align: left;"&gt;-135&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; unten links&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Ein Berechnungsprogramm als Helfer&lt;/span&gt;&lt;br /&gt;Ich habe ein kleines Berechnungsprogramm erstellt, das die erforderlichen Werte für ein Halbquadrat vornimmt. Hier ist es, die Bedienung sollte selbsterklärend sein:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/SLHS/s1.html" style="height: 600px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Das Berechnungsprogramms kann einschließlich Quellcode in der Expression Gallery heruntergeladen werden.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;strong&gt;&lt;a href="http://gallery.expression.microsoft.com/SLHSSL4?SRC=Home"&gt;Quellcode des Berechnungsprogramms&lt;/a&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Viel Spaß also beim Design mit Halbquadraten.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-2063905168603194076?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/2063905168603194076/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/how-to-ein-halbquadrat-aus-einem.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2063905168603194076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2063905168603194076'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/how-to-ein-halbquadrat-aus-einem.html' title='How To: Ein Halbquadrat aus einem RegularPolygon (Dreieck) erstellen'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-cmDGtcR0ayg/TXNTflXIZqI/AAAAAAAAAJ0/vewppt7Znrs/s72-c/ss_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-4296453663927429660</id><published>2011-03-02T10:24:00.000+01:00</published><updated>2011-03-02T10:24:17.126+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 3'/><category scheme='http://www.blogger.com/atom/ns#' term='CompositionTarget.Rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='LocalMessaging'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><title type='text'>How To: Eine Aktion erst mit der vollständigen Sichtbarkeit einer Anwendung im Browserfenster starten</title><content type='html'>In &lt;a href="http://silverlawone.blogspot.com/2011/02/how-to-storyboard-erst-mit-dem.html"&gt;meinem letzten Artikel&lt;/a&gt; habe ich beschrieben, wie man ein Storyboard erst dann startet, wenn die Anwendung im Browserfenster sichtbar wird. Die dort vorgestellte Lösung hat jedoch eine Beschränkung. Diese Beschränkung besteht darin, dass das Storyboard schon dann startet, wenn die Anwendung auch nur&amp;nbsp;&lt;strong&gt;teilweise&lt;/strong&gt; im Browserfenster sichtbar wird. Das liegt daran, dass das Ereignis "CompositionTarget.Rendering()" feuert, sobald auch nur ein Pixel&amp;nbsp;der Anwendung sichtbar wird.&lt;br /&gt;&lt;br /&gt;In diesem Artikel beschreibe ich&amp;nbsp;eine Lösung, die es ermöglicht, eine Aktion erst dann zu starten, wenn die Anwendung &lt;strong&gt;vollständig&lt;/strong&gt; im Browserfenster sichtbar ist. Diese Technik kann beispielsweise für das Erstellen einer Silverlight-Anwendung nützlich sein, mit der eine Werbung dargestellt werden soll.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Generelle Vorgehensweise&lt;/span&gt;&lt;br /&gt;Die vorgestellte Lösung verwendet einen Trick. Dieser Trick besteht darin, dass oberhalb und unterhalb der eigentlichen Anwendung jeweils eine weitere Anwendung eingebettet wird. Es gibt also die Hauptanwendung, die den eigentlichen Inhalt darstellen soll. Unmittelbar oberhalb dieser Anwendung ist in der html-Seite eine weitere Anwendung eingebettet. Das ist die TopApp. Unmittelbar unterhalb der Hauptanwendung ist noch eine Anwendung in die html-Seite eingebettet. Das ist die BottomApp. Die beiden Anwendungen TopApp und BottomApp haben jeweils eine Breite, die der Breite der Hauptanwendung entspricht. Die Höhe von TopApp und BottomApp beträgt 1px.&lt;br /&gt;&lt;br /&gt;Die drei Anwendungen kommunizieren über LocalMessaging miteinander. Wenn der Nutzer die html-Seite von oben nach unten scrollt, wird zunächst die TopApp sichtbar. Dann wird die Hauptanwendung sichtbar. Und zuletzt wird die BottomApp sichtbar. Sobald die TopApp sichtbar wird, beginnt das Ereignis "CompositionTarget.Rendering()" der TopApp zu feuern. Diesem Ereignis ist ein Delegat hinzugefügt. Die Methode, auf die dieser Delegat zeigt,&amp;nbsp;hat die Aufgabe, an die Hauptanwendung eine Nachricht zu senden. Die Hauptanwendung notiert das in der Variablen "IsTopVisible" und setzt deren Wert auf "True". Damit die Methode, die im Sender für das Senden der Nachricht verantwortlich ist, entfernt wird, antwortet die Hauptanwendung dem Sender der TopApp mit einem TrueString. Damit der Sender von TopApp diese Antwort verarbeiten kann, ist dem Ereignis "SendCompleted()" des "LocalMessageSender" ein Delegat hinzugefügt. Die Methode, auf die dieser Delegat zeigt, hat die Aufgabe, die Anwort der Hauptanwendung zu verarbeiten. Das heisst, sie entfernt den Delegaten, der dem "CompositionTarget.Rendering()" von TopApp hinzugefügt worden war. Ebenso wie die TopApp, schickt auch die BottomApp an die Hauptanwendung eine Nachricht, sobald die BottomApp sichtbar ist. Die Hauptanwendung notiert das wiederum in einer Variablen. Das ist die Variable&amp;nbsp;"IsBottomVisible", deren Wert auf "True" gesetzt wird. Wenn sowohl "IsTopVisible" als auch "IsBottomVisible" den Wert "True" haben, ist die Hauptanwendung vollständig sichtbar. Die Hauptanwendung kann dann die Aktion starten, die erfolgen soll, sobald sie vollständig sichtbar ist. Damit die Hauptanwendung reagieren kann, wird dem Ereignis "CompositionTarget.Rendering()" der Hauptanwendung ein Delegat hinzugefügt. Die Methode, auf die dieser Delegat zeigt, überprüft die beiden Variablen "IsTopVisible" und "IsBottomVisible" auf den Wert "True", führt dann die Aktion durch und entfernt schließlich den Delegaten wieder.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Quellcode&lt;/span&gt;&lt;br /&gt;Nachfolgend ist der Quellcode der drei Anwendungen abgebildet.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. "TopApp"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.Windows.Messaging&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' ##############&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' TOP SENDER App&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' ##############&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Partial&lt;/span&gt; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MainPage&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UserControl&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CompositionTarget&lt;/span&gt;.Rendering, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; SendMessages&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; TopSender.SendCompleted, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; ListenToResponse&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; TopSender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LocalMessageSender&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"SilverLawTopReceiver"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; SendMessages(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TopSender.SendAsync(&lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;.TrueString)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; ListenToResponse(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SendCompletedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Response = &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;.TrueString &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CompositionTarget&lt;/span&gt;.Rendering, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; SendMessages&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt; TopSender.SendCompleted, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; ListenToResponse&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515;"&gt;"TopSender received True-Message as a response."&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;2. "MainApp"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.Windows.Messaging&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' ####################&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' MAIN SILVERLIGHT APP&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' ####################&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Partial&lt;/span&gt; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MainPage&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UserControl&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CompositionTarget&lt;/span&gt;.Rendering, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; ListenToVisibility&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; MainTopReceiver.MessageReceived, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; TopMessageReceived&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MainTopReceiver.Listen()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; MainBottomReceiver.MessageReceived, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; BottomMessageReceived&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MainBottomReceiver.Listen()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#Region&lt;/span&gt; &lt;span style="color: #a31515;"&gt;" TOP VISIBILITY MESSAGING "&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; IsTopVisible &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; MainTopReceiver &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LocalMessageReceiver&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"SilverLawTopReceiver"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; TopMessageReceived(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MessageReceivedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Message = &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;.TrueString &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.IsTopVisible = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; tbTopInfo.Text = &lt;span style="color: #a31515;"&gt;"Top side visible."&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; e.Response = &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;.TrueString&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#End&lt;/span&gt; &lt;span style="color: blue;"&gt;Region&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#Region&lt;/span&gt; &lt;span style="color: #a31515;"&gt;" BOTTOM VISIBILITY MESSAGING "&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; IsBottomVisible &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; MainBottomReceiver &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LocalMessageReceiver&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"SilverLawBottomReceiver"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; BottomMessageReceived(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MessageReceivedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Message = &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;.TrueString &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.IsBottomVisible = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; tbBottomInfo.Text = &lt;span style="color: #a31515;"&gt;"Bottom side visible."&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; e.Response = &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;.TrueString&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#End&lt;/span&gt; &lt;span style="color: blue;"&gt;Region&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#Region&lt;/span&gt; &lt;span style="color: #a31515;"&gt;" LISTENING FOR FULL VISIBILITY OF THE APP "&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; ListenToVisibility(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.IsTopVisible = &lt;span style="color: blue;"&gt;True&lt;/span&gt; &lt;span style="color: blue;"&gt;And&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.IsBottomVisible = &lt;span style="color: blue;"&gt;True&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; LayoutRoot.Background = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SolidColorBrush&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Colors&lt;/span&gt;.DarkGray)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CompositionTarget&lt;/span&gt;.Rendering, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; ListenToVisibility&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;#End&lt;/span&gt; &lt;span style="color: blue;"&gt;Region&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;3. "BottomApp"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.Windows.Messaging&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' #################&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' BOTTOM SENDER APP&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;' #################&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Partial&lt;/span&gt; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MainPage&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UserControl&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CompositionTarget&lt;/span&gt;.Rendering, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; SendMessages&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; BottomSender.SendCompleted, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; ListenToResponse&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; BottomSender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LocalMessageSender&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"SilverLawBottomReceiver"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; SendMessages(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BottomSender.SendAsync(&lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;.TrueString)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; ListenToResponse(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SendCompletedEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Response = &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;.TrueString &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CompositionTarget&lt;/span&gt;.Rendering, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; SendMessages&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt; BottomSender.SendCompleted, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; ListenToResponse&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515;"&gt;"BottomSender received True-Message as a response."&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Beispielanwendung&lt;/span&gt;&lt;br /&gt;Eine Beispielanwendung, mit der diese Technik demonstriert wird, findet&amp;nbsp;man unter &lt;strong&gt;&lt;a href="http://silverlawone.de/silverlawblogde/SLAV/default.htm"&gt;diesem Link&lt;/a&gt;&lt;/strong&gt;. Sobald die Hauptanwendung vollständig sichtbar ist, wechselt die Hintergrundfarbe der Anwendung von Schwarz zu Dunkelgrau.&lt;br /&gt;&lt;br /&gt;Viel Spass damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-4296453663927429660?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/4296453663927429660/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/03/how-to-eine-aktion-erst-mit-der.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/4296453663927429660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/4296453663927429660'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/03/how-to-eine-aktion-erst-mit-der.html' title='How To: Eine Aktion erst mit der vollständigen Sichtbarkeit einer Anwendung im Browserfenster starten'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-7047895890020958692</id><published>2011-02-27T18:25:00.000+01:00</published><updated>2011-02-27T18:25:13.340+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Storyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><title type='text'>How To: Storyboard erst mit dem Sichtbarwerden der Anwendung im Browserfenster starten</title><content type='html'>In zwei früheren Artikeln habe ich Techniken beschrieben, um ein Storyboard erst dann zu starten, wenn das Laden der Silverlight-Anwendung abgeschlossen ist. Diese Techniken helfen spätestens dann nicht mehr, wenn die Silverlight-Anwendung eine kleine Größe hat, Bestandteil einer größeren html-Seite ist und zunächst nicht sichtbar ist, wenn die html-Seite startet, z.B. weil sie am untersten Ende der html-Seite eingebettet ist.&lt;br /&gt;&lt;br /&gt;Dieser Artikel schließt diese Lücke.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Am unteren Ende dieses Artikels findet Ihr eine Beispielanwendung, die die Technik demonstriert. Die Anwendung spielt ein Storyboard ab, sobald die Anwendung im Browserfenster sichtbar wird. Wer neugierig ist, scrollt diese Seite einfach runter und sobald die Beispielanwendung sichtbar wird, startet das Storyboard. (Das Storyboard bewegt einen Balken von links nach rechts und wechselt die Hintergrundfarbe von Dunkelgrau zu Grün. Es läuft nur einmal.) Nachfolgend findet Ihr zunächst den Quellcode.&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Partial&lt;/span&gt; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MainPage&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UserControl&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CompositionTarget&lt;/span&gt;.Rendering, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; DoSomething&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; DoSomething(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sbTest.Begin()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CompositionTarget&lt;/span&gt;.Rendering, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; DoSomething&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Und so funktioniert das Ganze. Im Ereignisbehandler des Konstruktors der Anwendung wird dem CompositionTarget.Rendering() Ereignis ein Delegat hinzugefügt. Dieser Delegat zeigt auf die Methode DoSomething(). Die Methode DoSomething() startet das Storyboard und entfernt dann den Delegaten.&lt;br /&gt;&lt;br /&gt;Und warum funktioniert das Ganze? Ganz einfach: Das Ereignis "Rendering()" der Klasse CompositionTarget feuert nur dann, wenn das Silverliight-PlugIn im Browserfenster mindestens teilsweise sichtbar ist.&lt;br /&gt;&lt;br /&gt;Diese Technik kann natürlich auch für anderes benutzt werden. Es kann beispielsweise ein Video abgespielt werden oder Inhalt dynamisch nachgeladen werden, sobald die Anwendung sichtbar wird.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/SSIT/s1.html" style="height: 302px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-7047895890020958692?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/7047895890020958692/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/02/how-to-storyboard-erst-mit-dem.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/7047895890020958692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/7047895890020958692'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/02/how-to-storyboard-erst-mit-dem.html' title='How To: Storyboard erst mit dem Sichtbarwerden der Anwendung im Browserfenster starten'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-5806515601822435498</id><published>2011-02-13T11:44:00.001+01:00</published><updated>2011-02-13T11:45:10.731+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='HyperlinkButton'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Einfacher HyperlinkButton Style</title><content type='html'>Ich habe einen neuen &lt;a href="http://gallery.expression.microsoft.com/SLASHLBSSL4?SRC=Home"&gt;HyperlinkButton Style&lt;/a&gt; gestaltet, der in der Expression Gallery heruntergeladen werden kann. Er hat ein sehr schlichtes Design mit ein paar dezenten Animationen. Schaut es Euch einfach an.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://gallery.expression.microsoft.com/SLASHLBSSL4?SRC=Home"&gt;&lt;img border="0" h5="true" src="http://4.bp.blogspot.com/-jrnFkMs98DE/TVe1eQsd2CI/AAAAAAAAAJs/QZ1aZrxHMPU/s1600/screenshot541x588.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Viel Spass damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-5806515601822435498?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/5806515601822435498/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/02/einfacher-hyperlinkbutton-style.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5806515601822435498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5806515601822435498'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/02/einfacher-hyperlinkbutton-style.html' title='Einfacher HyperlinkButton Style'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-jrnFkMs98DE/TVe1eQsd2CI/AAAAAAAAAJs/QZ1aZrxHMPU/s72-c/screenshot541x588.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-4747096406300703851</id><published>2011-02-04T16:39:00.002+01:00</published><updated>2011-02-04T16:43:58.042+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Storyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='Loaded Event'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Zweite Alternative: Storyboard soll nicht beginnen, bevor die Silverlight-Anwendung vollständig geladen ist</title><content type='html'>Hierzu hatte ich &lt;a href="http://silverlawone.blogspot.com/2010/06/how-to-storyboard-erst-beginnen-wenn.html"&gt;vor einiger Zeit schon einmal einen kurzen Artikel&lt;/a&gt; geschrieben. Das Problem ist bekannt: Ein Storyboard soll nicht starten, bevor die Anwendung vollständig geladen und sichtbar ist. Dieser Artikel zeigt eine andere, alternative Lösung auf. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Diese alternative Lösung nutzt eine Eigenschaft des SilverlightHost. Das ist die Eigenschaft "&lt;a href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;amp;l=DE-DE&amp;amp;k=k(SYSTEM.WINDOWS.INTEROP.SILVERLIGHTHOST.ISLOADED);k(TargetFrameworkMoniker-%22SILVERLIGHT%2cVERSION%3dV4.0%22);k(DevLang-VB)&amp;amp;rd=true"&gt;IsLoaded&lt;/a&gt;". Diese Eigenschaft zeigt an, ob das gehostete "Silverlight-Plug-In" den Ladevorgang vollständig abgeschlossen hat. &lt;br /&gt;&lt;br /&gt;Hier ist der betreffende Quellcode von MainPage.xaml.vb:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; InitializeComponent()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; pd = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DispatcherTimer&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt; {.Interval = &lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;.FromMilliseconds(100)}&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; pd.Tick, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; CheckLoadedStatus&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; pd.Start()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; pd &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DispatcherTimer&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; CheckLoadedStatus(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;App&lt;/span&gt;.Current.Host.IsLoaded = &lt;span style="color: blue;"&gt;True&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pd.Stop()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt; pd.Tick, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; CheckLoadedStatus&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sbMove.Begin()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Die Vorgehensweise ist total einfach. Im Konstruktor von MainPage&amp;nbsp;wird ein DispatcherTimer mit einem Intervall von 100ms erzeugt. Die Routine "&lt;em&gt;CheckLoadedStatus&lt;/em&gt;" hängt sich an das&amp;nbsp;Tick-Ereignis des DispatcherTimers. Der DispatcherTimer wird gestartet. Die Methode "&lt;em&gt;CheckLoadedStatus&lt;/em&gt;" überprüft alle 100ms den Wert von App.Current.Host.&lt;strong&gt;IsLoaded&lt;/strong&gt;. Sobald der Wert auf "&lt;em&gt;True&lt;/em&gt;" geht, wird der DispatcherTimer angehalten, der Delegat entfernt und das Storyboard gestartet.&lt;br /&gt;&lt;br /&gt;Total simpel und es funktioniert garantiert.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-4747096406300703851?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/4747096406300703851/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/02/zweite-alternative-storyboard-erst.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/4747096406300703851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/4747096406300703851'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/02/zweite-alternative-storyboard-erst.html' title='Zweite Alternative: Storyboard soll nicht beginnen, bevor die Silverlight-Anwendung vollständig geladen ist'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-2268600607268027822</id><published>2011-02-03T19:38:00.005+01:00</published><updated>2011-02-04T10:29:24.171+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Behavior'/><title type='text'>SpriteAnimationBehavior</title><content type='html'>Ich habe ein Behavior für ein Image Steuerelement entwickelt, mit dem man dem aus dem Image eine Szenerie für eine Spriteanimation machen kann. Das Behavior kann in der &lt;a href="http://gallery.expression.microsoft.com/SLSABSL4?SRC=Home"&gt;Expression Gallery heruntergeladen&lt;/a&gt;&amp;nbsp;werden.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Eigenschaften&lt;/span&gt;&lt;br /&gt;Das Behavior hat 4 Eigenschaften:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUrzDeFNXzI/AAAAAAAAAJk/VFrGPXcZi7s/s1600/screenshot412x111.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUrzDeFNXzI/AAAAAAAAAJk/VFrGPXcZi7s/s1600/screenshot412x111.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;"&lt;em&gt;FramesPerSecond&lt;/em&gt;" ist eine DependencyProperty und setzt die Anzahl der Einzelbilder pro Sekunde.&lt;br /&gt;Über die Eigenschaft "&lt;em&gt;ImageFormat&lt;/em&gt;" wird das Format der Bilder gesetzt.&lt;br /&gt;"&lt;em&gt;ImagesSource&lt;/em&gt;" ist der Pfad zu dem Dateiordner, in dem die Einzelbilder abgelegt sind.&lt;br /&gt;Der Eigenschaft "&lt;em&gt;TotalImageCount&lt;/em&gt;" wird die Anzahl der Einzelbilder zugewiesen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Namenskonvention bei der Benennung der Bilddateien&lt;/span&gt;&lt;br /&gt;Die einzelnen Bilddateien müssen einer bestimmten Namenskonvention folgen. Die Bilddateien müssen nach&amp;nbsp;folgenden Muster benannt werden:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;001[.jpg/.png], 002[.jpg/.png], 003[.jpg/.png], etc. bis zu 999[.jpg/.png].&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Performance&lt;/span&gt;&lt;br /&gt;Das Behavior kann mit bis zu 999 einzelnen Bilddateien arbeiten. Dabei muss natürlich unbedingt der Performance-Aspekt beachtet werden. Je weniger Einzelbilder verwendet werden, umso besser ist die Performance. Auch die Größe der Bilddateien&amp;nbsp;beeinflußt die&amp;nbsp;Performance. Je kleiner die Dateien sind, um besser ist die Performance. Außerdem empfiehlt sich aus Gründen der Performance eher die Verwendung von JPG-Dateien als PNG-Dateien. JPG-Dateien sollten zusätzlich komprimiert werden, um die Performance zu verbessern.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Starten einer Spriteanimation&lt;/span&gt;&lt;br /&gt;Die Spriteanimation wird durch einen Klick auf das Image, dem das Behavior zugewiesen ist, gestartet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Beispielanwendung&lt;/span&gt;&lt;br /&gt;In der Expression Gallery findet Ihr ein Beispielprojekt. Schaut es Euch einfach mal an. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TUr0rGViSVI/AAAAAAAAAJo/1nDAZi0sgnk/s1600/ss550x435.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TUr0rGViSVI/AAAAAAAAAJo/1nDAZi0sgnk/s1600/ss550x435.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In der Beispielanwendung kann mit dem Slider die Eigenschaft "FramesPerSecond" zur Laufzeit geändert werden. Und zwar auch während die Spriteanimation läuft.&lt;br /&gt;&lt;br /&gt;Dies ist die erste Version und ich plane, das Behavior weiterzuentwickeln. &lt;br /&gt;&lt;br /&gt;Viel Spass damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-2268600607268027822?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/2268600607268027822/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/02/spriteanimationbehavior.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2268600607268027822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2268600607268027822'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/02/spriteanimationbehavior.html' title='SpriteAnimationBehavior'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Y29D3-feYio/TUrzDeFNXzI/AAAAAAAAAJk/VFrGPXcZi7s/s72-c/screenshot412x111.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-8782502974971367591</id><published>2011-02-01T19:05:00.001+01:00</published><updated>2011-02-01T19:05:34.311+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Path'/><category scheme='http://www.blogger.com/atom/ns#' term='InkPresenter'/><title type='text'>How To: Freihandzeichnung mit Path-Erstellung synchronisieren</title><content type='html'>Sharker Khaleed Mahmut beschreibt in einem &lt;a href="http://silverlightips.net/2010/09/25/drawing-image-inkpresenter-silverlight/"&gt;Artikel&lt;/a&gt;, wie mithilfe eines InkPresenter zur Laufzeit auf ein Image gezeichnet werden&amp;nbsp;kann. Wie das geht, könnt Ihr dort nachlesen. In diesem Artikel geht es darum, wie synchron mit einer Freihandzeichnung auf einen InkPresenter in einem Canvas-Steuerelement Path-Elemente erzeugt werden, die exakt dem entsprechen, was auf den InkPresenter gezeichnet wird. Ein &lt;a href="http://gallery.expression.microsoft.com/SLSIDWRPCSL4?SRC=Home"&gt;Beispielprojekt mit Quellcode steht zum Download in der Expression Gallery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Das ist ziemlich einfach und es funktioniert so.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Generelle Vorgehensweise&lt;/span&gt;&lt;br /&gt;In den Eregnissen MouseLeftButtonDown, MouseLeftButtonUp und MouseMove werden, dem Beispiel von Sharker Khaleed Mahmut folgend,&amp;nbsp;zunächst die Daten für das Erzeugen der Strokes auf dem InkPresnter erzeugt. Zusätzlich wird eine private Variable "pointList" erstellt, die vom Typ "List(Of StylusPointCollection)" ist. Dieser Variablen werden die gleichen Positionsdaten hinzugefügt, die in den Ereignisbehandlern MouseLeftButtonDown, MouseLeftButtonUp und MouseMove zum Erzeugen der Strokes auf dem InkPresenter verwendet werden. In "&lt;em&gt;pointList&lt;/em&gt;" wird jeweils der Rückgabewert vom Typ StylusPointCollection gesammelt. Eine StylusPointCollection hat unter anderem einen X-Koordinatenwert und einen Y-Koordinatenwert. Diese in "pointList" gesammelten Positionsdaten einzelner Punkte werden dann verwendet, um einen Pfad zu erzeugen.&lt;br /&gt;&lt;br /&gt;Und so funktioniert es Schritt für Schritt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt für Schritt&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Schritt 1 - Vorbereitungen&lt;/strong&gt;&lt;br /&gt;Es wird ein neues Silverlight 4-Projekt erzeugt. Der Oberfläche wird ein Canvas (x:Name="cvElements") mit dem "Z-Index" "0" hinzugefügt. Dann wird ein InkPresenter ("inkTest") hinzugefügt mit einem Wert für den "Z-Index" von "1". Der InkPresenter wird mit der gleichen Größe und den gleichen Margin-Werten wie das Canvas-Steuerelement erzeugt.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 2 - Positionsdaten sammeln&lt;/strong&gt;&lt;br /&gt;Es wird die private Variable "&lt;em&gt;pointList&lt;/em&gt;" erzeugt:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; pointList &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StylusPointCollection&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;In den Ereignis-Behandlern von MouseLeftButtonDown (wenn der erste Punkte gezeichnet wird), MouseMove (wenn im Rythmus der MouseEventArgs fortwährend Punkte gezeichnet werden) von MouseLeftButtonUp (wenn der letzte Punkt gezeichnet wird), werden jeweils die einzelnen Punkte der "&lt;em&gt;PointList&lt;/em&gt;" hinzugefügt.&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; inkTest_MouseLeftButtonDown(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseButtonEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; inkTest.MouseLeftButtonDown&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; inkTest.CaptureMouse()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; points &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StylusPointCollection&lt;/span&gt; = e.StylusDevice.GetStylusPoints(inkTest)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Stroke&lt;/span&gt;(points)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke.DrawingAttributes.Color = &lt;span style="color: #2b91af;"&gt;Colors&lt;/span&gt;.Blue&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke.DrawingAttributes.Width = 10&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke.DrawingAttributes.Height = 10&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; inkTest.Strokes.Add(currentStroke)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;' Grab the position to fill the List(Of StylusPointCollection)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; pointList.Add(e.StylusDevice.GetStylusPoints(inkTest))&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'-------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; inkTest_MouseMove(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; inkTest.MouseMove&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; currentStroke &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointList.Add(e.StylusDevice.GetStylusPoints(inkTest))&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentStroke.StylusPoints.Add(points)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' Grab the position to fill the List(Of StylusPointCollection)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; points &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StylusPointCollection&lt;/span&gt; = e.StylusDevice.GetStylusPoints(inkTest)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'-------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; inkTest_MouseLeftButtonUp(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseButtonEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; inkTest.MouseLeftButtonUp&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; points &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StylusPointCollection&lt;/span&gt; = e.StylusDevice.GetStylusPoints(inkTest)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Stroke&lt;/span&gt;(points)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; inkTest.ReleaseMouseCapture()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke = &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;' Grab the position to fill the List(Of StylusPointCollection)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; pointList.Add(e.StylusDevice.GetStylusPoints(inkTest))&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;' Create the path in the canvas&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; pointList.Count &amp;gt; 0 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DrawPath()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'---------------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Schritt 3 - Positionsdaten auswerten und den Pfad erzeugen&lt;/strong&gt;&lt;br /&gt;Im Ereignisbehandler des MouseLeftButtonUp events wird als letztes die Routine "DrawPath" aufgerufen. Hier ist der Quellcode dieser Routine:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; DrawPath()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; pathToDraw &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Path&lt;/span&gt; = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Path&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; pathGeometry &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PathGeometry&lt;/span&gt; = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PathGeometry&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; pathFigure &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PathFigure&lt;/span&gt; = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PathFigure&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; pathSegments &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PathSegmentCollection&lt;/span&gt; = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PathSegmentCollection&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;pathFigure&lt;/span&gt;.StartPoint = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt;(CreatePointFromStylusPointCollection(pointList.ElementAt(0)).X,&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CreatePointFromStylusPointCollection(pointList.ElementAt(0)).Y)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; member &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StylusPointCollection&lt;/span&gt; &lt;span style="color: blue;"&gt;In&lt;/span&gt; pointList&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pathSegments.Add(CreateLineSegment(CreatePointFromStylusPointCollection(member)))&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;pathFigure&lt;/span&gt;.Segments = pathSegments&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; pathGeometry.Figures.Add(pathFigure)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;With&lt;/span&gt; pathToDraw&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Data = pathGeometry&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Stroke = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SolidColorBrush&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Colors&lt;/span&gt;.Orange)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .StrokeThickness = 10&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .StrokeLineJoin = &lt;span style="color: #2b91af;"&gt;PenLineJoin&lt;/span&gt;.Round&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .StrokeStartLineCap = &lt;span style="color: #2b91af;"&gt;PenLineCap&lt;/span&gt;.Round&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .StrokeEndLineCap = &lt;span style="color: #2b91af;"&gt;PenLineCap&lt;/span&gt;.Round&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetZIndex(pathToDraw, 0)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; cvElements.Children.Add(pathToDraw)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; pointList.Clear()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Mit der Variablen "pathToDraw" wird ein neues Path-Element erzeugt. Außerdem wird die Variable "pathGeometry" vom Typ "PathGeometry" erzeugt. Diese wird später der Data-Eigenschaft des Pfads zugewiesen. Die Variable "pathFigure" vom Typ "PathFigure" wird später der "PathFigureCollection" von "pathGeometry" zugewiesen. Und der Eigenschaft "Segments" von "pathFigure" wird die "PathSegmentCollection", erzeugt in der Variablen "pathSegments", zugewiesen.&lt;br /&gt;&lt;br /&gt;Das eigentliche Arbeitstier der Routine ist der folgende Quellcode-Ausschnitt:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;pathFigure&lt;/span&gt;.StartPoint =&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt;(CreatePointFromStylusPointCollection(pointList.ElementAt(0)).X,&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; CreatePointFromStylusPointCollection(pointList.ElementAt(0)).Y)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; member &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StylusPointCollection&lt;/span&gt; &lt;span style="color: blue;"&gt;In&lt;/span&gt; pointList&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pathSegments.Add(CreateLineSegment(CreatePointFromStylusPointCollection(member)))&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Es wird zunächst der Startpunkt des Pfads ermittelt und zugewiesen. Dazu wird die Funktion "CreatePointFromStylusPointCollection" verwendet. Der Quellcode dieser Funktion sieht so aus:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; CreatePointFromStylusPointCollection(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StylusPointCollection&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt; {.X = value.Item(0).X, .Y = value.Item(0).Y}&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Die Funktion erhält als Parameter eine "StylusPointCollection" und gibt einen "Point" zurück. Um den Startpunkt des Pfads zu ermitteln, wird das erste Item aus der "List(Of SytlusPointCollection)", also von "pointList" genommen, und mit dem X-Wert sowie dem Y-Wert dieses Items der Rückgabewert der Funktion erzeugt.&lt;br /&gt;&lt;br /&gt;In der "For Each"-Schleife wird dann mithilfe der Funktionen "CreateLineSegment"&amp;nbsp;und "CreatePointFromStylusPointCollection" die einzelnen "LineSegments" erzeugt und der "PathSegmentsCollection" "pathSegments" hinzugefügt. Die Funktion "CreateLineSegment" sieht so aus:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; CreateLineSegment(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LineSegment&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LineSegment&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt; {.Point = value}&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Um ein LineSegment zu definieren, benötigt man nur einen Punkt.&amp;nbsp;Der eigentliche Pfad, der erzeugt wird, bewegt sich vom Startpunkt zum nächsten Punkt und von dort aus zum nächsten Punkt, usw. Jeder Punkt eines LineSegment steht für einen Punkt des Pfades. Das letzte LineSegment stellt den Endpunkt des Pfades dar. Und so hangelt sich die "For Each"-Schleife durch die "pointList" und erzeugt, nachdem der Startpunkt gesetzt wurde, die einzelnen Punkte (LineSegment.Point), die den endgültigen Pfad definieren.&lt;br /&gt;&lt;br /&gt;Um die perfekte visuelle Übereinstimmung mit den Strokes, die auf den InkPresenter gezeichnet werden, zu bewirken, ist die der folgende Quellcode-Ausschnitt wichtig:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;With&lt;/span&gt; pathToDraw&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Data = pathGeometry&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Stroke = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SolidColorBrush&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Colors&lt;/span&gt;.Orange)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'!!!!!!!!!!!!!!!!!!!!!&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .StrokeThickness = 10&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .StrokeLineJoin = &lt;span style="color: #2b91af;"&gt;PenLineJoin&lt;/span&gt;.Round&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .StrokeStartLineCap = &lt;span style="color: #2b91af;"&gt;PenLineCap&lt;/span&gt;.Round&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .StrokeEndLineCap = &lt;span style="color: #2b91af;"&gt;PenLineCap&lt;/span&gt;.Round&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'!!!!!!!!!!!!!!!!!!!!!&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Im obigen Quellcode-Ausschnitt werden alle Ecken sowie der Startpunkt und der Endpunkt des Pfads abgerundet. Das ist wichtig, weil auch die Strokes rund sind. Außerdem wird die "StrokeThickness" des Pfads auf den Wert "10" gesetzt. Das entspricht der Höhe und der Breite der Strokes:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; inkTest_MouseLeftButtonDown(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseButtonEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; inkTest.MouseLeftButtonDown&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; inkTest.CaptureMouse()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; points &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StylusPointCollection&lt;/span&gt; = e.StylusDevice.GetStylusPoints(inkTest)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke = &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Stroke&lt;/span&gt;(points)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke.DrawingAttributes.Color = &lt;span style="color: #2b91af;"&gt;Colors&lt;/span&gt;.Blue&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke.DrawingAttributes.Width = 10&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; currentStroke.DrawingAttributes.Height = 10&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; inkTest.Strokes.Add(currentStroke)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;' Grab the position for the List(Of StylusPointCollection)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; pointList.Add(e.StylusDevice.GetStylusPoints(inkTest))&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;'---------------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Abschließend wird der erzeugte Pfad dem Canvas hinzugefügt und mit pointList.Clear() die "pointList" geleert. Das ist wichtig, weil bei der nächsten Pfad-Zeichnung andernfalls auch die alten Werte noch verarbeitet werden würden.&lt;br /&gt;&lt;br /&gt;Das war's!&lt;br /&gt;&lt;br /&gt;Das Beispielprojekt, das &lt;strong&gt;&lt;a href="http://gallery.expression.microsoft.com/SLSIDWRPCSL4?SRC=Home"&gt;hier&lt;/a&gt;&lt;/strong&gt; heruntergeladen werden kann, enthält noch deutlich mehr Quellcode. Der dient aber nur dazu, die Anwendung einigermaßen ansehnlich zu gestalten. Die grundlegende Technik hat dieser Artikel aufgezeigt.&lt;br /&gt;&lt;br /&gt;Viel Spass damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-8782502974971367591?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/8782502974971367591/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/02/how-to-freihandzeichnung-mit-path.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8782502974971367591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8782502974971367591'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/02/how-to-freihandzeichnung-mit-path.html' title='How To: Freihandzeichnung mit Path-Erstellung synchronisieren'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-5938609287805810873</id><published>2011-02-01T11:54:00.008+01:00</published><updated>2011-02-02T14:00:24.764+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Storyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='Completed'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><category scheme='http://www.blogger.com/atom/ns#' term='Behavior'/><title type='text'>How To: Storyboard Completed Behaviors verwenden</title><content type='html'>Kürzlich gab es eine sehr interessante &lt;a href="http://social.expression.microsoft.com/Forums/en-US/blend/thread/d92be0ad-02fe-426c-88e4-b1e4f1585169"&gt;Diskussion zu einer Frage&lt;/a&gt;, die&amp;nbsp;im &lt;a href="http://social.expression.microsoft.com/Forums/en-US/blend/threads"&gt;Expression Blend + SketchFlow Forum&lt;/a&gt; gestellt wurde. Die Frage war von jemandem gestellt worden, der "&lt;a href="http://expression.microsoft.com/en-us/cc136530.aspx"&gt;Expression Blend 4&lt;/a&gt;" als Designer nutzt. Die Frage war, wie man ein anderes Storyboard beginnen kann, unmittelbar nachdem ein Übergang in einen visuellen Zustand beendet ist oder nachdem ein Storyboard beendet ist. &lt;br /&gt;&lt;br /&gt;Aus der Sicht eines Entwicklers ist diese Frage einfach zu beantworten. Für einen Designer, der nicht oder wenig programmieren kann, kann diese Anforderung problematisch sein. Die Diskussion erinnerte mich daran, dass Behavior eigentlich als ein Werkzeug für Designer gedacht sind. &lt;br /&gt;&lt;br /&gt;Also machte ich mich daran, ein Behavior zu schreiben, dass diese einfachen Aufgaben erledigt. Das Ergebnis sind die &lt;a href="http://gallery.expression.microsoft.com/SLSBCBSL4?SRC=Home"&gt;StoryboardCompletedBehaviors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Im Folgenden beschreibe ich, wie man diese Behaviors verwendet. &lt;br /&gt;&lt;br /&gt;Der Artikel ist ganz bewußt sehr ausführlich und mit kleinen&amp;nbsp;Schritten gestaltet. Fortgeschrittene Nutzer von Expression Blend können sich darauf beschränken, die "Übersicht (Overview)" und&amp;nbsp;"Schritt 3" zu lesen.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Übersicht&lt;/span&gt;&lt;br /&gt;Der &lt;a href="http://gallery.expression.microsoft.com/SLSBCBSL4?SRC=Home"&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/a&gt;, den Ihr in der &lt;a href="http://gallery.expression.microsoft.com/"&gt;Expression Gallery&lt;/a&gt; findet,&amp;nbsp;enthält ein Beispiel-Projekt mit der Datei "&lt;em&gt;SilverLawCompletedBehaviors.dll&lt;/em&gt;". Diese Bibliothek stellt eine Action und&amp;nbsp;drei Trigger zur Verfügung. Das ist die "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;" und&amp;nbsp;der "&lt;em&gt;StoryboardCompletedTrigger&lt;/em&gt;", der "&lt;em&gt;&lt;strong&gt;State&lt;/strong&gt;StoryboardCompletedTrigger&lt;/em&gt;" sowie der "&lt;em&gt;GoToStateOnStoryboardCompletedTrigger&lt;/em&gt;". Alle drei Trigger können der Action als Trigger zugewiesen werden. &lt;br /&gt;&lt;br /&gt;Der "&lt;em&gt;StoryboardCompletedTrigger&lt;/em&gt;" erledigt die Aufgabe, nach einem Storyboard ein anderes Storyboard zu starten.&lt;br /&gt;&lt;br /&gt;Der "&lt;em&gt;StateStoryboardCompletedTrigger&lt;/em&gt;" erledigt die Aufgabe, nach einem Storyboard, das zu einem bestimmten visuellen Zustand gehört, ein anderes Storyboard zu starten. &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="color: red;"&gt;Update:&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;Der "&lt;em&gt;GoToStateOnStoryboardCompletedTrigger&lt;/em&gt;" hat die Aufgabe, in einen bestimmten visuellen Zustand zu wechseln, nachdem ein bestimmtes Storyboard beendet ist.&lt;br /&gt;&lt;br /&gt;Zum "&lt;em&gt;StateStoryboardCompletedTrigger&lt;/em&gt;"&amp;nbsp;kurz eine Erklärung (für Designer): Ein visueller Zustand kann ein Storyboard enthalten. Dieses Storyboard in einem visuellen Zustand ist dann dafür verantwortlich den Wechsel von einem visuellen Zustand zu diesem visuellen Zustand, in dem das Storyboard enthalten ist,&amp;nbsp;mit einer Animation ablaufen zu lassen. Wenn also zum Beispiel für den&amp;nbsp;visuellen Zustand "VS_2" ein Storyboard definiert ist, dann läuft dieses Storyboard ab, wenn von einem anderen visuellen Zustand, also zum Beispiel "VS_1" zum visuellen Zustand "VS_1" gewechselt wird. &lt;br /&gt;&lt;br /&gt;Jeder dieser drei Trigger kann der "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;" als Trigger hinzugefügt werden. Nachfolgend beschreibe ich, wie das geht.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schrit für Schritt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 1 - Verweisen auf die SilverLawCompletedBehaviors.dll&lt;/strong&gt;&lt;br /&gt;In einem neuen Silverlight 4 Projekt wird in der Registerkarte "Projekte" im Projektexplorer mit einem Rechtsklick auf "&lt;em&gt;Verweise&lt;/em&gt;" -&amp;gt; "&lt;em&gt;Verweis hinzufügen ...&lt;/em&gt;" zum Speicherplatz der Datei "&lt;em&gt;SilverLawCompletedBehaviors.dll&lt;/em&gt;" navigiert, diese wird selektiert und mit "&lt;em&gt;Öffnen&lt;/em&gt;" zu den Verweisen hinzugefügt.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfg32_vxuI/AAAAAAAAAHY/e_dxDO0m-hw/s1600/ss1_381x180.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfg32_vxuI/AAAAAAAAAHY/e_dxDO0m-hw/s1600/ss1_381x180.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TUfhCi9W1PI/AAAAAAAAAHc/jCqxYd3d9m0/s1600/ss2_402x336.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TUfhCi9W1PI/AAAAAAAAAHc/jCqxYd3d9m0/s1600/ss2_402x336.png" /&gt;&lt;/a&gt;&lt;/div&gt;Hiernach erscheint in der Registerkarte "&lt;em&gt;Objekte&lt;/em&gt;" unter "&lt;em&gt;Verhalten&lt;/em&gt;" die "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfhGQDwEjI/AAAAAAAAAHg/vZs_UIfY6fs/s1600/ss3_402x440.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfhGQDwEjI/AAAAAAAAAHg/vZs_UIfY6fs/s1600/ss3_402x440.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Um diese Action zu vewenden, brauchen wir ein paar Storyboards und ein Element mit zwei visuellen Zuständen.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 2 - Erstellen der Storyboards und der visuellen Zustände&lt;/strong&gt;&lt;br /&gt;Auf die Oberfläche wird ein neues Ellipse-Steuerelement gezeichnet:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TUfhJ4PN81I/AAAAAAAAAHk/fb-RwOQhpFs/s1600/ss4_321x304.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TUfhJ4PN81I/AAAAAAAAAHk/fb-RwOQhpFs/s1600/ss4_321x304.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Mit "&lt;em&gt;F6&lt;/em&gt;" wird in den Animationsarbeitsbereich gewechselt, damit wir zwei Storyboards erstellen können. In der Registerkarte "Objekte und Zeitachsen" wird auf das Plus-Zeichen geklickt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TUfhNrXlAOI/AAAAAAAAAHo/vFWbyKb72CA/s1600/ss5_321x304.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TUfhNrXlAOI/AAAAAAAAAHo/vFWbyKb72CA/s1600/ss5_321x304.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In dem Dialg, der erscheint, erhält das neue Storyboard den Namen "sbMoveRight". Klick "&lt;em&gt;Ok&lt;/em&gt;".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfhRCHsBsI/AAAAAAAAAHs/Cd7rA15tfa0/s1600/ss6_435x304.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfhRCHsBsI/AAAAAAAAAHs/Cd7rA15tfa0/s1600/ss6_435x304.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dann&amp;nbsp;werden zwei KeyFrames hinzugefügt. Einer bei Position 0:00,000 ein weiterer bei Position 0:01,000.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfhUuEWPGI/AAAAAAAAAHw/HAk1zr8FHcU/s1600/ss7_435x304.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfhUuEWPGI/AAAAAAAAAHw/HAk1zr8FHcU/s1600/ss7_435x304.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bei der Position des zweiten KeyFrame soll das Ellipse-Steuerelement nach rechts verschoben sein. Dazu wird das Ellipse-Steuerelement selektiert, und in den Eigenschaften unter "&lt;em&gt;Transformation&lt;/em&gt;" eine "&lt;em&gt;Translation&lt;/em&gt;" von 200 auf der X-Achse erzeugt:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfhYbtff2I/AAAAAAAAAH0/HIGPyY6oQvE/s1600/ss8_505x304.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfhYbtff2I/AAAAAAAAAH0/HIGPyY6oQvE/s1600/ss8_505x304.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dann wird ein zweites Storyboard erstellt, das das Ellipse-Steuerelement wieder von Rechts nach Links zurückbewegt. Dieses Storyboard erhält den Namen "&lt;em&gt;sbMoveLeft&lt;/em&gt;". Dazu wird das erste Steuerelement kopiert ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfhcRYpUsI/AAAAAAAAAH4/M2WO3UwgHVk/s1600/ss9_428x253.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfhcRYpUsI/AAAAAAAAAH4/M2WO3UwgHVk/s1600/ss9_428x253.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;umgekehrt ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfhf86n2bI/AAAAAAAAAH8/MRhQE5g3Ilk/s1600/ss10_428x253.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfhf86n2bI/AAAAAAAAAH8/MRhQE5g3Ilk/s1600/ss10_428x253.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;und umbenannt ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfhjP1bpkI/AAAAAAAAAIA/9eeMFXFpehg/s1600/ss11_428x253.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfhjP1bpkI/AAAAAAAAAIA/9eeMFXFpehg/s1600/ss11_428x253.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfhmPmT1qI/AAAAAAAAAIE/4O87Fv32naI/s1600/ss12_428x253.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfhmPmT1qI/AAAAAAAAAIE/4O87Fv32naI/s1600/ss12_428x253.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Als nächstes erzeugen wir für das Ellipse-Steuerelement noch zwei visuelle Zustände. Dazu wird das Storyboard "&lt;em&gt;sbMoveLeft&lt;/em&gt;" geschlossen, mit "&lt;em&gt;F6&lt;/em&gt;" wieder in den Design-Arbeitsbereich gewechselt und die Registerkarte "&lt;em&gt;Zustände&lt;/em&gt;" selektiert. Die folgenden Schritte zeigen den Ablauf.&lt;br /&gt;&lt;br /&gt;Es wird eine neue StatusGruppe hinzugefügt ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TUfhqhVjtLI/AAAAAAAAAII/iyl0NhCatVc/s1600/ss13_428x166.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TUfhqhVjtLI/AAAAAAAAAII/iyl0NhCatVc/s1600/ss13_428x166.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfh1uB0UOI/AAAAAAAAAIM/bFZh5kMUsP0/s1600/ss14_428x166.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfh1uB0UOI/AAAAAAAAAIM/bFZh5kMUsP0/s1600/ss14_428x166.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;und mit "&lt;em&gt;E1_States&lt;/em&gt;" benannt ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfh6yAjdbI/AAAAAAAAAIQ/tx2GP8bASRI/s1600/ss15_428x166.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfh6yAjdbI/AAAAAAAAAIQ/tx2GP8bASRI/s1600/ss15_428x166.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dann wird ein neuer visueller Status hinzugefügt ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TUfh-oZcXFI/AAAAAAAAAIU/ekvSTiUEMAU/s1600/ss16_479x166.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TUfh-oZcXFI/AAAAAAAAAIU/ekvSTiUEMAU/s1600/ss16_479x166.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dieser Zustand erhält den Namen "&lt;em&gt;normal&lt;/em&gt;".&lt;br /&gt;&lt;br /&gt;Ein weiterer Zustand wird hinzugefügt. Dieser erhält den Namen "&lt;em&gt;pulse&lt;/em&gt;".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TUfiCkqrivI/AAAAAAAAAIY/piE9L62CtlI/s1600/ss17_479x166.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TUfiCkqrivI/AAAAAAAAAIY/piE9L62CtlI/s1600/ss17_479x166.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dann wird das Ellipse-Steuerelement selektiert.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TUfiHslcF8I/AAAAAAAAAIc/pBXLmXIg9BU/s1600/ss18_479x166.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TUfiHslcF8I/AAAAAAAAAIc/pBXLmXIg9BU/s1600/ss18_479x166.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In diesem visuellen Zustand soll das Ellipse-Steuerelement pulsieren. Das wird mit Hilfe eines Storyboard erledigt, das wir für diesen visuellen Zustand erzeugen. Dazu wird als erstes durch einen Klick auf diese Schaltfläche ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfiL3I0TPI/AAAAAAAAAIg/tTAGwO3-8n4/s1600/ss19_500x204.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfiL3I0TPI/AAAAAAAAAIg/tTAGwO3-8n4/s1600/ss19_500x204.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;... die Zeitachse angezeigt:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfiPtbHqAI/AAAAAAAAAIk/McjMg5BnfCI/s1600/ss20_500x267.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfiPtbHqAI/AAAAAAAAAIk/McjMg5BnfCI/s1600/ss20_500x267.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Es werden drei KeyFrames hinzugefügt ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfiXzva3pI/AAAAAAAAAIo/I6BKZGYFepo/s1600/ss21_500x267.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfiXzva3pI/AAAAAAAAAIo/I6BKZGYFepo/s1600/ss21_500x267.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bei der Position des ersten KeyFrame wird keine Eigenschaft verändert. Bei der Position des zweiten KeyFrame ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TUfib9IMs5I/AAAAAAAAAIs/4NDMhhF2KPc/s1600/ss22_500x267.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TUfib9IMs5I/AAAAAAAAAIs/4NDMhhF2KPc/s1600/ss22_500x267.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;... werden die Farbe des Stroke und die Farbe des Fill von dem Ellipse-Steuerelement ausgetauscht ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfikyY5GdI/AAAAAAAAAIw/ZQ3JTtUjM5I/s1600/ss23_500x267.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfikyY5GdI/AAAAAAAAAIw/ZQ3JTtUjM5I/s1600/ss23_500x267.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfipKWmyvI/AAAAAAAAAI0/Q87ZRm67eKM/s1600/ss24_500x267.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfipKWmyvI/AAAAAAAAAI0/Q87ZRm67eKM/s1600/ss24_500x267.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Und bei der Position des dritten KeyFrame behalten Stroke und Fill ihre ursprünglichen Farben (es wird also nichts verändert) ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TUfi2nVFITI/AAAAAAAAAI4/MRGAASTuj6o/s1600/ss23_500x267.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TUfi2nVFITI/AAAAAAAAAI4/MRGAASTuj6o/s1600/ss23_500x267.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Jetzt sind&amp;nbsp;alle Vorbereitungen getroffen, um mit der Hilfe von Behavior folgendes zu erreichen: Bei einem Klick mit der Maus auf die Ellipse soll es in den visuellen Zustand "&lt;em&gt;pulse&lt;/em&gt;" wechseln. Sobald der Übergang in diesen visuellen Zustand abgeschlossen ist, soll das Storyboard "&lt;em&gt;sbMoveRight&lt;/em&gt;" beginnen. Und sobald das Storyboard "&lt;em&gt;sbMoveRight&lt;/em&gt;" beendet ist, soll das Storyboard "&lt;em&gt;sbMoveLeft&lt;/em&gt;" begínnen.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 3 - Hinzufügen und Einstellen der Behavior&lt;/strong&gt;&lt;br /&gt;Um den Übergang in den visuellen Zustand "&lt;em&gt;pulse&lt;/em&gt;" bei einem Klick auf das Ellipse-Steuerelement zu bewirken, wird dem Ellipse-Steuerelement per Drag &amp;amp; Drop eine "&lt;em&gt;GoToStateAction&lt;/em&gt;" hinzugefügt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfi6DrDebI/AAAAAAAAAI8/BFGklaoJYVo/s1600/ss25_500x267.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfi6DrDebI/AAAAAAAAAI8/BFGklaoJYVo/s1600/ss25_500x267.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die "&lt;em&gt;GoToStateAction&lt;/em&gt;" wird selektiert und in den Eigenschaft wird als "&lt;em&gt;StateName&lt;/em&gt;" der "&lt;em&gt;pulse&lt;/em&gt;" Zustand ausgewählt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfi9sF95eI/AAAAAAAAAJA/LN9yOnBLOlI/s1600/ss26_500x463.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfi9sF95eI/AAAAAAAAAJA/LN9yOnBLOlI/s1600/ss26_500x463.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Als nächstes werden nacheinander zwei "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;" per Drag &amp;amp; Drop &lt;strong&gt;auf das UserControl&lt;/strong&gt; gezogen. Wir beginnen mit der ersten "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfjA211E3I/AAAAAAAAAJE/UOZXHs5kLFU/s1600/ss27_416x595.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfjA211E3I/AAAAAAAAAJE/UOZXHs5kLFU/s1600/ss27_416x595.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Diese "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;" übernimmt die Aufgabe, das Storyboard "&lt;em&gt;sbMoveRight&lt;/em&gt;" zu starten, sobald der Übergang zum visuellen Zustand "&lt;em&gt;pulse&lt;/em&gt;" beendet ist. Um das zu erreichen, muss dieser Action in den Eigenschaften ein "&lt;em&gt;&lt;strong&gt;State&lt;/strong&gt;StoryboardCompletedTrigger&lt;/em&gt;" hinzugefügt werden.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TUfjEXcBRWI/AAAAAAAAAJI/XOJ29WsETj8/s1600/ss28_484x297.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TUfjEXcBRWI/AAAAAAAAAJI/XOJ29WsETj8/s1600/ss28_484x297.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUfjH2fx2ZI/AAAAAAAAAJM/e-N4bwEcqbY/s1600/ss29_404x604.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUfjH2fx2ZI/AAAAAAAAAJM/e-N4bwEcqbY/s1600/ss29_404x604.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die Eigenschaften der "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;" sehen danach so aus:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TUfjLAvjhwI/AAAAAAAAAJQ/aBQ8x7AEEPs/s1600/ss30_486x275.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TUfjLAvjhwI/AAAAAAAAAJQ/aBQ8x7AEEPs/s1600/ss30_486x275.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Der Eigenschaft "&lt;em&gt;FirstState&lt;/em&gt;" wird der Name des visuellen Zustand zugewiesen, an dessen Übergangsende&amp;nbsp;ein anderes&amp;nbsp;Storyboard gestartet werden soll. Das Storyboard, das gestartet werden soll, wird der Eigenschaft "&lt;em&gt;NextStoryboard&lt;/em&gt;" zugewiesen ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TUfjOfrSWhI/AAAAAAAAAJU/Giq6ZJCPYOc/s1600/ss31_486x275.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TUfjOfrSWhI/AAAAAAAAAJU/Giq6ZJCPYOc/s1600/ss31_486x275.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dann wird dem UserControl per Drag &amp;amp; Drop eine weitere "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;" hinzugefügt. Diese Action übernimmt die Aufgabe, nach dem Ende des Storyboard "&lt;em&gt;sbMoveRight&lt;/em&gt;" das Storyboard "&lt;em&gt;sbMoveLeft&lt;/em&gt;" zu starten. Um das zu erreichen, wird dieser "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;" ein "&lt;em&gt;StoryboardCompletedTrigger&lt;/em&gt;" hinzugefügt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TUfjRgM7ghI/AAAAAAAAAJY/UH2sMjEI0PU/s1600/ss32_402x603.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TUfjRgM7ghI/AAAAAAAAAJY/UH2sMjEI0PU/s1600/ss32_402x603.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Wichtiger Hinweis&lt;/u&gt;&lt;/strong&gt;: Es gibt einen anderen "&lt;em&gt;StoryboardCompletedTrigger&lt;/em&gt;", der aber aus dem Namespace "Microsoft.Expression.Interactivity.Media" stammt. Dieser andere "&lt;em&gt;StoryboardCompletedTrigger&lt;/em&gt;" funktioniert &lt;strong&gt;nicht&lt;/strong&gt; mit der von mir entworfenen "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;". Deswegen muss darauf geachtet werden, dass der "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;" unbedingt der "&lt;em&gt;StoryboardCompletedTrigger&lt;/em&gt;" aus dem Namespace "&lt;strong&gt;SilverLaw&lt;/strong&gt;" zugewiesen wird.&lt;br /&gt;&lt;br /&gt;Jetzt müssen die Eigenschaften für die zweite "&lt;em&gt;StoryboardCompletedAction&lt;/em&gt;"&amp;nbsp;eingestellt werden. In der Auswahl&amp;nbsp;für die Eigenschaft "&lt;em&gt;FirstStoryboard&lt;/em&gt;" wird das Storyboard ausgewählt, nach dessen Ende ein anderes Storyboard gestartet werden soll. In der Auswahl der Eigenschaft "&lt;em&gt;NextStoryboard&lt;/em&gt;" wird das Storyboard ausgewählt, das nach dem ersten Storyboard gestartet werden soll. Im Ergebnis sieht das dann so aus:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TUfjVqYRcRI/AAAAAAAAAJc/dMtDQGFrSS0/s1600/ss33_484x268.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TUfjVqYRcRI/AAAAAAAAAJc/dMtDQGFrSS0/s1600/ss33_484x268.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das war's! &lt;br /&gt;&lt;br /&gt;"&lt;em&gt;F5&lt;/em&gt;" drücken, um das Projekt auszuführen. Ein Klick auf das Ellipse-Steuerelement startet als erstes den Übergang zum visuellen Zustand "&lt;em&gt;pulse&lt;/em&gt;". Nachdem dieser Übergang abgeschlossen ist, startet das Storyboard "&lt;em&gt;sbMoveRight&lt;/em&gt;". Und nachdem "&lt;em&gt;sbMoveRight&lt;/em&gt;" abgeschlossen ist, startet das Storyboard "&lt;em&gt;sbMoveLeft&lt;/em&gt;".&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;Es gibt noch einen &lt;strong&gt;Hinweis&lt;/strong&gt; auf eine derzeit noch bestehende &lt;strong&gt;Beschränkung&lt;/strong&gt;. Der Name für LayoutRoot muss "LayoutRoot" bleiben. Andernfalls wirft das Behavior einen Fehler.&lt;/strike&gt; &lt;span style="color: red;"&gt;&lt;u&gt;Update&lt;/u&gt;&lt;/span&gt;: Die Beschränkung aus der ersten Version (1.0.0.0) ist beseitigt. Das LayoutRoot-Element kann jetzt (in der Version 1.1.0.0) nach Belieben umbenannt werden.&amp;nbsp;Unverändert kann der Steuerelement-Typ von LayoutRoot&amp;nbsp;beliebig geändert werden. LayoutRoot kann also ein Grid, ein Canvas, ein Border, eine ViewBox, ein StackPanel&amp;nbsp;oder ein ScrollViewer sein.&lt;br /&gt;&lt;br /&gt;Viel Spass mit den "StoryboardCompletedBehaviors".&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;a href="http://gallery.expression.microsoft.com/SLSBCBSL4?SRC=Home"&gt;Beispiel-Projekt mit den "StoryboardCompletedBehaviors"&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-5938609287805810873?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/5938609287805810873/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/02/how-to-storyboard-completed-behaviors.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5938609287805810873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5938609287805810873'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/02/how-to-storyboard-completed-behaviors.html' title='How To: Storyboard Completed Behaviors verwenden'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Y29D3-feYio/TUfg32_vxuI/AAAAAAAAAHY/e_dxDO0m-hw/s72-c/ss1_381x180.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6931863975700853067</id><published>2011-01-31T19:56:00.002+01:00</published><updated>2011-02-01T19:08:25.395+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Path'/><category scheme='http://www.blogger.com/atom/ns#' term='InkPresenter'/><title type='text'>Synchronisieren einer Freihandzeichnung mit einer realen Path-Erstellung</title><content type='html'>In der Expression Gallery findet Ihr eine &lt;a href="http://gallery.expression.microsoft.com/SLSIDWRPCSL4?SRC=Home"&gt;neue Beispielanwendung&lt;/a&gt;. Das Beispiel demonstriert, wie man eine Freihandzeichnung, die zur Laufzeit mit der Maus in einem InkPresenter erzeugt wird, mit dem Erstellen von realen Pfad-Elementen in einem Canvas synchronisieren kann. In einem Canvas werden also WYSIWYG Path-Elemente erzeugt, die dem entsprechen, was auf einen InkPresenter gezeichnet wird.&lt;br /&gt;&lt;br /&gt;Hier sind ein paar Screenshot:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUcDUdFIVmI/AAAAAAAAAHM/bdURsUnPHZQ/s1600/ss0_538x595.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUcDUdFIVmI/AAAAAAAAAHM/bdURsUnPHZQ/s1600/ss0_538x595.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Bild 1: Die leere Zeichenfläche&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TUcDh1ncvCI/AAAAAAAAAHQ/GwBVggNpTBw/s1600/ss1_538x595.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TUcDh1ncvCI/AAAAAAAAAHQ/GwBVggNpTBw/s1600/ss1_538x595.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Bild 2: Eine Freihandzeichnung auf den InkPresenter&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TUcDtBo7xdI/AAAAAAAAAHU/rhKD5fWpTdc/s1600/ss2_538x595.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TUcDtBo7xdI/AAAAAAAAAHU/rhKD5fWpTdc/s1600/ss2_538x595.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Bild 3: Die entsprechenden Path-Elemente in einem Canvas&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Der &lt;a href="http://gallery.expression.microsoft.com/SLSIDWRPCSL4?SRC=Home"&gt;Download&lt;/a&gt; beinhaltet den vollständigen Quellcode. &lt;br /&gt;&lt;br /&gt;Einen&amp;nbsp;Artikel, der Schritt für Schritt beschreibt, wie das&amp;nbsp;funktioniert, findet Ihr &lt;a href="http://silverlawone.blogspot.com/2011/02/how-to-freihandzeichnung-mit-path.html"&gt;hier in meinem Blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Viel Spass für's erste mit dem Beispiel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6931863975700853067?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6931863975700853067/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/01/synchronisieren-einer-freihandzeichnung.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6931863975700853067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6931863975700853067'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/01/synchronisieren-einer-freihandzeichnung.html' title='Synchronisieren einer Freihandzeichnung mit einer realen Path-Erstellung'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Y29D3-feYio/TUcDUdFIVmI/AAAAAAAAAHM/bdURsUnPHZQ/s72-c/ss0_538x595.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6153909859830520890</id><published>2011-01-25T21:05:00.000+01:00</published><updated>2011-01-25T21:05:47.758+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Clipping Path'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Image'/><category scheme='http://www.blogger.com/atom/ns#' term='Effects'/><title type='text'>Ein Bildbetrachter mit Lupe</title><content type='html'>&lt;a href="http://gallery.expression.microsoft.com/SLAIVWMFGSL4?SRC=Home"&gt;In der Expression Gallery&lt;/a&gt; findet Ihr ein neues Beispielprojekt. Es ist ein &lt;a href="http://gallery.expression.microsoft.com/SLAIVWMFGSL4?SRC=Home"&gt;&lt;strong&gt;Bildbetrachter mit Lupe&lt;/strong&gt;&lt;/a&gt;. Einige coole features sind dabei. Schaut es Euch einfach an und spielt damit. Der Quellcode ist wie immer dabei. &lt;br /&gt;&lt;br /&gt;Hier sind ein paar Screenshots:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TT8r5lkWXpI/AAAAAAAAAHA/2hq9wVP6ze8/s1600/ss_1_500x327.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TT8r5lkWXpI/AAAAAAAAAHA/2hq9wVP6ze8/s1600/ss_1_500x327.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TT8r_0BAk-I/AAAAAAAAAHE/hjebVoQNRhQ/s1600/ss_2_500x327.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TT8r_0BAk-I/AAAAAAAAAHE/hjebVoQNRhQ/s1600/ss_2_500x327.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TT8sGQlDBWI/AAAAAAAAAHI/gMfsIkPZgno/s1600/ss_3_500x327.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" s5="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TT8sGQlDBWI/AAAAAAAAAHI/gMfsIkPZgno/s1600/ss_3_500x327.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Viel Spass damit!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6153909859830520890?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6153909859830520890/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/01/ein-bildbetrachter-mit-lupe.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6153909859830520890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6153909859830520890'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/01/ein-bildbetrachter-mit-lupe.html' title='Ein Bildbetrachter mit Lupe'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Y29D3-feYio/TT8r5lkWXpI/AAAAAAAAAHA/2hq9wVP6ze8/s72-c/ss_1_500x327.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6177422580836595971</id><published>2011-01-24T15:05:00.000+01:00</published><updated>2011-01-24T15:05:31.559+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Image'/><category scheme='http://www.blogger.com/atom/ns#' term='Effects'/><title type='text'>Echte bewegliche Lupe - Silverlight 4</title><content type='html'>Ich habe ein Beispielprojekt für eine alternative Vorgehensweise zum Erstellen einer Bilder-Lupe entwickelt. Meine Lösung implementiert einen echten MagnifyEffect, der mit einem dynamischen Beschneidungspfad kombiniert ist.&lt;br /&gt;&lt;br /&gt;Nachfolgend seht Ihr ein Beispiel, das diese Technik nutzt.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/MRMG/S1/s1.html" style="height: 600px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;In dem obigen Beispiel aktiviert ein Klick auf das Image die Lupe. Wenn die Lupe aktiviert ist, kann mit der Bewegung des Mausrads ergänzend der Zoom verändert werden. Die Lupe folgt der Bewegung des Mauszeigers. Ein erneuter Klick läßt die Lupe wieder verschwinden.&lt;br /&gt;&lt;br /&gt;Der Quellcode, der die grundlegende Technik verdeutlicht, steht zum &lt;a href="http://gallery.expression.microsoft.com/SLMRMGSL4?SRC=Home"&gt;&lt;strong&gt;Download in der Expression Gallery&lt;/strong&gt;&lt;/a&gt;. Ergänzend kann der Quellcode für das obige Beispiel &lt;a href="http://silverlawone.de/silverlawblogde/MRMG/SlideShowMagnifyCounterLab.zip"&gt;&lt;strong&gt;hier&lt;/strong&gt;&lt;/a&gt; heruntergeladen werden.&lt;br /&gt;&lt;br /&gt;Die von mir gewählte Lösung arbeitet etwas anders, als bereits &lt;a href="http://gallery.expression.microsoft.com/SlideShowMagnificati?SRC=Home"&gt;vorhandene Lösungsansätze&lt;/a&gt;. Sobald ich Zeit habe, werde ich über die von mir gewählte Lösung einen Artikel in meinem Blog veröffentlichen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6177422580836595971?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6177422580836595971/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/01/echte-bewegliche-lupe-silverlight-4.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6177422580836595971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6177422580836595971'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/01/echte-bewegliche-lupe-silverlight-4.html' title='Echte bewegliche Lupe - Silverlight 4'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-537468246021580124</id><published>2011-01-14T09:13:00.001+01:00</published><updated>2011-01-14T09:14:11.928+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Effects'/><title type='text'>How To: Sanfte Animation eines Magnify-Effekt</title><content type='html'>Kürzlich habe ich das &lt;a href="http://gallery.expression.microsoft.com/en-us/SLJFSL4?SRC=Home"&gt;Beispiel-Projekt "Just Fun"&lt;/a&gt; in der Expression Gallery veröffentlicht. Bestandteil dieses Projekts ist ein animierter Magnify-Effekt. Dieser Effekt wirkt in dem Beispiel - wie ich finde - deswegen ziemlich cool, weil das visuelle Element, auf das der Effekt angewendet wird, ein Linsenglas ist.&lt;br /&gt;&lt;br /&gt;Dieser Artikel hier beschreibt kurz, wie man einen Magnify-Effekt sanft animiert. Er ist sehr einfach nachzuvollziehen. Das Beispielprojekt kann&amp;nbsp;in der Expression Gallery&amp;nbsp;angeschaut werden. &lt;a href="http://gallery.expression.microsoft.com/en-us/SLJFSL4?SRC=Home"&gt;Dort steht auch der Quellcode&amp;nbsp;zum Download bereit&lt;/a&gt;. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Generelle Vorgehensweise&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ein Magnify-Effekt wird zu einem visuellen Element hinzugefügt. Die Eigenschaften des Magnify-Effekts werden zunächst so eingestellt, dass der Effekt visuell keine Auswirkung hat. Der Effekt soll sanft erscheinen, wenn die Maus über das Element bewegt wird und ebenso sanft verschwinden, wenn die Maus sich nicht länger über dem Element befindet. Hierfür werden zwei Storyboards erzeugt, die aktiviert werden, wenn die Ereignisse MouseEnter bzw. MouseLeave feuern. Außerdem soll der Magnify-Effekt dem Mauszeiger folgen, wenn sich die Maus über dem Element befindet. Dazu wird einfach im Ereignis MouseMove zur Laufzeit die Position des Mauszeigers abgefangen und die berechnete&amp;nbsp;Position der Center-Eigenschaft des Magnify-Effekts zugewiesen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt für Schritt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 1 - Hinzufügen des Magnify-Effekt&lt;/strong&gt;&lt;br /&gt;Das visuelle Element, auf das der Effekt angewendet werden soll, befindet sich im Objektbaum innerhalb eines Grid-Steuerelements. Ich benutze Expression Blend 4. Aus der Registerkarte "Objekte" wird aus "Effekte" der Magnify-Effekt selektiert und per Drag&amp;amp;Drop auf dieses Grid-Steuerelement gezogen. Das bewirkt, dass sich der Effekt visuell nicht nur auf das Grid-Steuerelement, sondern auf alle Kind-Elemente auswirkt, die sich in diesem Grid befinden.&lt;br /&gt;&lt;br /&gt;Da später zur Laufzeit&amp;nbsp;die Eigenschaften des Effekts manipuliert werden sollen, muss der Effekt einen Namen erhalten. Im Beispiel ist dies der Name "&lt;em&gt;myMag&lt;/em&gt;".&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 2 - Anfängliche Einstellung der Eigenschaften des Effekts&lt;/strong&gt;&lt;br /&gt;Die Eigenschaften des Magnify-Effekt werden wie folgt eingestellt:&lt;br /&gt;&lt;br /&gt;Amount: "25%"&lt;br /&gt;Center: "0,5" und "0,5"&lt;br /&gt;InnerRadius: "0"&lt;br /&gt;OuterRadius: "0"&lt;br /&gt;&lt;br /&gt;Die Wertzuweisungen von jeweils "0" für die Eigenschaften InnerRadius und OuterRadius bewirken, dass sich der Effekt zunächst visuell nicht auswirkt.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 3 - Erstellen der Storyboards für das MouseEnter-Ereignis und für das MouseLeave-Ereignis&lt;/strong&gt;&lt;br /&gt;Es werden zwei Storyboards erstellt. Das Storyboard "&lt;em&gt;sbMakeMag&lt;/em&gt;" läßt den Magnify-Effekt beim Eintreten des Mauszeigers in das Element langsam erscheinen. Das Storyboard "&lt;em&gt;sbReleaseMag&lt;/em&gt;" läßt den Magnify-Effekt beim Austreten der Maus aus dem Element langsam wieder verschwinden.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;sbMakeMag&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;In Expression Blend 4 wird mit F6 in den Arbeitsbereich "Animation" gewechselt. In der Registerkarte "Objekte und Zeitachsen" wird der Magnify-Effekt selektiert. Dann wird bei der Timeline-Position "0:00,000" ein neuer Keyframe hinzugefügt. Bei der Timeline-Position&amp;nbsp; 0:00,400 wird ein zweiter Keyframe hinzugefügt. Für diesen Keyframe werden die Eigenschaften des Magnify-Effekts wie folgt eingestellt:&lt;br /&gt;&lt;br /&gt;Amount: "25%"&lt;br /&gt;&lt;br /&gt;Center: "0,5" und "0,5"&lt;br /&gt;&lt;strong&gt;InnerRadius: "0,25"&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;OuterRadius: "0,41"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Damit der Lupeneffekt mit einer realistischen Bewegung eintritt, wird dem zweiten Keyframe eine EasingFunction hinzugefügt. Dazu wird der Keyframe mit einem einfachen Mausklick selektiert und in der Registerkarte "Eigenschaften" eine "SineOut"-EasingFunction ausgewählt.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;sbReleaseMag&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Das zweite Storyboard wird erstellt, indem einfach das erste Storyboard dupliziert und umgekehrt wird. Das Umbenennen&amp;nbsp;nicht vergessen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TTAD1SrYEsI/AAAAAAAAAG4/lBxwMrXLRKw/s1600/ss1_387x175.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" n4="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TTAD1SrYEsI/AAAAAAAAAG4/lBxwMrXLRKw/s1600/ss1_387x175.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TTAD4-E6vfI/AAAAAAAAAG8/noNeWQod9Gg/s1600/ss2_387x175.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" n4="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TTAD4-E6vfI/AAAAAAAAAG8/noNeWQod9Gg/s1600/ss2_387x175.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Schritt&amp;nbsp;4 - Aktivieren der Storyboards bei MouseEnter bzw. MouseLeave&lt;/strong&gt;&lt;br /&gt;Das Storyboard sbMakeMag wird&amp;nbsp;im&amp;nbsp;MouseEnter-Ereignisbehandler gestartet und das Storyboard&amp;nbsp;sbReleaseMag wird im MouseLeave-Ereignisbehandler gestartet:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Overlay_MouseEnter(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; Overlay.MouseEnter&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; IsMagActive = &lt;span style="color: blue;"&gt;True&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; sbMakeMag.Begin()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Overlay_MouseLeave(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; Overlay.MouseLeave&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; IsMagActive = &lt;span style="color: blue;"&gt;True&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; sbReleaseMag.Begin()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Im konkreten Beispiel habe ich dem sichtbaren Bereich ein Ellipse-Steuerelement als Overlay hinzugefügt, um den Quellcode verständlicher zu gestalten. Dieses Overlay-Element ist entsprechend benannt.&lt;br /&gt;&lt;strong&gt;Schritt 5 - Magnify-Effekt soll dem Mauszeiger folgen&lt;/strong&gt;&lt;br /&gt;Als letztes wird der Code erstellt, damit der Magnify-Effekt dem Mauszeiger folgt. Hier ist der betreffende Quellcode:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Overlay_MouseMove(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; Overlay.MouseMove&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; IsMagActive = &lt;span style="color: blue;"&gt;True&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; CP &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; = e.GetPosition(Overlay)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; CP.X /= Overlay.ActualWidth&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; CP.Y /= Overlay.ActualHeight&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; myMag.Center = CP&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Der Variablen "&lt;em&gt;CP&lt;/em&gt;" wird im MouseMove-Ereignis die Position des Mauszeigers innerhalb des Overlay-Elements zugewiesen. Diese Variable ist vom Typ "Point". Dann&amp;nbsp;werden der X-Wert und der Y-Wert für die Eigenschaft "Center" des Magnify-Effekts ermittelt, indem der X-Wert der Mauszeigerposition durch die aktuelle Breite des Overlay-Elements geteilt wird. Entsprechend wird Y-Wert der Mauszeigerposition durch die aktuelle Höhe des Overlay-Elements geteilt. Schließlich wird dieser Wert der "Center"-Eigenschaft des Magnify-Effekts zugewiesen. Jedesmal, wenn das MouseMove-Ereignis feuert, wird jetzt die "Center"-Position des Magnify-Effekts aktualisiert.&lt;br /&gt;&lt;br /&gt;Das war's.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-537468246021580124?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/537468246021580124/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/01/how-to-sanfte-animation-eines-magnify.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/537468246021580124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/537468246021580124'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/01/how-to-sanfte-animation-eines-magnify.html' title='How To: Sanfte Animation eines Magnify-Effekt'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Y29D3-feYio/TTAD1SrYEsI/AAAAAAAAAG4/lBxwMrXLRKw/s72-c/ss1_387x175.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6921164430541356906</id><published>2011-01-12T14:20:00.000+01:00</published><updated>2011-01-12T14:20:57.591+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Effects'/><title type='text'>Einfach nur Spass</title><content type='html'>Dieses &lt;a href="http://gallery.expression.microsoft.com/en-us/SLJFSL4?SRC=Home"&gt;Beispielprojekt&lt;/a&gt; ist einfach nur Spass. Mit aktivierter Lupe erzeugt man ein unterschiedliche Gesichter, je nachdem, wo auf die Blende geklickt wird.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/JF/S1/s1.html" style="height: 600px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Also ... viel Spass damit ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6921164430541356906?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6921164430541356906/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/01/einfach-nur-spass.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6921164430541356906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6921164430541356906'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/01/einfach-nur-spass.html' title='Einfach nur Spass'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6737835221677537856</id><published>2011-01-11T14:12:00.002+01:00</published><updated>2011-01-11T14:14:06.919+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='GridSplitter'/><title type='text'>Bildbetrachter mithilfe eines GridSplitter-Steuerelements</title><content type='html'>Ich weiß nicht, welche Erfahrungen Ihr gemacht habt. Ich habe jedenfalls den Eindruck, dass das GridSplitter-Steuerelement eher eine Außenseiterrolle einnimmt. Also habe ich mir eine vielleicht sinnvolle Verwendung für ein GridSplitter-Steuerelement überlegt. Das Ergebnis ist der "&lt;a href="http://gallery.expression.microsoft.com/en-us/SLGSPVSL4"&gt;GridSplitter Picture Viewer&lt;/a&gt;".&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Der "&lt;a href="http://gallery.expression.microsoft.com/en-us/SLGSPVSL4"&gt;GridSplitter Picture Viewer&lt;/a&gt;" ist kein UserControl und auch kein CustomControl. Er verdeutlicht nur, wie man ein GridSplitter-Steuerelement einsetzen kann, um einen einfachen Bildbetrachter zu erstellen.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/GSPV/S1/s1.html" style="height: 600px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Das &lt;a href="http://gallery.expression.microsoft.com/en-us/SLGSPVSL4"&gt;Beispielprojekt mit dem vollständigen Quellcode&lt;/a&gt; findet Ihr in der Expression Gallery.&lt;br /&gt;&lt;br /&gt;Viel Spaß damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6737835221677537856?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6737835221677537856/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/01/bildbetrachter-mithilfe-eines.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6737835221677537856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6737835221677537856'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/01/bildbetrachter-mithilfe-eines.html' title='Bildbetrachter mithilfe eines GridSplitter-Steuerelements'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-8081498048518173485</id><published>2011-01-03T10:19:00.002+01:00</published><updated>2011-01-03T10:23:00.185+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ChildWindow'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Behavior'/><title type='text'>ChildWindowResizeBehavior Silverlight 4  - Quellcode</title><content type='html'>Vor einiger Zeit veröffentlichte ich in der Expression Gallery ein &lt;a href="http://gallery.expression.microsoft.com/en-us/LBCWRBSL4"&gt;ChildWindowResizeBehavior für Silverlight 4&lt;/a&gt;. Das Behavior ermöglicht es, einem Silverlight 4 ChildWindow die Funktionalität hinzuzufügen, es durch das Drehen des Mausrads in seiner Größe zu verändern. Ergänzend ist ein Ereignis implementiert, mit dessen Hilfe zur Laufzeit die aktuelle Größe des ChildWindow abgefragt werden kann. Das ist das OnSizeChangedEvent. &lt;br /&gt;&lt;br /&gt;Der ursprüngliche Download in der Expression Gallery enthielt das Behavior nur als kompilierte .dll-Datei. Für dieses Behavior findet Ihr jetzt am Ende dieses Artikels den Download-Link für den vollständigen Quellcode des Projekts (VB.NET).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Aus der Community kam seinerzeit der Einwand, dass die Größenveränderung eines ChildWindow mithilfe des Mausrads wenig intuitiv ist. Dieser Einwand ist berechtigt. Vielleicht ist es in spezifischen Szenarien trotzdem eine interessante Variante. Und für alle, die sich etwas näher mit der Funktionsweise eines Silverlight 4 ChildWindow befassen wollen, ist der Quellcode des Behaviors sicherlich hilfreich.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Download: &lt;a href="http://silverlawone.de/silverlawblogde/ChildWindowResizeBehaviorSource/ChildWindowResizeBehavior.zip"&gt;Vollständiger Quellcode des ChildWindowResizeBehavior (Silverlight 4)&lt;/a&gt;.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-8081498048518173485?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/8081498048518173485/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/01/childwindowresizebehavior-silverlight-4.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8081498048518173485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8081498048518173485'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/01/childwindowresizebehavior-silverlight-4.html' title='ChildWindowResizeBehavior Silverlight 4  - Quellcode'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-7899767799216571576</id><published>2011-01-03T09:37:00.001+01:00</published><updated>2011-01-03T09:40:38.841+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Out Of Browser'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 3'/><title type='text'>Out Of Browser Experience UserControl - Quellcode</title><content type='html'>Vor ziemlich genau einem Jahr habe ich in der Expression Gallery das &lt;a href="http://gallery.expression.microsoft.com/en-us/OOBControl"&gt;OOBControl Version 1.1&lt;/a&gt; veröffentlicht. Dieses für Silverlight 3 entwickelte Benutzersteuerelement kapselt die Out Of Browser Funktionalität für eine Anwendung und ermöglicht es, eine Silverlight 3-Anwendung durch einfaches Einfügen des OOBControl auf die Benutzeroberfläche Out Of Browser-fähig zu machen. Bis heute haben 6.141&amp;nbsp;Designer oder Entwickler das OOBControl&amp;nbsp;heruntergeladen. Vielen Dank an alle für diese tolle Resonanz. Der Download beinhaltet das UserControl allerdings&amp;nbsp;nur als kompilierte .dll-Datei. &lt;br /&gt;&lt;br /&gt;Ich habe mich entschieden, die weitere Entwicklung des für Silverlight 3 entwickelten OOBControl der Community zu überlassen und deswegen den Quellcode zu veröffentlichen. Der folgende Download-Link beinhaltet den Quellcode in VB.NET.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;: &lt;a href="http://silverlawone.de/silverlawblogde/OOBControlSource/OOBControl%20source%20code.zip"&gt;Quellcode des OOBControl Version 1.1&lt;/a&gt;.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-7899767799216571576?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/7899767799216571576/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2011/01/out-of-browser-experience-usercontrol.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/7899767799216571576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/7899767799216571576'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2011/01/out-of-browser-experience-usercontrol.html' title='Out Of Browser Experience UserControl - Quellcode'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-5308806556027030125</id><published>2010-12-24T10:32:00.001+01:00</published><updated>2011-01-03T09:41:34.276+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sonstiges'/><title type='text'>Fröhliche Weihnachten!</title><content type='html'>Ich wünsche allen ein fröhliches, besinnliches&amp;nbsp;und friedliches Weihnachten 2010!&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="300" src="http://player.vimeo.com/video/17810614" style="height: 367px; width: 586px;" width="400"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;a href="http://vimeo.com/17810614"&gt;rudolf&lt;/a&gt; from &lt;a href="http://vimeo.com/user2783130"&gt;michiel van iperen&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ho-Ho-Ho ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-5308806556027030125?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/5308806556027030125/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/12/frohliche-weihnachten.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5308806556027030125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5308806556027030125'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/12/frohliche-weihnachten.html' title='Fröhliche Weihnachten!'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6802689448753654638</id><published>2010-12-22T11:33:00.000+01:00</published><updated>2010-12-22T11:33:12.378+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Thumb'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Größenveränderung eines Grid mithilfe von Thumb Steuerelementen</title><content type='html'>In der Expression Gallery findet Ihr ein neues &lt;a href="http://gallery.expression.microsoft.com/en-us/SLRGUTSL4V2"&gt;Beispielprojekt&lt;/a&gt; für ein Grid, das durch Klicken, Halten und Ziehen in seiner Größe verändert werden kann. Zum Einsatz kommen dabei Thumb-Steuerelemente. Hier erstmal das lebendige Beispiel:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/RGUT/S1/s1.html" style="height: 600px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Das Prinzip ist einfach. Das Grid, das in seiner Größe veränderbar gestaltet werden soll, erhält jeweils drei Zeilendefinitionen und drei Spaltendefinitionen. Die beiden äußeren Spalten und Zeilen erhalten jeweils eine fixe Breite bzw. Höhe von 2px. Es werden insgesamt 8 Thumb-Steuerelemente im Grid platziert, jeweils ein Thumb-Steuerelement in jede der äußeren Spalten bzw. Zeilen sowie in jede der vier Ecken. Im DragDelta-Ereignisbehandler eines jeden Thumb-Steuerelements findet dann die Logik für die Größenveränderung des Grid statt. Alles weitere sollte eigentlich der Quellcode erklären, den ihr im &lt;a href="http://gallery.expression.microsoft.com/en-us/SLRGUTSL4V2"&gt;Download des Beispielprojekts&lt;/a&gt; in der Expression Gallery findet.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;strong&gt;&lt;a href="http://gallery.expression.microsoft.com/en-us/SLRGUTSL4V2"&gt;Quellcode des vollständigen Beispielprojekts in der Expression Gallery&lt;/a&gt;.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Viel Spass damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6802689448753654638?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6802689448753654638/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/12/groenveranderung-eines-grid-mithilfe.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6802689448753654638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6802689448753654638'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/12/groenveranderung-eines-grid-mithilfe.html' title='Größenveränderung eines Grid mithilfe von Thumb Steuerelementen'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-2153641151297039018</id><published>2010-12-21T20:03:00.000+01:00</published><updated>2010-12-21T20:03:03.454+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><title type='text'>VB.NET: Teilermenge einer positiven ganzen Zahl berechnen</title><content type='html'>Am Wochenende habe ich für ein kleines Tool, an dem ich gerade arbeite, eine Funktion geschrieben, die die Teilermenge einer positiven ganzen Zahl berechnet. Also z.B. alle Teiler der Zahl 465289 sind die Zahlen 1, 11, 42299 und 465289. Für alle, die das mal brauchen gibt es hier die Funktion:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GibAlleTeiler(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; zahl &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; result &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(1)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; n &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt; = 2&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Do&lt;/span&gt; &lt;span style="color: blue;"&gt;Until&lt;/span&gt; result.Min * result.Max = zahl&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; result.Sort()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; zahl &lt;span style="color: blue;"&gt;Mod&lt;/span&gt; n = 0 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(n)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; n &amp;lt; zahl / 2 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; n += 1&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(zahl)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Exit Do&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Loop&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; result.ToArray&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Vorschläge zur Verbesserung sind als Kommentar natürlich sehr willkommen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-2153641151297039018?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/2153641151297039018/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/12/vbnet-teilermenge-einer-positiven.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2153641151297039018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2153641151297039018'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/12/vbnet-teilermenge-einer-positiven.html' title='VB.NET: Teilermenge einer positiven ganzen Zahl berechnen'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6949652248559322730</id><published>2010-12-09T20:45:00.002+01:00</published><updated>2010-12-09T21:07:28.741+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>WP7: Den Text-Cursor bei der Eingabe von Text exakt positionieren</title><content type='html'>Dies ist ein kurzer Tipp für alle, die schon immer wissen wollten, wie man den Text-Cursor bei der Eingabe von Text in einer Windows Phone-Anwendung exakt positionieren kann. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Der Finger wird leicht auf den Bildschirm gedrückt und gehalten. Nach einer halben Sekunde erscheint mit einer kleinen Animation ein virtuelles Cursor-Symbol. Weiter den Finger auf dem Bildschirm halten und über den Text (den Bildschirm) bewegen. Das virtuelle Cursor-Symbol folgt der Bewegung des Fingers und bewegt sich durch den Text. Dann einfach den Finger vom Bildschirm nehmen, sobald das Cursor-Symbol an der gewünschten Position ist.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="330" src="http://player.vimeo.com/video/17649808" width="500"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;a href="http://vimeo.com/17649808"&gt;WP7: Text-Cursor im Text exakt positionieren&lt;/a&gt; from &lt;a href="http://vimeo.com/lawbot"&gt;LawBot&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Das war's. Wie einfach die Welt doch sein kann ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6949652248559322730?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6949652248559322730/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/12/wp7-den-text-cursor-bei-der-eingabe-von.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6949652248559322730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6949652248559322730'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/12/wp7-den-text-cursor-bei-der-eingabe-von.html' title='WP7: Den Text-Cursor bei der Eingabe von Text exakt positionieren'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-8526055911273030901</id><published>2010-12-09T11:13:00.002+01:00</published><updated>2010-12-09T17:06:44.519+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><title type='text'>VB.NET: Sortieren einer Dictionary(Of TKey, TValue)-Auflistung</title><content type='html'>Dies ist ein kurzer, aber vielleicht recht nützlicher Artikel über das Sortieren eines Dictionary(Of TKey, TValue). Als Teil eines kleineren Projekts war es erforderlich, ein Dictionary mit Schlüssel- und Wert-Paaren zu sortieren und abhängig von der Auswertung&amp;nbsp;des Werts nur&amp;nbsp;den Schlüssel (vom Typ String) zurückzugeben. &lt;br /&gt;&lt;br /&gt;Der folgende Quellcode-Ausschnitt zeigt beispielhaft, wie es funktioniert:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetKeyOfGreatestOrSmallestKeyValuePair(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; indicator &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; ListOfKeyValuePairs &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;, &lt;span style="color: blue;"&gt;Double&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;With&lt;/span&gt; ListOfKeyValuePairs&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;"Key 1"&lt;/span&gt;, 20.35)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;"Key 2"&lt;/span&gt;, 10.25)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;"Key 3"&lt;/span&gt;, 45.95)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;"Key 4"&lt;/span&gt;, 900.22)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;"Key 5"&lt;/span&gt;, 1.07)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; listedItems &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IOrderedEnumerable&lt;/span&gt;(&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;KeyValuePair&lt;/span&gt;(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;, &lt;span style="color: blue;"&gt;Double&lt;/span&gt;)) = ListOfKeyValuePairs.OrderBy(&lt;span style="color: blue;"&gt;Function&lt;/span&gt;(v) v.Value)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; indicator&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: blue;"&gt;Is&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;"Greatest"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; listedItems.Last.Key.ToString&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: blue;"&gt;Is&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;"Smallest"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; listedItems.First.Key.ToString&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Die Function "GetKeyOfGreatestOrSmallestKeyValuePair" gibt, je nach dem welcher Parameter übergeben wird, entweder&amp;nbsp;den Schlüssel des&amp;nbsp;größten oder den Schlüssel des&amp;nbsp;kleinsten&amp;nbsp;aller Werte&amp;nbsp;eines Dictionary mit Schlüssel- und Wert-Paaren zurück. Das Dictionary wird mit der Variablen "ListOfKeyValuePairs" erzeugt. Dann wird eine weitere Variable erzeugt. Das ist die Variable "listedItems" vom Typ "&lt;a href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;amp;l=DE-DE&amp;amp;k=k(%22SYSTEM.LINQ.IORDEREDENUMERABLE%601%22);k(TargetFrameworkMoniker-%22SILVERLIGHT%2cVERSION%3dV4.0%22);k(DevLang-VB)&amp;amp;rd=true"&gt;IOrderedEnumerable(Of &lt;/a&gt;KeyValuePair(Of String, Double))". Dieser Variablen wird die Auswertung der Methode "OrderBy()" übergeben, die auf das Dictionary angewendet wird. Der Clou besteht darin, dass der Methode "OrderBy()" eine Lambda-Funktion übergeben wird, die die Werte jedes Schlüssel-/Wert-Paares zurückgibt. Die Methode "OrderBy()" sortiert die von der Lambda-Funktion übergebenen Werte in aufsteigender Reihenfolge. Im Ergebnis enthält die Variable "listedItems" eine neue Auflistung vom Typ "IOrderedEnumerable(Of KeyValuePair(Of String, Double)), deren Schlüssel-/Wert-Paare in &lt;em&gt;aufsteigender&lt;/em&gt; Reihenfolge sortiert sind. Diese sortierte Auflistung kann dann ausgewertet werden.&lt;br /&gt;&lt;br /&gt;Anstatt der Methode "OrderBy()" kann man z.B. auch die Methode "OrderByDescending()" anwenden. Als Ergebnis erhält man dann ein neues Dictionary, das in &lt;em&gt;absteigender&lt;/em&gt; Reihenfolge sortiert ist.&lt;br /&gt;&lt;br /&gt;Die Methoden "OrderBy()" und "OrderByDescending()" zählen zu den sogenannten &lt;a href="http://msdn.microsoft.com/de-de/library/1e8ecdh9.aspx"&gt;Erweiterungsmethoden&lt;/a&gt; der "Dictionary(Of TKey, TValue)"-Klasse. Es gibt eine Vielzahl weiterer &lt;a href="http://msdn.microsoft.com/de-de/library/1e8ecdh9.aspx"&gt;Erweiterungsmethoden&lt;/a&gt;, die auf ein Dictionary angewendet werden können. Mit deren Hilfe sind weitere, umfangreiche Abfrage- und Filter-Aktionen möglich.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-8526055911273030901?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/8526055911273030901/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/12/vbnet-sortieren-einer-dictionaryof-tkey.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8526055911273030901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8526055911273030901'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/12/vbnet-sortieren-einer-dictionaryof-tkey.html' title='VB.NET: Sortieren einer Dictionary(Of TKey, TValue)-Auflistung'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-2041793758063278533</id><published>2010-12-03T13:23:00.003+01:00</published><updated>2010-12-03T13:34:19.084+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Control'/><title type='text'>WP7: Glossy TextBlock Custom Control</title><content type='html'>Ich habe ein GlossyTextBlock Custom Control für&amp;nbsp;Windows Phone einschließlich Quellcode in der Expression Gallery zum Download bereitgestellt. Dieses Steuerelement ermöglicht die Darstellung von Text mit einem Schatten. So kann beispielsweise Text mit einem visuellen Glanzeffekt dargestellt werden. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Nachfolgend seht Ihr einen Screenshot von einer Beispielanwendung, der beispielhaft zeigt, was mit dem Steuerelement u.a. visuell erreicht werden kann:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TPjc3_RIOjI/AAAAAAAAAGk/jgq2OQmz-s4/s1600/ss2_391x733.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TPjc3_RIOjI/AAAAAAAAAGk/jgq2OQmz-s4/s1600/ss2_391x733.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Das obige Beispiel zeigt nur einige von vielen visuellen Möglichkeiten. Das Steuerelement ermöglicht eine Vielzahl von weiteren visuellen Gestaltungsmöglichkeiten. Ermöglicht wird dies dadurch, dass die maßgeblichen Eigenschaften des Steuerelements in der Vorlage entsprechend gebunden sind. Im Einzelnen:&lt;br /&gt;&lt;br /&gt;Über die &lt;strong&gt;Foreground&lt;/strong&gt;-Eigenschaft wird die &lt;strong&gt;Vordergrundfarbe&lt;/strong&gt; des Textes gesetzt.&amp;nbsp;Über die &lt;strong&gt;Background&lt;/strong&gt;-Eigenschaft wird die &lt;strong&gt;Schattenfarbe&lt;/strong&gt; des Steuerelements festgelegt. Die Eigenschaften "&lt;strong&gt;FontFamily&lt;/strong&gt;", "&lt;strong&gt;FontSize&lt;/strong&gt;", "&lt;strong&gt;FontWeight&lt;/strong&gt;" und "&lt;strong&gt;FontStyle&lt;/strong&gt;" sind ebenfalls gebunden. &lt;br /&gt;&lt;br /&gt;Der Text des Steuerelements kann über die Eigenschaft "&lt;strong&gt;Text&lt;/strong&gt;" festgelegt werden. In Expression Blend findet man die "Text"-Eigenschaft in der Registerkarte "SilverLaw GlossyTextBlock":&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TPjc-PeskTI/AAAAAAAAAGo/Z71NM0nUyME/s1600/ss4_410x66.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TPjc-PeskTI/AAAAAAAAAGo/Z71NM0nUyME/s1600/ss4_410x66.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Die Eigenschaft "&lt;strong&gt;Text&lt;/strong&gt;" ist als Abhängigkeitseigenschaft implementiert. Das ermöglicht eine Datenbindung dieser Eigenschaft, z.B. an ein TextBox-Steurelement als Quelle:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TPjdCvthZ5I/AAAAAAAAAGs/HgKeSdRTFAQ/s1600/ss1_391x733.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TPjdCvthZ5I/AAAAAAAAAGs/HgKeSdRTFAQ/s1600/ss1_391x733.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TPjdHhAMqZI/AAAAAAAAAGw/SbjVwPuezfc/s1600/ss1a_391x733.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TPjdHhAMqZI/AAAAAAAAAGw/SbjVwPuezfc/s1600/ss1a_391x733.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das GlossyTextBlock Custom Control bietet Entwurfszeit-Unterstützung in Expression Blend 4 und Visual Studio 2010.&lt;br /&gt;&lt;br /&gt;Viel Spass damit!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;strong&gt;&lt;a href="http://gallery.expression.microsoft.com/en-us/SLGTBCCWP7"&gt;Quellcode-Projekt (VB) und ein Beispiel-Projekt (C#)&lt;/a&gt;&lt;/strong&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-2041793758063278533?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/2041793758063278533/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/12/wp7-glossy-textblock-custom-control.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2041793758063278533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/2041793758063278533'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/12/wp7-glossy-textblock-custom-control.html' title='WP7: Glossy TextBlock Custom Control'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Y29D3-feYio/TPjc3_RIOjI/AAAAAAAAAGk/jgq2OQmz-s4/s72-c/ss2_391x733.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-41461032293598138</id><published>2010-11-30T17:24:00.000+01:00</published><updated>2010-11-30T17:24:27.169+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>How To: Neupositionieren von TextBlock- und TextBox-Steuerelementen beim Wechsel zwischen Portrait- und Landscape-Orientierung (WP7)</title><content type='html'>Dieser Artikel beschreibt Schritt-für-Schritt, wie man in einer Windows Phone 7-Anwendung mit TextBlock- und TextBox-Steuerelementen ein einigermaßen konsitentes Layout beibehält, wenn ein Wechsel von der Portrait- zur Landscape-Orientierung erfolgt.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Weil es in Expression Blend 4 noch keine VB-Projektvorlagen für die Windows Phone-Anwendungsentwicklung gibt, stelle ich nachfolgend die Vorgehensweise für ein C#-Projekt dar. VB-Programmierer können Expression Blend 4 für das Design der Benutzeroberfläche, einschließlich der VisualStates, auch nutzen. Sie müssen aber zwei Projekte erstellen: Ein C#-Projekt, für das in Expression Blend die Benutzeroberfläche gestaltet wird. Und ein VB-Projekt in Visual Studio 2010, in das später der Xaml-Quellcode aus dem C#-Projekt eingefügt wird.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Generelle Vorgehensweise&lt;/span&gt;&lt;br /&gt;Das Prinzip ist einfach. Jeweils ein TextBlock- und ein TextBox-Steuerelement werden in einem Grid gruppiert. Das Grid hat Spalten- und Zeilendefinitionen. Für jede Ansicht (Portrait / Landscape) wird jeweils ein visueller Zustand erzeugt, in dem die TextBlock- und TextBox-Steuerelemente jeweils verschiedene Spalten- und Zeilenzuweisungen erhalten.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 1&lt;/span&gt;&lt;br /&gt;Ein neues Windows Phone 7-Projekt wird in Expression Blend 4 erstellt. Projektvorlage ist eine einfache Windows Phone 7-Anwendung. Der Wert der Eigenschaft "SupportedPageOrientation" in der PhoneApplicationPage wird auf "PortraitOrLandscape" gesetzt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 2&lt;/span&gt;&lt;br /&gt;Für das ContentPanel-Element werden vier Zeilendefinitionen erstellt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 3&lt;/span&gt;&lt;br /&gt;In die ersten drei Zeilen wird jeweils ein Grid eingefügt. Die Werte für HorizontalAllignment und für VerticalAllignment werden jeweils auf "1" "Star" gesetzt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 4&lt;/span&gt;&lt;br /&gt;Jedes der eingefügten Grid-Steuerelemente erhält zwei Zeilendefinitionen und zwei Spaltendefinitionen. Der Wert für Width der ersten Spalte wird auf "1" "Auto" gesetzt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 5&lt;/span&gt;&lt;br /&gt;Jedem Grid wird ein TextBlock- und eine TextBox-Steuerelement hinzugefügt. Die Anwendung befindet sich standardmäßig zunächst in der Portrait-Orientierung. Also erstellen wir zunächst das Layout für diese Ansicht.&lt;br /&gt;&lt;br /&gt;Dies sind die maßgeblichen Eigenschaftswerte für jedes &lt;strong&gt;TextBlock&lt;/strong&gt;-Element, mit denen die Zuordnung zu den einzelnen Spalten- und Zeilen erfolgt:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TPUe8-ILMdI/AAAAAAAAAGM/hkTx5kQHuIc/s1600/ss1_363x258.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TPUe8-ILMdI/AAAAAAAAAGM/hkTx5kQHuIc/s1600/ss1_363x258.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Und dies sind die maßgeblichen Eigenschaftswerte für jedes &lt;strong&gt;TextBox&lt;/strong&gt;-Steuerelement, mit denen die Zuordnung zu den einzelnen Spalten- und Zeilen erfolgt:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TPUfBwWq_zI/AAAAAAAAAGQ/muSPrE1ZfXI/s1600/ss2_363x258.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TPUfBwWq_zI/AAAAAAAAAGQ/muSPrE1ZfXI/s1600/ss2_363x258.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Danach sieht die Anwendung in der Design-Ansicht so aus:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TPUhaptt5uI/AAAAAAAAAGc/B_DeZkS88Zc/s1600/ss2a_363x600.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TPUhaptt5uI/AAAAAAAAAGc/B_DeZkS88Zc/s1600/ss2a_363x600.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 6&lt;/span&gt;&lt;br /&gt;Jetzt wechseln wir zur Registerkarte "Zustände" und erzeugen eine neue VisualStateGroup. In dieser VisualStateGroup werden zwei neue visuelle Zustände erzeugt. Der visuelle Zustand "&lt;strong&gt;POP&lt;/strong&gt;" enthält den Zustand der Benutzeroberfläche in der Portrait-Ansicht (&lt;strong&gt;P&lt;/strong&gt;age&lt;strong&gt;O&lt;/strong&gt;rientation&lt;strong&gt;P&lt;/strong&gt;ortrait). Der visuelle Zustand "&lt;strong&gt;POL&lt;/strong&gt;" enthält den Zustand der Benutzeroberfläche in der Landscape-Ansicht (&lt;strong&gt;P&lt;/strong&gt;age&lt;strong&gt;O&lt;/strong&gt;rientation&lt;strong&gt;L&lt;/strong&gt;andscape).&lt;br /&gt;&lt;br /&gt;Der visuelle Zustand &lt;strong&gt;POP&lt;/strong&gt; muss nicht verändert werden, weil die anfänglich entworfene Benutzeroberfläche bereits für die Portrait-Ansicht erstellt wurde.&lt;br /&gt;&lt;br /&gt;Für den visuellen Zustand &lt;strong&gt;POL&lt;/strong&gt; müssen folgende Eigenschaften modifiziert werden. Für ein &lt;strong&gt;TextBlock&lt;/strong&gt;-Steuerelement muss nur der Wert für RowSpan auf "2" gesetzt werden:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TPUfKjS22kI/AAAAAAAAAGU/VtL4uuJ5734/s1600/ss3_363x258.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" ox="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TPUfKjS22kI/AAAAAAAAAGU/VtL4uuJ5734/s320/ss3_363x258.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Für ein &lt;strong&gt;TextBox&lt;/strong&gt;-Steuerelement müssen die Zeilen- und Spaltenzuweisungen sowie der Wert für VerticalAllignment wie folgt geändert werden:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TPUfOzjIy5I/AAAAAAAAAGY/QumvUUHuQhM/s1600/ss4_363x258.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" ox="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TPUfOzjIy5I/AAAAAAAAAGY/QumvUUHuQhM/s320/ss4_363x258.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die übrigen TextBlock- und TextBox-Steuerelemente in den anderen Grid-Elementen werden im visuellen Zustand POL entsprechend geändert.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 7&lt;/span&gt;&lt;br /&gt;In der CodeBehind-Datei wird schließlich der folgende Quellcode hinzugefügt. Dieser Quellcode reagiert auf das OrientationChanged-Ereignis von MainPage und wechselt den visuellen Zustand abhängig davon, in welche Ansicht gewechselt wurde.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;VB:&lt;/strong&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Partial&lt;/span&gt; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MainPage&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PhoneApplicationPage&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: green;"&gt;' Konstruktor&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SupportedOrientations = &lt;span style="color: #2b91af;"&gt;SupportedPageOrientation&lt;/span&gt;.PortraitOrLandscape&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; MainPage_OrientationChanged(&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; Microsoft.Phone.Controls.&lt;span style="color: #2b91af;"&gt;OrientationChangedEventArgs&lt;/span&gt;) _&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.OrientationChanged&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; (e.Orientation &lt;span style="color: blue;"&gt;And&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PageOrientation&lt;/span&gt;.Landscape) &amp;lt;&amp;gt; 0 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;VisualStateManager&lt;/span&gt;.GoToState(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"POL"&lt;/span&gt;, &lt;span style="color: blue;"&gt;True&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;VisualStateManager&lt;/span&gt;.GoToState(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"POP"&lt;/span&gt;, &lt;span style="color: blue;"&gt;True&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;C#:&lt;/strong&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; TextDesignPortraitLanscapeLab&lt;/div&gt;&lt;div style="margin: 0px;"&gt;{&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;partial&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MainPage&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;PhoneApplicationPage&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; {&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; MainPage()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; InitializeComponent();&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; SupportedOrientations = &lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;SupportedPageOrientation&lt;/span&gt;.PortraitOrLandscape;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; PhoneApplicationPage_OrientationChanged(&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;OrientationChangedEventArgs&lt;/span&gt; e)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; ((e.Orientation &amp;amp; &lt;span style="color: #2b91af;"&gt;PageOrientation&lt;/span&gt;.Landscape) != 0)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;VisualStateManager&lt;/span&gt;.GoToState(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"POL"&lt;/span&gt;, &lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;VisualStateManager&lt;/span&gt;.GoToState(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"POP"&lt;/span&gt;, &lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; }&lt;/div&gt;&lt;div style="margin: 0px;"&gt;}&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;F5! Und in der Landscape-Ansicht sieht die Benutzeroberfläche nun so aus:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TPUi-ZUw12I/AAAAAAAAAGg/JTJ7iqwK624/s1600/ss5_524x284.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TPUi-ZUw12I/AAAAAAAAAGg/JTJ7iqwK624/s1600/ss5_524x284.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das war's. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;a href="http://gallery.expression.microsoft.com/en-us/SLORIENTMEWP7?SRC=Home"&gt;Quellcode des Beispiel-Projekts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-41461032293598138?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/41461032293598138/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/how-to-neupositionieren-von-textblock.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/41461032293598138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/41461032293598138'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/how-to-neupositionieren-von-textblock.html' title='How To: Neupositionieren von TextBlock- und TextBox-Steuerelementen beim Wechsel zwischen Portrait- und Landscape-Orientierung (WP7)'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Y29D3-feYio/TPUe8-ILMdI/AAAAAAAAAGM/hkTx5kQHuIc/s72-c/ss1_363x258.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-7815664665225757574</id><published>2010-11-30T12:00:00.001+01:00</published><updated>2010-11-30T17:25:58.479+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>WP7: Wechsel von Portrait- zu Landscape-Orientierung bei Layout mit größeren TextBlock- und TextBox-Steuerelementen</title><content type='html'>Das Layout einer Windows Phone 7-Anwendung kann darauf&amp;nbsp;reagieren, je nach dem wie der Benutzer das Gerät in der Hand hält. Wenn das Gerät senkrecht gehalten wird, befindet es sich in der&amp;nbsp;Portrait-Orientierung. Wenn das Gerät waagerecht gehalten wird, befindet es sich in der Landscape-Orientierung. Bei einem Layout mit mehreren TextBlock- und TextBox-Steuerelementen braucht man für beide Situationen eine möglichst konsistente Design-Lösung. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Das ist einfach, wenn die TextBlock- und TextBox-Steuerelemente jeweils nur wenige Zeichen beinhalten. Wenn die TextBlock- und TextBox-Steuerelemente aber viele Zeichen beinhalten sollen, muss die Anordnung der Steuerelemente verändert werden.&lt;br /&gt;&lt;br /&gt;In der Expression Gallery findet Ihr eine &lt;a href="http://gallery.expression.microsoft.com/en-us/SLORIENTMEWP7?SRC=Home"&gt;WP7-Beispiel-Anwendung&lt;/a&gt;, die &lt;em&gt;eine&lt;/em&gt; mögliche Design-Lösung hierfür vorstellt. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TPTXNCXrF5I/AAAAAAAAAGI/nwW1soukHGU/s1600/ss552x946.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ox="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TPTXNCXrF5I/AAAAAAAAAGI/nwW1soukHGU/s1600/ss552x946.png" /&gt;&lt;/a&gt;&lt;/div&gt;Ich einem &lt;strong&gt;&lt;a href="http://silverlawone.blogspot.com/2010/11/how-to-neupositionieren-von-textblock.html"&gt;Tutorial hier im Blog&lt;/a&gt;&lt;/strong&gt; beschreibe ich Schritt-für-Schritt, wie das Beispiel erstellt wird.&lt;br /&gt;&lt;br /&gt;Die Beispiel-Anwendung wurde mit den Visual &lt;a href="http://blogs.msdn.com/b/jasonz/archive/2010/11/29/announcing-visual-basic-windows-phone-7-support-rtw.aspx"&gt;Basic Developer Tools für Windows Phone 7&lt;/a&gt; erstellt. Die CodeBehind-Sprache ist aber zweitrangig. Die Lösung baut im wesentlichen auf Xaml auf.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-7815664665225757574?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/7815664665225757574/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/wp7-wechsel-von-portrait-zu-landscape.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/7815664665225757574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/7815664665225757574'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/wp7-wechsel-von-portrait-zu-landscape.html' title='WP7: Wechsel von Portrait- zu Landscape-Orientierung bei Layout mit größeren TextBlock- und TextBox-Steuerelementen'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Y29D3-feYio/TPTXNCXrF5I/AAAAAAAAAGI/nwW1soukHGU/s72-c/ss552x946.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6026713192991139892</id><published>2010-11-29T16:08:00.002+01:00</published><updated>2010-11-29T16:48:18.784+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Visual Basic für Windows Phone Developer Tools - RTW erschienen</title><content type='html'>Gute Nachricht für alle VB-Programmierer, die für Windows Phone 7 programmieren wollen. &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=4e97ea70-e479-4c05-814f-639d71690e5d&amp;amp;displayLang=de#filelist"&gt;Visual Basic für Windows Phone Developer Tools - RTW steht zum Download bereit&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TPPBco3DRWI/AAAAAAAAAGA/j9UQZJP05XI/s1600/ss955x660.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" ox="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TPPBco3DRWI/AAAAAAAAAGA/j9UQZJP05XI/s400/ss955x660.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die Visual Basic Quellcode Beispiele für Windows Phone gibt es &lt;a href="http://msdn.microsoft.com/de-de/library/ff431744(v=VS.92).aspx"&gt;hier&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Es gibt zwar noch keine VB-Integration in Expression Blend 4 für Windows Phone. Visual Basic Windows Phone-Anwendungen werden in Expression Blend für Windows Phone leider noch nicht unterstützt. Das ist&amp;nbsp;immernoch ein stattlicher Nachteil, aber immerhin kann jetzt schonmal in Visual Studio 2010 (&amp;gt;= Professional) losgelegt werden. &lt;br /&gt;&lt;br /&gt;Eine Unterstützung für XNA Projekte ist ebenfalls noch unterentwickelt. Mit dem Release können zwar Visual Basic Silverlight Anwendungen für Windows Phone 7 erstellt werden, es gibt aber noch keine Projektvorlagen für XNA.&lt;br /&gt;&lt;br /&gt;Für die Installation muss die CTP Version vorher deinstaliiert werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6026713192991139892?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6026713192991139892/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/visual-basic-fur-windows-phone.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6026713192991139892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6026713192991139892'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/visual-basic-fur-windows-phone.html' title='Visual Basic für Windows Phone Developer Tools - RTW erschienen'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Y29D3-feYio/TPPBco3DRWI/AAAAAAAAAGA/j9UQZJP05XI/s72-c/ss955x660.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6083239268352352990</id><published>2010-11-19T19:38:00.003+01:00</published><updated>2010-11-19T19:56:43.101+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Navigation'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='MSAF'/><title type='text'>Seitenaufrufanalyse für eine reine Silverlight 4-Navigationsanwendung mit dem Microsoft Silverlight Analytics Framework und Google Analytics</title><content type='html'>Vor etwas längerer Zeit hatte ich einen Thread im Deutschen MSDN Silverlight-Forum mit der Frage nach einem Seitenzähler für eine reine Silverlight-Anwendung eingestellt. &lt;a href="http://social.msdn.microsoft.com/profile/oliver%20michalski/?type=forum&amp;amp;referrer=http://social.msdn.microsoft.com/Forums/de-de/silverlightde/threads?page=1"&gt;Oliver Michalski&lt;/a&gt; gab zu dieser Frage den entscheidenden Hinweis auf das &lt;a href="http://msaf.codeplex.com/"&gt;Microsoft Silverlight Analytics Framework&lt;/a&gt;&amp;nbsp;(MSAF) und damit die Antwort auf meine Frage.&lt;br /&gt;&lt;br /&gt;Ich habe mich&amp;nbsp;also eingelesen und schließlich mit Hilfe des &lt;a href="http://msaf.codeplex.com/"&gt;MSAF&lt;/a&gt; und &lt;a href="http://www.google.com/intl/de_ALL/analytics/"&gt;Google Analytics&lt;/a&gt; als Service-Anbieter eine Seitenaufruf-Analyse in eine reine Silverlight 4 Navigationsanwendung implementiert. Für&amp;nbsp;alle, die&amp;nbsp;auch eine Lösung für diese Anforderung suchen, beschreibe ich hier kurz, wie das geht. Es ist wirklich total&amp;nbsp;einfach.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Das &lt;a href="http://msaf.codeplex.com/"&gt;MSAF&lt;/a&gt; stellt eine Reihe von Behaviors, also Behaviors, Actions und Trigger, zur Verfügung. Das macht die Implementierung sehr anwenderfreundlich und mit Expression Blend 4 zu einem Kinderspiel. Ich beschränke mich hier auf die Darstellung, eir eine Seitenaufruf-Analyse mit dem MSAF für Google Analytics&amp;nbsp;implementiert wird. Das MSAF bietet noch viel mehr als das. Außerdem werden neben Google Analytics viele weitere Anbieter von Analytics Services unterstützt. Es ist sogar möglich, mehrere Analytics-Services Anbieter parallel anzusprechen. Mehr Informationen gibt es auf der &lt;a href="http://msaf.codeplex.com/"&gt;Codeplex-Seite des MSAF&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Das MSAF ist &lt;strong&gt;kostenlos erhältlich&lt;/strong&gt; und wird unter &lt;span id="currentLicense"&gt;&lt;strong&gt;Microsoft Public License (Ms-PL)&lt;/strong&gt; zur Verfügung gestellt.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Vorbemerkung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Im Folgenden wird vorausgesetzt, dass ein aktiver Account bei Google Analytics besteht. Außerdem sollte natürlich eine Silverlight-Navigationsanwendung mit mehreren Pages vorhanden sein, die bereits veröffentlicht ist. Die Domain, unter der die Silverlight-Anwendung erreichbar ist, muss bei Google Analytics als Analytics-Konto eingerichtet sein. Weitere Informationen bietet die &lt;a href="http://www.google.com/support/googleanalytics/?hl=de_DE"&gt;Google Analytics Hilfe&lt;/a&gt;&amp;nbsp;und die recht intuitive Benutzerführung in der Account-Verwaltung. &lt;br /&gt;&lt;br /&gt;Wesentlicher Bestandteil für das Implementieren von Google Analytics für eine Silverlight-Anwendung ist der Einbau des Tracking-Scripts in der Seite, welche die Silverlight-Anwendung hostet. Ich setze voraus, dass dieses Script in die Startseite implementiert ist. Bestandteil dieses Scripts ist der UA-Schlüssel für das Analytics Konto. Für jede Internetseite&amp;nbsp;muss&amp;nbsp;ein eigenes Analytics-Konto eingerichtet werden und existiert ein spezieller UA-Schlüssel. Dieser UA-Schlüssel ist die einzige Information, die wir im Folgenden benötigen. Der UA-Schlüssel kann dem&amp;nbsp;Tracking-Script entnommen werden. Er wird dort im Format "UA-xxxxxxx-y" angezeigt. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt für Schritt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Und so funktioniert die Implementierung einer Seitenaufruf-Analyse mit dem MSAF im Fall von Google Analytics:&lt;br /&gt;&lt;br /&gt;1. Das Microsoft Silverlight Analytics Framework &lt;a href="http://msaf.codeplex.com/"&gt;herunterladen&lt;/a&gt; und installieren.&lt;br /&gt;&lt;br /&gt;2. Dem Silverlight-Projekt in Visual Studio 2010 einen Verweis auf die Microsoft.WebAnalytics.Navigation.dll hinzufügen. &lt;br /&gt;&lt;br /&gt;3. Wechseln zu Expression Blend 4. Dort die Registerkarte "&lt;em&gt;Objekte&lt;/em&gt;" selektieren. Auf "&lt;em&gt;Verhalten&lt;/em&gt;" klicken und "&lt;em&gt;TrackAction&lt;/em&gt;" auswählen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOa29EpU3aI/AAAAAAAAAFo/o08neoO4d7o/s1600/ss1_413x460.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" ox="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOa29EpU3aI/AAAAAAAAAFo/o08neoO4d7o/s400/ss1_413x460.png" width="357" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Diese &lt;strong&gt;TrackAction&lt;/strong&gt; wird dann per Drag&amp;amp;Drop &lt;strong&gt;auf das Frame-Steuerelement&lt;/strong&gt; gezogen. Die hinzugefügte TrackAction wird selektiert. In der Registerkarte Eigenschaften wird für diese TrackAction die EventName-Eigenschaft auf den Wert "&lt;em&gt;Navigated&lt;/em&gt;" gesetzt. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOa4Q1DyveI/AAAAAAAAAFs/1AEBONtHPKk/s1600/ss2_380x484.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" ox="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOa4Q1DyveI/AAAAAAAAAFs/1AEBONtHPKk/s400/ss2_380x484.png" width="312" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Das bewirkt, dass jedesmal, wenn das Navigated-Ereignis feuert, dieses Ereignis an den Analytics-Anbieter, hier also an Google Analytics, gesendet wird. In der Account-Verwaltung können dadurch später die einzelnen Seitenaufrufe nachverfolgt werden.&lt;br /&gt;&lt;br /&gt;4. Damit die Daten zum Analytics Service Anbieter gesendet werden können, muss dem LayoutRoot der entsprechende Analytics Service Anbieter per Drag&amp;amp;Drop hinzugefügt werden. Das Beispiel hier benutzt Google Analytics. Also: &lt;em&gt;GoogleAnalytics&lt;/em&gt; auswählen ...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOa52KHdqmI/AAAAAAAAAFw/jtsQgHF3Vfc/s1600/ss3_380x282.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" ox="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOa52KHdqmI/AAAAAAAAAFw/jtsQgHF3Vfc/s400/ss3_380x282.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;... und per Drag&amp;amp;Drop &lt;strong&gt;dem LayoutRoot&lt;/strong&gt; hinzufügen:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOa6ZN4l07I/AAAAAAAAAF0/APr1Kswnvts/s1600/ss4_380x204.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="171" ox="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOa6ZN4l07I/AAAAAAAAAF0/APr1Kswnvts/s320/ss4_380x204.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Jetzt das soeben hinzugefügte GoogleAnalytics-Behavior selektieren.&amp;nbsp;In der Registerkarte Eigenschaften wird dann der &lt;strong&gt;UA-Schlüssel&lt;/strong&gt; &lt;strong&gt;aus dem Tracking-Script&lt;/strong&gt; als Wert für die Eigenschaft "&lt;em&gt;Web Property ID&lt;/em&gt;" eingetragen:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOa7fCI0YRI/AAAAAAAAAF4/3iIiKwT0p_M/s1600/ss5_380x264.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" ox="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOa7fCI0YRI/AAAAAAAAAF4/3iIiKwT0p_M/s320/ss5_380x264.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Mehr braucht man nicht, damit die Silverlight-Anwendung nun mit dem konkreten Google Analytics Account kommuniziert!&lt;br /&gt;&lt;br /&gt;5. Schließlich das Projekt neu erstellen und veröffentlichen. Das war's!&lt;br /&gt;&lt;br /&gt;Extrem schlank. Extrem einfach. Und das Beste ist, man kann &lt;strong&gt;sofort&lt;/strong&gt; nach dem Veröffentlichen ausprobieren, ob die Seitenaufruf-Analyse funktioniert. Denn die Analyse &lt;strong&gt;beginnt bereits unmittelbar nach der Veröffentlichung&lt;/strong&gt; der modfizierten Silverlight-Anwendung quasi in Echtzeit. Probiert es selbst aus. Ruft die betreffende Seite auf, navigiert einige Male durch die Pages der Anwendung und wechselt dann zu dem Google Analytics Konto. Der Traffic wird sofort sichtbar:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOa-NePpGdI/AAAAAAAAAF8/WeOHk9Jz2TA/s1600/ss61656x824.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" ox="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOa-NePpGdI/AAAAAAAAAF8/WeOHk9Jz2TA/s400/ss61656x824.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Abschließend möchte ich noch empfehlen, einen Blick auf die weiteren Features des MSAF zu werfen. Seitenaufruf-Analyse ist wie gesagt nur ein kleiner Teil. Daneben können mit dem MSAF u.a. Ereignisse von Steuerelementen analysiert werden und&amp;nbsp;ein A/B-Testing wird unterstützt. So kann das Benutzungsverhalten in verschiedenen Zuständen der UI analysiert und ausgewertet werden. Ein wirklich mächtiges Framework.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Wichtige Resource&lt;/u&gt;&lt;/strong&gt;: &lt;a href="http://blogs.msdn.com/b/synergist/archive/tags/web+analytics/"&gt;Blog von Michael S. Scherotter; Tag: Web Analytics.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Viel Spass! Und viel Erfolg.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6083239268352352990?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6083239268352352990/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/seitenaufrufanalyse-fur-eine-reine.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6083239268352352990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6083239268352352990'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/seitenaufrufanalyse-fur-eine-reine.html' title='Seitenaufrufanalyse für eine reine Silverlight 4-Navigationsanwendung mit dem Microsoft Silverlight Analytics Framework und Google Analytics'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Y29D3-feYio/TOa29EpU3aI/AAAAAAAAAFo/o08neoO4d7o/s72-c/ss1_413x460.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-3395934642005397984</id><published>2010-11-16T19:06:00.008+01:00</published><updated>2010-11-16T19:29:49.718+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ChildWindow'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='PathListBox'/><title type='text'>How To: Erstellen eines nicht rechteckigen ChildWindow - Teil 2</title><content type='html'>Dies ist der zweite Teil über das Erstellen eines nicht rechteckigen ChildWindow. In &lt;a href="http://silverlawone.blogspot.com/2010/11/how-to-erstellen-eines-nicht.html"&gt;&lt;strong&gt;Teil 1&lt;/strong&gt;&lt;/a&gt; habe ich die grundsätzliche Vorgehensweise beschrieben, also welche Veränderungen an der Vorlage des ChildWindow vorgenommen werden müssen. &lt;br /&gt;&lt;br /&gt;In diesem Teil 2 beschreibe ich, wie man in einem kreisförmigen ChildWindow mit Hilfe eines PathListBox-Steuerelements Inhalt platzieren kann, der zu der runden Form paßt.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Anmerkung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ich habe das Design der Beispielanwendung in der Zwischenzeit etwas verändert. Die räumliche Anordnung und die Farbgestaltung des CloseButton sind anders. Außerdem habe ich einige DropShadow-Effekte hinzugefügt. Schaut Euch dafür bitte den Quellcode an. So sieht unser Ausgangsbeispiel mittlerweile aus:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOLGGOEX2lI/AAAAAAAAAFE/SiT9l3f2qpQ/s1600/ss27_450x488.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOLGGOEX2lI/AAAAAAAAAFE/SiT9l3f2qpQ/s320/ss27_450x488.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Und jetzt weiter mit dem Tutorial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 3 - Gestaltung des Inhalts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Glücklicherweise steht seit Silverlight 4 das PathListBox-Steuerelement zur Verfügung. Mit diesem Steuerelement ist die Anordnung beliebigen Inhalts in freier Form ein Kinderspiel. &lt;br /&gt;&lt;br /&gt;Als erstes müssen wir noch einmal kurz in die Vorlage des ChildWindow. Dort wird das Border-Steuerelement selektiert, in dem sich der ContentPresenter befindet. Für dieses Border-Steuerelement wird der Wert für "Row" auf 0 und der Wert für "RowSpan" auf 2 gesetzt.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOLGJiJQ2bI/AAAAAAAAAFI/Wp5TRe3fHhU/s1600/ss28_450x148.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="105" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOLGJiJQ2bI/AAAAAAAAAFI/Wp5TRe3fHhU/s320/ss28_450x148.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Dadurch ist sichergestellt, dass der Inhalt nun auf der gesamten Oberfläche des ChildWindow dargestellt wird.&lt;br /&gt;&lt;br /&gt;Jetzt wechseln wir aus der Vorlagen-Ansicht zurück zum ChildWindow selbst.&lt;br /&gt;&lt;br /&gt;Wir wollen ein PathListBox-Steuerelement verwenden und fügen dazu in einem ersten Schritt zu dem LayoutRoot des ChildWindow ein Ellipse-Steuerelement&amp;nbsp;hinzu. Die Werte für die Eigenschaften Breite und Höhe werden beide auf "Auto" gesetzt. Die Werte für die Eigenschaften Fill und Stroke werden jeweils zurückgesetzt. HorizontalAlignment und VerticalAlignment werden beide auf "Stretch" gesetzt. Der Wert für "Margin" wird einheitlich angepaßt, so dass der äußere Rand des Kreises in der Mitte des "Donut" liegt. Das Ganze sieht dann so aus:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOLGMWMXTAI/AAAAAAAAAFM/aoN6ve7QC4Q/s1600/ss29_450x429.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOLGMWMXTAI/AAAAAAAAAFM/aoN6ve7QC4Q/s320/ss29_450x429.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Dann wird&amp;nbsp;das Ellipse-Steuerelement&amp;nbsp;selektiert -&amp;gt; Rechtklick -&amp;gt; Pfad -&amp;gt; In Pfad konvertieren. Dann das LayoutRoot selektieren und ein PathListBox-Steuerelement hinzufügen. Die Werte für "Height" und "Width" des PathListBox-Steuerelements werden auf "Auto" gesetzt. HorizontalAlignment und VerticalAlignment werden beide auf "Stretch" gesetzt.&lt;br /&gt;&lt;br /&gt;Dann wird dem Layoutroot noch ein TextBlock-Steuerelement hinzugefügt. Der Text dieses TextBlocks soll später auf dem Pfad dargestellt werden. Der Wert für die Foreground-Eigenschaft des TextBlocks wird zurückgesetzt.&lt;br /&gt;&lt;br /&gt;In der Registerkarte "Eigenschaften" des PathListBox-Steuerelements wird in der Rubrik "&lt;em&gt;Layoutpfade&lt;/em&gt;" mit dem Mauszeiger der kleine runde Pinökel oben rechts per Klick selektiert.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOLGOmB8aqI/AAAAAAAAAFQ/rIwL9z6fzCg/s1600/ss30_450x243.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOLGOmB8aqI/AAAAAAAAAFQ/rIwL9z6fzCg/s320/ss30_450x243.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Der Mauszeiger verändert sich und mit dem veränderten Mauszeiger wird auf das Path-Steuerelement geklickt.&lt;br /&gt;&lt;br /&gt;Jetzt in den Eigenschaften des PathListBox-Steuerelements die erweiterten Optionen für die Eigenschaft "ItemsSource" öffnen und "Elementeigenschaftsbindung ..." auswählen:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOLGRRQibkI/AAAAAAAAAFU/DEe6Ml1KlHA/s1600/ss31_450x386.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOLGRRQibkI/AAAAAAAAAFU/DEe6Ml1KlHA/s320/ss31_450x386.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Der Mauszeiger verändert sich und mit dem veränderten Mauszeiger klicken wir auf das TextBlock-Steuerelement. Es erscheint der folgende Dialog:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TOLGWjbZO_I/AAAAAAAAAFY/lGTMZObzCdQ/s1600/ss32_450x194.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TOLGWjbZO_I/AAAAAAAAAFY/lGTMZObzCdQ/s320/ss32_450x194.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;... der mit "Ok" bestätigt wird. Damit haben wir den Text des TextBlock als ItemsSource an die PathListBox gebunden. Wenn diese Elementeigenschaftsbindung funktioniert hat, sollte der auf dem Pfad jetzt der Schriftzug "TextBlock" erscheinen:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOLGYgUhX3I/AAAAAAAAAFc/vyt2Tn28y48/s1600/ss33_450x213.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="151" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOLGYgUhX3I/AAAAAAAAAFc/vyt2Tn28y48/s320/ss33_450x213.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Jetzt brauchen wir nur die Darstellung des Textes anzupassen. Das erfolgt über die PathListBox. Der Wert für "Orientation" wird aus "Orient To Path" gesetzt. Die Schriftart und Größe werden wie üblich verändert. Über die Foreground-Eigenschaft erhält der Text eine etwas hellere Schriftfarbe. Und die "&lt;em&gt;Start&lt;/em&gt;"-Eigenschaft der PathListBox verändern wir so, dass der Text oben links anfängt. Im Ergebnis sollte der Text, hier "&lt;em&gt;I like round shaped ChildWindows&lt;/em&gt;", im ChildWindow folgendermaßen dargestellt sein:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOLGaTUmAoI/AAAAAAAAAFg/rWQTSniq5Vw/s1600/ss34_450x445.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOLGaTUmAoI/AAAAAAAAAFg/rWQTSniq5Vw/s320/ss34_450x445.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;F5 drücken, das ChildWindow aufrufen und fertig ist das vollständige ChildWindow.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOLGyQdlPPI/AAAAAAAAAFk/scSMIPnVQWs/s1600/ss35_450x445.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOLGyQdlPPI/AAAAAAAAAFk/scSMIPnVQWs/s320/ss35_450x445.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/NRCWSBS/S1/s1.html" style="height: 602px; width: 560px;"&gt;&lt;br /&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Das war's. Viel Spass damit.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;a href="http://silverlawone.de/silverlawblogde/NRCWSBS/S1/NonRectangularChildWindowStepByStep.zip"&gt;Vollständiger Quellcode für das hier entwickelte Beispielprojekt&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-3395934642005397984?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/3395934642005397984/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/how-to-erstellen-eines-nicht_16.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3395934642005397984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3395934642005397984'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/how-to-erstellen-eines-nicht_16.html' title='How To: Erstellen eines nicht rechteckigen ChildWindow - Teil 2'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Y29D3-feYio/TOLGGOEX2lI/AAAAAAAAAFE/SiT9l3f2qpQ/s72-c/ss27_450x488.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6344873480315592210</id><published>2010-11-16T14:17:00.005+01:00</published><updated>2010-11-19T08:38:03.592+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ChildWindow'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>How to: Erstellen eines nicht rechteckigen ChildWindow - Teil 1</title><content type='html'>Dieser Artikel beschreibt Schritt-für-Schritt, wie man ein nicht rechteckiges ChildWindow erstellt. Erstellt wird ein ringförmiges ChildWindow.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Als Vorgeschmack auf das, was wir in diesem Tutorial zusammenbauen wollen, gibt es hier schonmal einen Blick auf die fertige Beispiel-Anwendung:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/NRCWSBS/S1/s1.html" style="height: 602px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Ziemlich cool, oder?! Den Link für den Download des obigen Beispiel-Projekts findet Ihr am Ende von &lt;a href="http://silverlawone.blogspot.com/2010/11/how-to-erstellen-eines-nicht_16.html"&gt;Teil 2 dieses Tutorials&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 1 - Vorbereitungen&lt;/span&gt;&lt;br /&gt;In Expression Blend 4 wird ein neues Silverlight 4 Projekt erstellt. Der Oberfläche von MainPage.xaml wird ein Button hinzugefügt. Dieser Button dient später dazu, das ChildWindow aufzurufen.&lt;br /&gt;&lt;br /&gt;Dann wird dem Silverlight-Projekt durch Rechtklick auf das Projekt -&amp;gt; Neues Element hinzufügen ... -&amp;gt; ChildWindow ein ChildWindow hinzugefügt. Dieses ChildWindow erhält den Namen "RingChildWindow.xaml". Ein Klick auf Ok fügt dem Projekt das neue ChildWindow hinzu. Das ChildWindow erhält eine Größe von 400px x 400px.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt 2 - Styling der Vorlage&lt;/span&gt;&lt;br /&gt;In Expression Blend 4 wird jetzt das RingChildWindow zur Bearbeitung angezeigt. Im Objektbaum der Registerkarte "Objekte und Zeitachsen" wird mit einem Linksklick das ChildWindow selektiert. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ72pinIuI/AAAAAAAAADY/42i8rkFKzHo/s1600/ss1_477x196.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ72pinIuI/AAAAAAAAADY/42i8rkFKzHo/s320/ss1_477x196.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Mit einem Rechtklick auf das ChildWindow-Element im Objektbaum -&amp;gt; Vorlage bearbeiten -&amp;gt; Kopie bearbeiten ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ781S3RNI/AAAAAAAAADc/HVqd6GSNb9Q/s1600/ss2_477x469.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="469" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ781S3RNI/AAAAAAAAADc/HVqd6GSNb9Q/s320/ss2_477x469.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;gelangt man in das Dialogfenster "Resource "Style" erstellen. Der neue Style wird "RingChildWindowStyle" genannt. Der Style wird definiert in der Anwendung, also in der Datei App.xaml. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ8D83_ayI/AAAAAAAAADg/I9-f5TenCZI/s1600/ss3_477x379.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="379" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ8D83_ayI/AAAAAAAAADg/I9-f5TenCZI/s320/ss3_477x379.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ein Klick auf Ok und man gelangt sofort in der Vorlage des ChildWindow. Wir werfen einen Blick in den Objektbaum der Vorlage in der Registerkarte "Objekte und Zeitachsen". Dort werden die folgenden Elemente selektiert und gelöscht:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ8UctktdI/AAAAAAAAADk/305Fo-0cl5c/s1600/ss4_477x493.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="493" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ8UctktdI/AAAAAAAAADk/305Fo-0cl5c/s320/ss4_477x493.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dann wird das Element ContentRoot selektiert. In der Registerkarte "Objekte" -&amp;gt; Formen wird "Ring" selektiert und dem ContentRoot-Element mit einem Doppelklick auf "Ring" hinzugefügt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ8cOZdFjI/AAAAAAAAADo/2bDl19bl2r4/s1600/ss5_477x682.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="682" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ8cOZdFjI/AAAAAAAAADo/2bDl19bl2r4/s320/ss5_477x682.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Per Drag&amp;amp;Drop wird das neue Arc-Element direkt unter das ContentRoot platziert.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ8gcXunFI/AAAAAAAAADs/R1VpHpzp8lE/s1600/ss6_477x216.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ8gcXunFI/AAAAAAAAADs/R1VpHpzp8lE/s320/ss6_477x216.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die Fill-Eigenschaft des Arc-Elements wird an die Background-Eigenschaft der Vorlage gebunden:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ8gcXunFI/AAAAAAAAADs/R1VpHpzp8lE/s1600/ss6_477x216.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ8gcXunFI/AAAAAAAAADs/R1VpHpzp8lE/s320/ss6_477x216.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ8l0eOfQI/AAAAAAAAADw/pKcIQOBmINk/s1600/ss7_477x408.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="408" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ8l0eOfQI/AAAAAAAAADw/pKcIQOBmINk/s320/ss7_477x408.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Damit kann der Brush für den Fill später einfach über den Background des ChildWindow festgelegt werden.&lt;br /&gt;&lt;br /&gt;Die Eigenschaften HorizontalAlignment und VerticalAlignment des Arc-Elements werden jeweils auf Stretch gesetzt. Die Eigenschaften Width und Height werden beide auf "Automatisch" gesetzt. Der Eigenschaft "ArcThickness" wird auf den Wert 80 gesetzt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ8wdk4MiI/AAAAAAAAAD0/hzI3sKLKZ8w/s1600/ss8_477x387.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="387" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ8wdk4MiI/AAAAAAAAAD0/hzI3sKLKZ8w/s320/ss8_477x387.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Im Moment ist der Ring noch nicht sichtbar. Um das zu ändern, wird die Background-Eigenschaft für das erste und für das zweite Border-Element der Vorlage zurückgesetzt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ9pGkvxaI/AAAAAAAAAEA/S04ZiSVpk6E/s1600/ss9RES_477x460.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="460" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ9pGkvxaI/AAAAAAAAAEA/S04ZiSVpk6E/s320/ss9RES_477x460.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Außerdem wird für das Border-Steuerelement, das den ContentPresenter enthält, die Vorlagenbindung der Background-Eigenschaft zurückgesetzt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ9BARubFI/AAAAAAAAAD8/7SicRcloXQ0/s1600/ss10_477x522.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="522" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ9BARubFI/AAAAAAAAAD8/7SicRcloXQ0/s320/ss10_477x522.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Wir wechseln kurz mit einem Klick auf das Pfeilsymbol im Objektbaum der Vorlage zurück in das ChildWindow.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ9zNYHjRI/AAAAAAAAAEE/PkTw_zxvP94/s1600/ss11_477x166.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ9zNYHjRI/AAAAAAAAAEE/PkTw_zxvP94/s320/ss11_477x166.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dort erzeugen wir einen ansehnlichen Background für das Ring-Element.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ98L0bcZI/AAAAAAAAAEI/0WhUW68ivHc/s1600/ss12_477x523.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="523" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ98L0bcZI/AAAAAAAAAEI/0WhUW68ivHc/s320/ss12_477x523.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Für das weitere Vorgehen ist es sinnvoll, die beiden Button-Steuerelemente "Ok" und "Cancel" zu löschen. Die EventHandler für die beiden Buttons werden ebenfalls gelöscht. Dann wechseln wir wieder in die Vorlage.&lt;br /&gt;&lt;br /&gt;Jetzt soll der Chrome gestaltet werden. Der Chrome definiert bei einem rechteckigen ChildWindow die Fensterleiste. Standardmäßig ist der Chrome rechteckig. Da wir ein ringförmiges ChildWindow gestalten, soll auch der Chrome ringförmig sein.&lt;br /&gt;&lt;br /&gt;Der Chrome ist ein einfaches Border-Steuerelement. Es befindet sich in einem Grid-Steuerelement.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ-DsUae0I/AAAAAAAAAEM/GzTXK8LIyP4/s1600/ss13_477x367.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="367" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ-DsUae0I/AAAAAAAAAEM/GzTXK8LIyP4/s320/ss13_477x367.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Für dieses Grid-Steuerelement sind zwei Zeilen definiert. Ein Klick auf "RowDefinitions" zeigt, dass der Wert für die erste Zeile auf "1" und "Auto" gesetzt ist.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ-JLiHn3I/AAAAAAAAAEQ/cYy3dat1JbE/s1600/ss14_477x186.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ-JLiHn3I/AAAAAAAAAEQ/cYy3dat1JbE/s320/ss14_477x186.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Der Wert für die zweite Zeile ist auf "1" und "Star" gesetzt:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ-PdCoeCI/AAAAAAAAAEU/MwoHLAhpJxA/s1600/ss15_477x186.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ-PdCoeCI/AAAAAAAAAEU/MwoHLAhpJxA/s320/ss15_477x186.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Der Chrome hat die Zuweisung zur ersten Zeile, Row 0. Das bewirkt, dass die Zeile 1 (Row 0) automatisch ihre Größe entsprechend der Größe des Chrome anpaßt.&lt;br /&gt;&lt;br /&gt;Das Chrome ist wie gesagt ein einfaches Border-Steuerelement. Deswegen können wir dem Chrome ein anderes Steuerelement hinzufügen, das visuell unsere Fensterleiste darstellen wird. Wir selektieren das Chrome und fügen mit einem Doppelklick ein Ring-Element hinzu.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ-TY2wmaI/AAAAAAAAAEY/sShWlaWSXaQ/s1600/ss16_477x355.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="355" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ-TY2wmaI/AAAAAAAAAEY/sShWlaWSXaQ/s320/ss16_477x355.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Damit das soeben hinzugefügte Ring-Element ordentlich sichtbar wird, wird die Größe auf 80px x 80px gesetzt. Die Vorlage sieht jetzt so aus:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ-XgS-bLI/AAAAAAAAAEc/CEebuF1ODWI/s1600/ss17_477x472.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="472" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TOJ-XgS-bLI/AAAAAAAAAEc/CEebuF1ODWI/s320/ss17_477x472.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Die weiße Hintergrundfarbe kommt vom Chrome. Um das zu ändern, wird sowohl die Background-Eigenschaft als auch die BorderBrush-Eigenschaft des Chrome zurückgesetzt.&lt;br /&gt;&lt;br /&gt;Dann wird die HorizontalAlignment-Eigenschaft des Arc-Elements auf "Rechts" gesetzt. Als Background-Eigenschaft für das Arc-Element verwenden wir den Brush, den auch wir für den Hauptring verwendet haben. Jetzt sieht unsere Vorlage so aus:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ-gCbOcpI/AAAAAAAAAEg/OrBdKHU37ao/s1600/ss18_477x472.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="472" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ-gCbOcpI/AAAAAAAAAEg/OrBdKHU37ao/s320/ss18_477x472.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Schon ziemlich gut.&lt;br /&gt;&lt;br /&gt;Jetzt wollen wir, dass der Chrome einen anderen VisualState bekommt, wenn der Mauszeiger darüberbewegt wird. Dazu müssen wir ein paar VisualState für das Arc-Element erzeugen. Damit keine Konflikte zu den Zuständen des ChildWindow entstehen, verwenden wir einen kleinen Trick. Wir erzeugen aus dem Arc-Element, das im Chrome ist, ein UserControl. Dazu wird das Arc-Element selektiert. Dann erzeugen wir mit einem Rechtklick -&amp;gt; Benutzersteuerelement erstellen ... ein UserControl.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ-lAbwsvI/AAAAAAAAAEk/623P2PtzMrU/s1600/ss19_477x232.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ-lAbwsvI/AAAAAAAAAEk/623P2PtzMrU/s320/ss19_477x232.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dieses UserControl erhält den Namen "ChromeHeaderRingUserControl".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ-qpHRaBI/AAAAAAAAAEo/hejHh7P6fq4/s1600/ss20_477x232.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ-qpHRaBI/AAAAAAAAAEo/hejHh7P6fq4/s320/ss20_477x232.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ein Klick auf "ok" und das neue UserControl kann bearbeitet werden. In ChromeHeaderRingUserControl.xaml wechseln wir zur Registerkarte "Zustände". Wir selektieren das Arc-Element und kopieren es mit Strg+C, Strg+V. Das neue Arc-Element erhält den Namen "MouseOverVisual". Der Z-Index wird auf "1" gesetzt. Den Brush der Fill-Eigenschaft wird so verändert, dass er insgesamt etwas heller leuchtet. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ-wFeNKfI/AAAAAAAAAEs/4ZlOqNMHKwk/s1600/ss21_477x232.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ-wFeNKfI/AAAAAAAAAEs/4ZlOqNMHKwk/s320/ss21_477x232.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Der Wert für die Opacity wird auf "0" gesetzt.&lt;br /&gt;&lt;br /&gt;Jetzt werden insgesamt 2 VisualState hinzugefügt. Diese werden "normal" und "mouseOver" genannt. Die Übergangsdauer wird auf "0,4" gesetzt. Wir selektieren den VisualState "mouseOver" und setzen den Wert der Opacity auf "100".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ-5lKtcTI/AAAAAAAAAEw/xoLIva3ymYY/s1600/ss22_477x205.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOJ-5lKtcTI/AAAAAAAAAEw/xoLIva3ymYY/s320/ss22_477x205.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ--0XSHGI/AAAAAAAAAE0/7HE7grCwmiM/s1600/ss23_477x205.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ--0XSHGI/AAAAAAAAAE0/7HE7grCwmiM/s320/ss23_477x205.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Jetzt muss das Projekt neu erstellt werden, damit die Änderungen am UserControl in der Vorlage des ChildWindow sichtbar sind.&lt;br /&gt;&lt;br /&gt;Damit der Chrome, bzw. unser UserControl, einen anderen VisualState einnimmt, wenn man den Mauszeiger darüberbewegt, müssen wir kurz zu VisualStudio 2010 wechseln. Dort fügen wir in die CodeBehind-Datei des UserControl zwei EventHandler hinzu. Einen für MouseEnter und einen weiteren für MouseLeave.&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Partial&lt;/span&gt; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ChromeHeaderRingUserControl&lt;/span&gt; &lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UserControl&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;' Für das Initialisieren der Variablen erforderlich&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent()&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; ChromeHeaderRingUserControl_MouseEnter(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.MouseEnter&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;VisualStateManager&lt;/span&gt;.GoToState(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"mouseOver"&lt;/span&gt;, &lt;span style="color: blue;"&gt;True&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; ChromeHeaderRingUserControl_MouseLeave(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;,&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.Windows.Input.&lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.MouseLeave&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;VisualStateManager&lt;/span&gt;.GoToState(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"normal"&lt;/span&gt;, &lt;span style="color: blue;"&gt;True&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Unsere Vorlage für das ChildWindow ist jetzt soweit hergerichtet, dass das ChildWindow durch Darg&amp;amp;Drop auf den Chrome bewegt werden kann. Der Aufruf des ChildWindow erfolgt über den Button in MainPage.xaml. Wie das geht, brauche ich nicht zu beschreiben. Bevor wir das ChildWindow das erste mal aufrufen, wird der Wert für den BorderBrush des ChildWindow (nicht der Wert in der Vorlage) zurückgesetzt. Andernfalls wäre das visuelle Bild gestört.&lt;br /&gt;&lt;br /&gt;F5 drücken und dann den Button klicken und das ChildWindow erscheint. Es kann durch Drag&amp;amp;Drop auf den Chrome bewegt werden. Aber hey, es ist kein Button für das Schließen vorhanden ...&lt;br /&gt;&lt;br /&gt;Um einen Button für das Schließen hinzuzufügen, gehen wir erneut zurück in die Vorlage unseres ChildWindow. Im Objektbaum der Vorlage selektieren wir das Grid-Element.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ_fZhhk1I/AAAAAAAAAE4/qU8n8PW5zUw/s1600/ss24_477x174.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOJ_fZhhk1I/AAAAAAAAAE4/qU8n8PW5zUw/s320/ss24_477x174.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dann fügen wir mit einem Doppelklick dem selektierten Grid einen Button hinzu. Der Wert für das HorizontalAlignment wird auf "Rechts" gesetzt. Der Wert für das VerticalAlignment wird auf "Top" gesetzt. Der Button muss jetzt natürlich einen Style erhalten, der ebenfalls rund ist. Wie man das macht, beschreibe ich hier nicht. Ich nehme als Resource für einen runden Button-Style einen Style, den ich vorher entworfen habe. Das ist der RoundButtonStyle. Den Quellcode findet Ihr als Resource im Download. Die Farben passen zwar nicht zum Beispiel, aber er ist halt rund.&lt;br /&gt;&lt;br /&gt;Der RoundButtonStyle wird dem Button hinzugefügt. Als Wert für die Content-Eigenschaft des Button wird ein kleines "x" eingegeben. Die Foreground-Eigenschaft erhält den selben Farbwert, wie der Background des Button. Der RoundButtonStyle ist so gestaltet, dass erst beim MouseOver VisualState die Farbe des kleinen "x" zu "Weiß" wechselt.&lt;br /&gt;&lt;br /&gt;Etwas vergrößert sieht unsere ChildWindow-Vorlage jetzt so aus:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ_z5XagpI/AAAAAAAAAE8/FPeG3sE1oX0/s1600/ss25_477x465.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="465" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TOJ_z5XagpI/AAAAAAAAAE8/FPeG3sE1oX0/s320/ss25_477x465.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Damit die Vorlage des ChildWindow den hinzugefügten Button als Teil der Vorlage erkennt, muss der Button als Teil der Vorlage erstellt werden. Dafür wird der Button selektiert, Rechtklick -&amp;gt; Teil von ChildWindow erstellen -&amp;gt; CloseButton selektieren:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TOKACmknpVI/AAAAAAAAAFA/HtDWA-UIUeY/s1600/ss26_477x164.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TOKACmknpVI/AAAAAAAAAFA/HtDWA-UIUeY/s320/ss26_477x164.png" width="477" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;F5 Drücken, und die Gestaltung des ChildWindow mit einer Ringform ist fertiggestellt.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://silverlawone.blogspot.com/2010/11/how-to-erstellen-eines-nicht_16.html"&gt;&lt;strong&gt;Teil 2&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;beschreibe ich, wie man diesen Style um eine ringförmige Anordnung des Content ergänzt.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;a href="http://gallery.expression.microsoft.com/en-us/SLANRCWSRSL4?SRC=Home"&gt;Beispiel-Projekt mit vollständigem Quellcode&lt;/a&gt;. (Dies ist ein &lt;strong&gt;weiteres&lt;/strong&gt; Beispiel, das in der Expression Gallery veröffentlicht ist.)&lt;br /&gt;&lt;br /&gt;Viel Spass!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6344873480315592210?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6344873480315592210/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/how-to-erstellen-eines-nicht.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6344873480315592210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6344873480315592210'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/how-to-erstellen-eines-nicht.html' title='How to: Erstellen eines nicht rechteckigen ChildWindow - Teil 1'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Y29D3-feYio/TOJ72pinIuI/AAAAAAAAADY/42i8rkFKzHo/s72-c/ss1_477x196.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-3792897548647889981</id><published>2010-11-16T09:48:00.005+01:00</published><updated>2010-11-16T09:55:55.540+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ChildWindow'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Nicht rechteckiges ChildWindow Styling</title><content type='html'>Gestern abend überlegte ich, wie man die Form eines ChildWindow etwas interessanter und individueller gestalten kann. Es wäre doch schön, ein ChildWindow zu gestalten das nicht rechteckig ist, sondern rund, dreieckig oder&amp;nbsp;eine Herzform hat. Herausgekommen sind zwei neue Beispiele für die Expression Gallery. Das erste Beispiel ist ein &lt;a href="http://gallery.expression.microsoft.com/en-us/SLTCWSSL4?SRC=Home"&gt;dreieckiges ChildWindow&lt;/a&gt;. Es war noch etwas experimentell. Beim zweiten Beispiel, einem &lt;a href="http://gallery.expression.microsoft.com/en-us/SLANRCWSRSL4?SRC=Home"&gt;ringförmigen ChildWindow&lt;/a&gt;, wußte ich dann, wie man ein nicht rechteckiges ChildWindow herstellt. Es war extrem einfach und ging sehr schnell, es&amp;nbsp;zu gestalten. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Hier sind zwei ScreenShot von den beiden Beispielen, die jeweils in der Expression Gallery zum Download zur Verfügung stehen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TOJELB5RRnI/AAAAAAAAADU/Cfu-rcWn79o/s1600/triangleScreenshot471x541.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="541" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TOJELB5RRnI/AAAAAAAAADU/Cfu-rcWn79o/s320/triangleScreenshot471x541.png" width="471" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;Dreieckiges ChildWindow&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TOJDbOe2KEI/AAAAAAAAADQ/UmNAEMVy6sw/s1600/screenshot471x541.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="541" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TOJDbOe2KEI/AAAAAAAAADQ/UmNAEMVy6sw/s400/screenshot471x541.png" width="471" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;Ringförmiges ChildWindow&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Ich werde in den nächsten Tagen hier im Blog einen Artikel schreiben, in dem ich darstelle, wie man Schritt-für-Schritt vorgehen muss, um ein nicht rechteckiges ChildWindow zu erstellen. Ihr werdet erstaunt sein, wie einfach es ist. Das ringförmige ChildWindow war in 1 Stunde fertig ...&lt;br /&gt;&lt;br /&gt;Viel Spaß vorerst mit den beiden Beispielen für nicht rechteckige ChildWindows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-3792897548647889981?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/3792897548647889981/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/nicht-rechteckiges-childwindow-styling.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3792897548647889981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3792897548647889981'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/nicht-rechteckiges-childwindow-styling.html' title='Nicht rechteckiges ChildWindow Styling'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Y29D3-feYio/TOJELB5RRnI/AAAAAAAAADU/Cfu-rcWn79o/s72-c/triangleScreenshot471x541.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-5147610287799117937</id><published>2010-11-12T19:14:00.010+01:00</published><updated>2010-12-05T12:01:29.530+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RichTextBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Add-In'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='RichTextBox.Xaml Builder'/><title type='text'>RichTextBox.Xaml Builder Add-In Version 1.0.0.3 für Expression Blend 4 - Neu mit automatischer Schriftgrößenerkennung</title><content type='html'>Eine neue Version des RichTextBox.Xaml Builder Add-In für Expression Blend 4 steht zum Download in der Expression Gallery bereit. Dies ist Version 1.0.0.3.&lt;br /&gt;&lt;br /&gt;Die neue Version bietet eine &lt;strong&gt;automatische Schriftgrößenerkennung&lt;/strong&gt; bei der Konvertierung von Rich Text für die Darstellung in einer Silverlight 4-Anwendung. &lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Visuell: Vom MS Word Dokument zur Darstellung in der Silverlight 4 RichTextBox&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die unten dargestellten Screenshots verdeutlichen die Konvertierung visuell vom Ursprung bis zum Ergebnis. Also vom ursprünglichen Inhalt eines Microsoft Word Dokuments, über die Konvertierungsansicht im Add-In in Expression Blend 4 bis zum Ergebnis in einer Silverlight 4-Anwendung:&lt;br /&gt;&lt;br /&gt;﻿﻿﻿﻿﻿ &lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TN2DRU9i1JI/AAAAAAAAADM/l2ZThtm6pIE/s1600/word540x440.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="440" px="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TN2DRU9i1JI/AAAAAAAAADM/l2ZThtm6pIE/s640/word540x440.png" width="540" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="color: #990000;"&gt;Screenshot von dem ursprünglichen Microsoft Word Document&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;﻿﻿﻿﻿﻿ &lt;br /&gt;&lt;br /&gt;﻿ &lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TN2DFk4KX-I/AAAAAAAAADI/nzgvFVyBDVI/s1600/blend540x632.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="640" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TN2DFk4KX-I/AAAAAAAAADI/nzgvFVyBDVI/s640/blend540x632.png" width="545" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="color: #990000;"&gt;Screenshot des Ergebnisses der Konvertierung im Add-In&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;﻿ &lt;br /&gt;Und so sieht das Ergebnis in einer Silverlight 4-Anwendung aus:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/RBXBV1003/S1/s1.html" style="height: 602px; width: 560px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Warum sollte man das Add-In verwenden?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das Add-In liefert im Ergebnis der Konvertierung eine .xml-Datei mit den Text- und Formatinformationen des konvertierten Textes. Dabei hat die .xml-Datei ein Format, das von der Xaml-Eigenschaft einer regulären Silverlight 4 RichTextBox als Xaml verstanden wird. Um den in der .xml-Datei enthaltenen Text einer RichTextBox zuzuweisen braucht man nur eine einzige Zeile Quellcode:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;rbDemo.Xaml = &lt;span style="color: #2b91af;"&gt;XElement&lt;/span&gt;.Load(&lt;span style="color: #a31515;"&gt;"richsource.xml"&lt;/span&gt;).ToString(&lt;span style="color: #2b91af;"&gt;SaveOptions&lt;/span&gt;.DisableFormatting)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Eine Zuweisung des Inhalts für eine RichTextBox über die Xaml-Eigenschaft des Steuerelements bietet den Vorteil, dass der Text einer einzelnen RichTextBox zur Laufzeit dynamisch verändert werden kann. Der Vorteil einer Zuweisung mithilfe einer .xml-Datei besteht darin, dass der Text nicht erst umständlich im Quellcode erzeugt werden muss. Der &lt;strong&gt;Programmierungsaufwand&lt;/strong&gt; ist dadurch &lt;strong&gt;extrem reduziert&lt;/strong&gt;. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Der Workflow in einer Line Of Business-Anwendung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mit dem RichTextBox.Xaml Builder Add-In ist der Workflow für die Konvertierung von existierendem Rich Text, beispielsweise aus einem Word Dokument, zur Darstellung in einer Silverlight 4 RichTextBox extrem schlank.&lt;br /&gt;&lt;br /&gt;Beispielhaft sei folgendes Szenario angenommen: Es soll eine Line Of Business-Anwendung in Silverlight 4 realisiert werden. Bestandteil der Anwendung sollen u.a. 50 unterschiedliche Textinhalte sein, die alle in RichTextBox-Steuerelementen dargestellt werden sollen. Die Textinhalte liegen bereits als Microsoft Word Dokumente vor. Jedes Word Dokument ist konvertiert mit unterschiedlichen Schriftgrößen, Schriftschnitten, Schriftfarben etc. Und jedes Word Dokument hat mindestens 10000 Zeichen.&lt;br /&gt;&lt;br /&gt;Mit dem Add-In wird jedes Word Dokument in eine .xml-Datei umgewandelt. Dabei reduziert sich die Konvertierung auf den folgenden Ablauf:&lt;br /&gt;&lt;br /&gt;1. Word Dokument öffnen und den Text mit Strg+A, Strg+C in die Zwischenablage kopieren.&lt;br /&gt;&lt;br /&gt;2. Wechseln zu Expression Blend 4 und im Add-In auf „Convert“ klicken.&lt;br /&gt;&lt;br /&gt;3. Dann auf „Save“ klicken und die Datei lokal in einem Ordner speichern.&lt;br /&gt;&lt;br /&gt;Diesen Vorgang für alle Word Dokumente wiederholen.&lt;br /&gt;&lt;br /&gt;4. Wechseln zu Visual Studio 2010 und im Silverlight-Projekt einen neuen Ordner „documents“ einrichten. Dann mit Rechtklick auf den Ordner -&amp;gt; Hinzufügen -&amp;gt; Vorhandenes Element hinzufügen zum lokalen Ordner mit den .xml-Dateien navigieren. Strg+A, um alle .xml-Dateien zu selektieren und hinzufügen.&lt;br /&gt;&lt;br /&gt;5. In Visual Studio 2010 im Projekt-Explorer den Ordner „documents“ öffnen und alle vorhandenen .xml-Dateien markieren. &lt;br /&gt;&lt;br /&gt;6. Um die Dateien beispielsweise vollständig in die .xap-Datei aufzunehmen wählt man als build-Vorgang für alle markierten .xml-Dateien „Kopieren wenn neuer“.&lt;br /&gt;&lt;br /&gt;Fertig. Alle Word Dokumente liegen nun in Gestalt der .xml-Dateien mit den Formatinformationen vor und können der Xaml-Eigenschaft einer RichTextBox mit minimalem Programmieraufwand dynamisch zugewiesen werden. &lt;br /&gt;&lt;br /&gt;Das ist richtig cool.&lt;br /&gt;&lt;br /&gt;Den &lt;a href="http://gallery.expression.microsoft.com/en-us/RTBXBAB41003SL?SRC=Home"&gt;Download der Version 1.0.0.3 gibt in der Expression Gallery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Viel Spass mit der neuen Version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-5147610287799117937?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/5147610287799117937/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/richtextboxxaml-builder-add-in-version.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5147610287799117937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5147610287799117937'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/richtextboxxaml-builder-add-in-version.html' title='RichTextBox.Xaml Builder Add-In Version 1.0.0.3 für Expression Blend 4 - Neu mit automatischer Schriftgrößenerkennung'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Y29D3-feYio/TN2DRU9i1JI/AAAAAAAAADM/l2ZThtm6pIE/s72-c/word540x440.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-4234257594152856988</id><published>2010-11-10T17:25:00.005+01:00</published><updated>2010-11-11T09:02:59.285+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TextBox'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Clipboard'/><title type='text'>Quick Tipp: Text in der Zwischenablage vor dem Einfügen mit Strg+V modifizieren</title><content type='html'>Dieser Quick Tipp beschreibt, wie Text aus der Zwischenablage modifiziert werden kann, bevor der Nutzer den Text mit Strg+V in eine TextBox einfügt.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Quellcode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/MTCB/S1/s1.html" style="height: 688px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Erläuterungen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Im &lt;strong&gt;KeyDown&lt;/strong&gt;-Ereignis einer TextBox wird geprüft, ob der Nutzer die Tastenkombination Strg+V gedrückt hat. Wenn das der Fall ist, wird der Text aus der Zwischenablage mit der Methode Clipboard.GetText() einer privaten Variablen zugewiesen. Es folgt eine Überprüfung, ob der Text in der Zwischenablage ein leerer String ist. Wenn das nicht der Fall ist, dann erfolgt eine Modifizierung des aus der Zwischenablage abgefangenen Textes. Im obigen Beispiel wird eine Teilzeichenfolge gebildet. Schließlich wird der modifizierte Text mit der Methode SetText() der Zwischenablage zugewiesen.&lt;br /&gt;&lt;br /&gt;Wenn der Nutzer die Tastenkombination losläßt, besteht der Text in der Zwischenablage nun aus dem modifizierten Text und dieser Text wird eingefügt.&lt;br /&gt;&lt;br /&gt;Im &lt;strong&gt;KeyUp&lt;/strong&gt;-Ereignis wird nochmal geprüft, ob die Tastenkombination Strg+V gedrückt wurde. Gegebenenfalls wird die Zwischenablage durch Zuweisung von Clipboard.SetText(String.Empty) geleert. &lt;br /&gt;Das war's.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-4234257594152856988?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/4234257594152856988/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/quick-tipp-text-in-der-zwischenablage.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/4234257594152856988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/4234257594152856988'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/quick-tipp-text-in-der-zwischenablage.html' title='Quick Tipp: Text in der Zwischenablage vor dem Einfügen mit Strg+V modifizieren'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6196851011862702209</id><published>2010-11-04T09:53:00.003+01:00</published><updated>2010-11-04T09:57:08.517+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ListBoxItem'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Quick Tipp: MouseOver VisualState für die gesamte Oberfläche eines ListBoxItem</title><content type='html'>Das Template eines ListBoxItems kennt den VisualState MouseOver. Wenn man den Mauszeiger über ein ListBoxItem bewegt, wird der VisualState MouseOver aber standardmäßig nur dann aktiviert, wenn der Mauszeiger über den sichtbaren Inhalt bewegt wird. Der sichtbare Inhalt wird durch den ContentPresenter des Templates definiert. Das ListBoxItem selbst ist aber in der Regel breiter, als der ContentPresenter bzw. als der Inhalt des ListBoxItems. Dieses Verhalten kann unerwünscht sein. &lt;br /&gt;&lt;br /&gt;Nachfolgend beschreibe ich, was man machen muss, damit der VisualState MouseOver immer aktiviert wird, wenn der Mauszeiger über irgendeinen Punkt des ListBoxItems bewegt wird.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Es wird vorausgesetzt, dass irgendwo auf der Oberfläche eines Silverlight 4-Projekts eine ListBox mit mindestens einem ListBoxItem vorhanden ist. Dieses ListBoxItem wird mit einem Linksklick aktiviert. Als nächstes: Rechtsklick -&amp;gt; Vorlage bearbeiten -&amp;gt; Kopie bearbeiten, im Dialogfenster dem neuen Style einen Namen geben, bestätigen&amp;nbsp;und man landet in der Vorlage des ListBoxItems.&lt;br /&gt;&lt;br /&gt;Dann wird die Registerkarte "Zustände" selektiert. Für das weitere Vorgehen bitte darauf achten, dass "Basis" aktiviert ist:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TNJyCYcbt8I/AAAAAAAAAC4/LsAONS8uuFs/s1600/ss1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="130" px="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TNJyCYcbt8I/AAAAAAAAAC4/LsAONS8uuFs/s400/ss1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Im Objektbaum der Vorlage das Element "fillColor" selektieren:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TNJyW9XrsoI/AAAAAAAAAC8/BfX9bNYAwYs/s1600/ss2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TNJyW9XrsoI/AAAAAAAAAC8/BfX9bNYAwYs/s400/ss2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Dieses Element ist bewirkt visuell die Veränderung im VisualState MouseOver.&lt;br /&gt;&lt;br /&gt;Wenn man jetzt im Eigenschaftenpanel einen Blick auf die Eigenschaft "IsHitTestVisible" dieses Elements wirft, so ist diese Eigenschaft standardmäßig nicht aktiviert:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y29D3-feYio/TNJy6-DJOmI/AAAAAAAAADA/ovO7olVUWKA/s1600/ss3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" px="true" src="http://1.bp.blogspot.com/_Y29D3-feYio/TNJy6-DJOmI/AAAAAAAAADA/ovO7olVUWKA/s400/ss3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Um den MouseOver VisualState für das gesamte ListBoxItem einzurichten, wird die Eigenschaft "IsHitTestVisible"&amp;nbsp;aktiviert:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TNJzVtLDdWI/AAAAAAAAADE/lXMiMQe0N5Q/s1600/ss4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" px="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TNJzVtLDdWI/AAAAAAAAADE/lXMiMQe0N5Q/s400/ss4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;... und zack ... fertig ist diese Lösung.&lt;br /&gt;&lt;br /&gt;Viel Spass damit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6196851011862702209?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6196851011862702209/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/quick-tipp-mouseover-visualstate-fur.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6196851011862702209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6196851011862702209'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/quick-tipp-mouseover-visualstate-fur.html' title='Quick Tipp: MouseOver VisualState für die gesamte Oberfläche eines ListBoxItem'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Y29D3-feYio/TNJyCYcbt8I/AAAAAAAAAC4/LsAONS8uuFs/s72-c/ss1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-4397015718542420711</id><published>2010-11-04T09:14:00.001+01:00</published><updated>2010-11-11T12:10:08.113+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ListBoxItem'/><category scheme='http://www.blogger.com/atom/ns#' term='Style'/><category scheme='http://www.blogger.com/atom/ns#' term='Accordion'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Neuer Accordion Style mit einem passenden ListBoxItem Style</title><content type='html'>Ich habe einen &lt;a href="http://gallery.expression.microsoft.com/en-us/SLAAALBISSL4"&gt;weiteren Accordion Style (Silverlight 4)&lt;/a&gt; in der Expression Gallery veröffentlicht. Bestandteil des Downloads ist auch ein ListBoxItem Style, der sich in das Design des Accordion Style&amp;nbsp;einfügt.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/AAALBIS/S1/s1.html" style="height: 602px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Den &lt;a href="http://gallery.expression.microsoft.com/en-us/SLAAALBISSL4"&gt;Download&lt;/a&gt;, der den vollständigen&amp;nbsp;Quellcode enthält,&amp;nbsp;findet Ihr in der Expression Gallery.&lt;br /&gt;&lt;br /&gt;Beim ListBoxItem ist es übrigens standardmäßig&amp;nbsp;so, dass der VisualState MouseOver nur dann aktiviert wird, wenn der Mauszeiger über den Content bewegt wird. Das ist nicht immer erwünscht. Ein &lt;a href="http://silverlawone.blogspot.com/2010/11/quick-tipp-mouseover-visualstate-fur.html"&gt;weiterer Artikel&lt;/a&gt; hier im Blog beschreibt, wie man die Vorlage eines ListBoxItems anpassen muss, damit der VisualState MouseOver immer aktiviert wird, unabhängig davon, wo der Mauszeiger über das ListBoxItem bewegt wird. &lt;br /&gt;&lt;br /&gt;Viel Spass damit!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-4397015718542420711?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/4397015718542420711/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/neuer-accordion-style-mit-einem.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/4397015718542420711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/4397015718542420711'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/neuer-accordion-style-mit-einem.html' title='Neuer Accordion Style mit einem passenden ListBoxItem Style'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-3424013801354516849</id><published>2010-11-03T10:19:00.005+01:00</published><updated>2010-11-03T10:55:16.746+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Storyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='How To'/><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Quick-Tipp: Einfache direkte Storyboard-Verkettung mit extrem reduziertem Quellcode</title><content type='html'>Bei der Arbeit an meinem aktuellen Projekt hatte ich eine Idee, wie man mehrere Storyboard mit weniger Quellcode miteinander verketten kann. Die vorgestellte Technik reduziert den xaml-Quellcode im vorgestellten Beispiel um fast 50%!&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Angenommen, es gibt mehrere Storyboards, die in einer bestimmten Reihenfolge nacheinander gestartet werden sollen. Die übliche Herangehensweise ist, eine gesonderte Methode zu schreiben, in dem das zweite Storyboard gestartet wird, wobei an das Completed()-Ereignis des ersten Storyboard ein Delegat geknüpft wird, der auf die Methode zeigt, die das zweite Storyboard startet, usw.:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/SBCL/S1/s1.html" style="height: 592px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Bei einer großen Anzahl an Storyboards führt das schnell zu ziemlich viel Quellcode, der das Projekt aufbläht.&lt;br /&gt;&lt;br /&gt;Man kann den Quellcode aber reduzieren, indem man als Delegaten für das Completed()-Ereignis einfach unmittelbar die Methode Storyboard.Begin() anhängt:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/SBCL/S2/s2.html" style="height: 392px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Nun mag man sich fragen, wozu soll das gut sein? Wenn ohnehin kein separater Quellcode beim Beenden eines Storyboard aufgerufen wird, ist es doch viel sinnvoller, die beiden Storyboards gleich als ein einziges Storyboard zu definieren und als einziges Storyboard zu starten. Stimmt, aber nicht ganz. Denn sinnvoll ist die hier vorgestellte einfache Verkettung mehrerer Storyboards z.B. in der&amp;nbsp;folgenden Situation:&lt;br /&gt;&lt;br /&gt;Das erste Storyboard soll zwei oder drei mal wiederholt werden bevor das zweite aufgerufen wird. Das zweite Storyboard soll auch zwei mal wiederholt werden, usw. Der Sinn der einfachen Verkettung wird deutlich: Die Animation jedes der Storyboards muss nur einmal im xaml definiert werden, wobei im xaml über den Wert des Attributs RepeatBehavior die Anzahl der Wiederholungen gesetzt wird. Wenn&amp;nbsp;man demgegenüber ein einziges&amp;nbsp;Storyboard definieren würde, müßte man die selbe Animation mit der Anzahl der benötigten Wiederholungen mehrfach im xaml definieren. Das würde viel unnötigen Quellcode produzieren. Bei der einfachen direkten Verkettung der Storyboards reduziert sich also der xaml-Quellcode und zugleich der Codebehind. Das gilt vor allem dann, wenn zu den Animationen aufwändige Easing-Funktionen hinzukommen.&lt;br /&gt;&lt;br /&gt;Der folgende Quellcode verdeutlicht den Vorteil und die Reduzierung des xaml-Quellcodes. Die Variante mit nur einem Storyboard (sbSingle) hat insgesamt 106 Zeilen xaml-Quellcode. Die Variante mit der direkten und einfachen Verkettung von hier drei Storyboards braucht demgegenüber nur 58 Zeilen xaml-Quellcode. &lt;strong&gt;Das ist eine Reduzierung des xaml-Quellcodes um fast 50%!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/SBCL/S3/s3.html" style="height: 724px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/SBCL/S4/s4.html" style="height: 402px; width: 500px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Den &lt;a href="http://gallery.expression.microsoft.com/en-us/SLSDSCSL4"&gt;Download des obigen Beispielprojekt findet Ihr in der Expression Gallery&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-3424013801354516849?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/3424013801354516849/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/11/quick-tipp-einfache-direkte-storyboard.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3424013801354516849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/3424013801354516849'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/11/quick-tipp-einfache-direkte-storyboard.html' title='Quick-Tipp: Einfache direkte Storyboard-Verkettung mit extrem reduziertem Quellcode'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-5109501506610116165</id><published>2010-10-28T10:04:00.002+02:00</published><updated>2010-10-28T10:07:04.899+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pivot'/><title type='text'>Schon gewußt? MSDN Magazin Inhalte mit Silverlight PivotViewer finden</title><content type='html'>Das MSDN Magazin ist eine ergiebige Wissensquelle für Entwickler. Das Auffinden von speziellen Inhalten wird seit einiger Zeit dadurch erleichtert, dass die Inhalte aller Artikel mithilfe eines Silverlight PivotViewers gefiltert werden können. Ein Klick auf "Launch Pivot" und alle Ausgaben des MSDN Magazins können mithilfe eines Silverlight PivotViewers gezielt nach dem gesuchten Inhalten gefiltert werden.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/default.aspx" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="258" nx="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TMktW25RuoI/AAAAAAAAAC0/nvKswZDqatI/s400/MSDNMagPivot.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Klick das Bild, um zum englischsprachigen MSDN Magain zu gelangen&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Leider gibt es dieses hilfreiche Feature bislang nur auf der englischen Seite des MSDN Magazins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-5109501506610116165?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/5109501506610116165/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/10/schon-gewut-msdn-magazin-inhalte-mit.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5109501506610116165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/5109501506610116165'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/10/schon-gewut-msdn-magazin-inhalte-mit.html' title='Schon gewußt? MSDN Magazin Inhalte mit Silverlight PivotViewer finden'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Y29D3-feYio/TMktW25RuoI/AAAAAAAAAC0/nvKswZDqatI/s72-c/MSDNMagPivot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6636987624195547942</id><published>2010-10-22T16:48:00.003+02:00</published><updated>2010-10-22T17:02:25.753+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Add-In'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Untersuchung über das Hinzufügen einer ResourceDictionary.xaml Datei zu einem Silverlight 4 Projekt in einem Expression Blend 4 Add-In</title><content type='html'>Die in diesem Artikel vorgestellte Lösung zeigt, dass es grundsätzlich möglich ist, eine ResourceDictionary.xaml-Datei durch ein Add-In für Expression Blend 4 einem Silverlight 4-Entwicklungsprojekt hinzuzufügen. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://geekswithblogs.net/tkokke/Default.aspx"&gt;Timmy Kokke&lt;/a&gt; hat kürzlich ein neues interessantes Add-In für Expression Blend 4 veröffentlicht. Das ist der &lt;a href="http://geekswithblogs.net/tkokke/archive/2010/10/19/gradient-importer-for-expression-blend.aspx"&gt;Gradient Importer For Expresson Blend&lt;/a&gt;. In dem &lt;a href="http://geekswithblogs.net/tkokke/archive/2010/10/19/gradient-importer-for-expression-blend.aspx"&gt;begleitenden Blog-Artikel&lt;/a&gt; stellt er die Frage in den Raum, ob es überhaupt möglich ist, in einer Expression Blend 4-Erweiterung für ein Projekt, das in Expression Blend bearbeitet wird,&amp;nbsp;einen neuen Resourceneintrag durch den Quellcode des Add-Ins hinzuzufügen. Timmy Kokke löst das Problem in seinem Add-In durch eine Übergangslösung.&amp;nbsp;Sein Add-In erzeugt das Xaml einer Resource und stellt es dem Nutzer in einer RichTextBox zur Verfügung. Der Nutzer kann den xaml-Quellcode dann durch copy and paste an die gewünschte Stelle in eine Projekt-Datei einfügen.&lt;br /&gt;&lt;br /&gt;Die Frage, die Timmy Kokke aufgeworfen hat, ist sehr interessant. Ich habe mir überlegt, dass es schon ein gewisser Fortschritt wäre, wenn man Resourcen, die durch ein Add-In erzeugt werden, einem Entwicklungsprojekt über eine neue ResourceDictionary.xaml-Datei, die dem Entwicklungsprojekt hinzugefügt wird, bereitstellen könnte. Denn Aufgabe eines Resourcenverzeichnisses ist&amp;nbsp;die zentrale Verwaltung&amp;nbsp;von anwendungsweiten Resourcen. Der vielleicht größte Vorteil dieses zentralen Lösungsansatzes besteht darin, dass der Entwickler einer Blend-Erweiterung nicht alle denkbaren Varianten des Einbettens von Resourcen abdecken muss.&lt;br /&gt;&lt;br /&gt;Ich habe ein paar Untersuchungen darüber angestellt, ob sowas möglich ist und wie das gehen könnte. Das positive Zwischenergebnis meiner Untersuchungen möchte ich hier kurz vorstellen. Die Lösung ist noch nicht endgültig. Sie löst auch nicht das von Timmy Kokke angesprochene Problem. Aber sie zeigt, dass es &lt;strong&gt;grundsätzlich möglich ist&lt;/strong&gt;, eine ResourceDictionary.xaml-Datei durch ein Add-In einem geöffneten Entwicklungsprojekt hinzuzufügen. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Beispiel-Add-In&lt;/span&gt;&lt;br /&gt;Das hier vorgestellte Beispiel-Add-In&amp;nbsp;fügt einem neuen Silverlight 4-Projekt direkt beim Erzeugen in Expression Blend 4 eine neue ResourceDictionary.xaml-Datei hinzu. Das ist die Projekt-Datei TestResourceDictionary.xaml.&lt;br /&gt;&lt;br /&gt;Bitte beachtet, dass es sich nur um ein Demonstration des Möglichen handelt. Der Quellcode ist deswegen nicht optimal. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Grundsätzliche Vorgehensweise&lt;/span&gt;&lt;br /&gt;Über die Schnittstelle &lt;strong&gt;IProjectManager&lt;/strong&gt; hängen wir uns an das ProjectOpened()-Ereignis heran. Dieses Ereignis feuert, wenn ein neues Projekt geöffnet wird. In einem anderen Artikel habe ich beschrieben, &lt;a href="http://silverlawone.blogspot.com/2010/10/sichtbarkeit-von-einer-expression-blend.html"&gt;wie man in einer Expression Blend-Erweiterung den Projekttyp feststellen kann&lt;/a&gt;. Um den Quellcode auf das Wesentliche zu beschränken, geht das Beispiel-Add-In einfach davon aus, dass ein Silverlight-basiertes Projekt geöffnet wird. Dem ProjectOpened()-Ereignis wird also ein Delegat hinzugefügt, der auf die Routine ASilverlightProjectOpened() zeigt. Das Ereignis ProjectOpened() kennt zwei Parameter. Einer dieser Parameter ist vom Typ Microsoft.Expression.Project.&lt;strong&gt;ProjectEventArgs&lt;/strong&gt;. Über diesen Parameter wird auf das neu erzeugte Silverlight 4-Projekt zugegriffen und das Projekt wird der Variablen "cp" zugewiesen. Die Variable cp ist vom Typ &lt;strong&gt;IProject&lt;/strong&gt;. Die Schnittstelle IProject kennt die öffentliche Methode &lt;strong&gt;AddItem()&lt;/strong&gt;. Diese Methode wird genutzt, um dem Projekt die Datei TestResourceDictionary.xaml als ProjetItem hinzuzufügen.&lt;br /&gt;&lt;br /&gt;Die Methode IProject.AddItem() erwartet einen Parameter vom Typ Microsoft.Expression.Project.&lt;strong&gt;DocumentCreationInfo&lt;/strong&gt;. Eine Variable diesen Typs wird erzeugt und schließlich der Methode IProject.AddItem() übergeben.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Quellcode im Detail&lt;/span&gt;&lt;br /&gt;Nachfolgend findet Ihr den Quellcode der Routine &lt;strong&gt;ASilverlightProjectOpened()&lt;/strong&gt; und der Routine &lt;strong&gt;CreateResourceDictionaryFile()&lt;/strong&gt;. Der vollständige Quellcode kann über den Link am Ende dieses Artikels heruntergeladen werden.&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #c3cacc; color: black; font-family: Courier New; font-size: 8pt;"&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; ASilverlightProjectOpened(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Object&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ProjectEventArgs&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; cp &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IProject&lt;/span&gt; = e.Project&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; resourceDictionaryCreationInfo &lt;span style="color: blue;"&gt;As&lt;/span&gt; Microsoft.Expression.Project.&lt;span style="color: #2b91af;"&gt;DocumentCreationInfo&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; resourceDictionaryCreationInfo.CreationOptions = &lt;span style="color: #2b91af;"&gt;CreationOptions&lt;/span&gt;.AlwaysUseDefaultBuildTask&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; resourceDictionaryCreationInfo.DocumentType =&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;CType&lt;/span&gt;(servicesPresenter.GetService(&lt;span style="color: blue;"&gt;GetType&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;IDocumentTypeManager&lt;/span&gt;)), &lt;span style="color: #2b91af;"&gt;IDocumentTypeManager&lt;/span&gt;).DocumentTypes.ElementAt(20)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; tmpPath &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = cp.DocumentReference.Path&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; tmpPath = tmpPath.Replace(&lt;span style="color: #a31515;"&gt;"SilverlightApplication1.vbproj"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; resourceDictionaryCreationInfo.TargetFolder = tmpPath&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; resourceDictionaryCreationInfo.TargetPath = tmpPath + &lt;span style="color: #a31515;"&gt;"TestResourceDictionary.xaml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; CreateResourceDictionaryFile(tmpPath, &lt;span style="color: #a31515;"&gt;"TestResourceDictionary.xaml"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; resourceDictionaryCreationInfo.SourcePath = tmpPath + &lt;span style="color: #a31515;"&gt;"TestResourceDictionary.xaml"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; cp.AddItem(resourceDictionaryCreationInfo)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; CreateResourceDictionaryFile(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; TargetFolder &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; ResourceFile &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; xamlDoc &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;XElement&lt;/span&gt; = &lt;span style="color: #6464b9;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #844646;"&gt;ResourceDictionary&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b96464;"&gt;xmlns&lt;/span&gt;&lt;span style="color: #6464b9;"&gt;=&lt;/span&gt;&lt;span style="color: #555555;"&gt;"&lt;/span&gt;&lt;span style="color: #6464b9;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&lt;span style="color: #555555;"&gt;"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #b96464;"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: #6464b9;"&gt;=&lt;/span&gt;&lt;span style="color: #555555;"&gt;"&lt;/span&gt;&lt;span style="color: #6464b9;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&lt;span style="color: #555555;"&gt;"&lt;/span&gt;&lt;span style="color: #6464b9;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #844646;"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color: #6464b9;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; xamlDoc.Save(TargetFolder + &lt;span style="color: #a31515;"&gt;"TestResourceDictionary.xaml"&lt;/span&gt;)&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Zunächst wird eine private Variable vom Typ &lt;strong&gt;DocumentCreationInfo&lt;/strong&gt; erzeugt. Das ist die Variable &lt;em&gt;resourceDictionaryCreationInfo&lt;/em&gt;. &lt;br /&gt;&lt;br /&gt;Über die Eigenschaft &lt;strong&gt;CreationOptions&lt;/strong&gt; wird der BuildTask, ohne den das Resourcenverzeichnis nicht als Resource in den Build einbezogen wird, auf den DefaultBuildTask gesetzt.&lt;br /&gt;&lt;br /&gt;Über die Eigenschaft &lt;strong&gt;DocumentType&lt;/strong&gt; wird der Typ der Projektdatei festgelegt. Dazu wird auf die in der Schnittstelle &lt;strong&gt;IDocumentTypeManager&lt;/strong&gt; vorgehaltene &lt;strong&gt;DocumentTypeCollection&lt;/strong&gt; zugegriffen. Diese null-basierte Collection enthält insgesamt 36 Items. Eines davon ist der &lt;strong&gt;ResourceDictionaryDocumentType&lt;/strong&gt;, der als Item an der Position 20 abgegriffen und der DocumentType-Eigenschaft der Variablen &lt;em&gt;resourceDictionaryCreationInfo&lt;/em&gt; zugewiesen wird.&lt;br /&gt;&lt;br /&gt;Der weitere Quellcode weist den Eigenschaften &lt;strong&gt;TargetFolder&lt;/strong&gt;, &lt;strong&gt;TargetPath&lt;/strong&gt; und &lt;strong&gt;SourcePath&lt;/strong&gt; Werte zu. Dazu wird der Pfad des aktuellen Projekts ausgelesen und so modifiziert, dass man den Projekt Ordner erhält. Denn darin soll die Datei TestResourceDictionary.xaml gespeichert werden. Bevor der Eigenschaft &lt;strong&gt;SourcePath&lt;/strong&gt; der Wert der Datei TestResourceDictionary.xaml zugewiesen wird, muss die Datei erzeugt werden. Das geschieht in der Routine &lt;strong&gt;CreateResourceDictionaryFile()&lt;/strong&gt;. Diese Routine erzeugt den Xaml-Quellcode, der in einem neu erzeugten Resourcenverzeichnis standardmäßig enthalten ist. Das Xaml wird als &lt;strong&gt;xml&lt;/strong&gt; erzeugt und als TestResourceDictionary.&lt;strong&gt;xaml&lt;/strong&gt;-Datei gespeichert. Das Speichern der Datei über die Methode &lt;strong&gt;XElement.Save()&lt;/strong&gt; hat den Nachteil, dass eine xml ProcessingInstruction am Anfang der Datei steht, die manuell entfernt werden muss. Dafür gibt es elegantere Lösungen. Eine davon findet sich garantiert in den Assemblies von Microsoft.Expression. Mir geht es mit diesem Beispiel aber nur darum, die Frage zu klären, ob es eine grundsätzliche Lösung für das eigentliche Problem gibt. Und die gibt es.&lt;br /&gt;&lt;br /&gt;Nachdem den o.g. Eigenschaften der Variablen &lt;em&gt;resourceDictionaryCreationInfo&lt;/em&gt; die Werte zugewiesen wurden, erfolgt schließlich die Übergabe dieser Variablen an die Methode &lt;strong&gt;AddItem()&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Wenn das neue Silverlight 4-Projekt in Expression Blend 4 vollständig geladen ist, erscheint nun die Datei TestResourceDictionary.xaml im Projektbaum des Projektexplorers. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TMGhRvouqLI/AAAAAAAAACo/UkfMOsRY9s0/s1600/ss1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" nx="true" src="http://4.bp.blogspot.com/_Y29D3-feYio/TMGhRvouqLI/AAAAAAAAACo/UkfMOsRY9s0/s400/ss1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Einschränkungen&lt;/span&gt;&lt;br /&gt;Diese Lösung hat gegenwärtig zwei Einschränkungen. &lt;br /&gt;&lt;br /&gt;Die erste Einschränkung habe ich bereits erwähnt. Sie besteht darin, dass die xml-ProcessingInstruction aus dem Quellcode von TestResourceDictionary.xaml manuell entfernt werden muss.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y29D3-feYio/TMGhYwgviiI/AAAAAAAAACs/3S9jNLOcQJE/s1600/ss2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" nx="true" src="http://2.bp.blogspot.com/_Y29D3-feYio/TMGhYwgviiI/AAAAAAAAACs/3S9jNLOcQJE/s1600/ss2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die zweite Einschränkung besteht darin, dass die Datei TestResourceDictionary.xaml manuell in der Datei App.xaml als Resourcenverzeichnis aufgenommen werden muss. Andernfalls wird sie nicht als Resourcenverzeichnis erkannt. Dazu muss der folgende Quellcode in App.xaml manuell eingefügt werden. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y29D3-feYio/TMGhgc1y5xI/AAAAAAAAACw/I7sujZ-p7Oc/s1600/ss3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" nx="true" src="http://3.bp.blogspot.com/_Y29D3-feYio/TMGhgc1y5xI/AAAAAAAAACw/I7sujZ-p7Oc/s1600/ss3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Damit landen wir im Prinzip mit der vorgestellten Lösung erneut bei der von Timmy Kokke aufgeworfenen Frage. Ich werde meine Untersuchungen fortsetzen und vielleicht auch eine Lösung dafür finden, das Resourcenverzeichnis im Quellcode von App.xaml aufzunehmen. Vielleicht gibt es aber irgendwo in der Community jemanden, der gerade genau an diesem Problem arbeitet und für den dieser Artikel eine Hilfe darstellt.&lt;br /&gt;&lt;br /&gt;Sobald die besagten Einschränkungen manuell beseitigt worden sind steht das Resourcenverzeichnis der Datei TestResourceDictionary.xaml anwendungsweit in Expression Blend 4 zur Verfügung.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;a href="http://silverlawone.de/silverlawblogde/B4AIRDH/BlendExtensionProjectManagerLab.zip"&gt;Vollständiger Quellcode des Beispiel-Projects&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6636987624195547942?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6636987624195547942/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/10/untersuchung-uber-das-hinzufugen-einer.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6636987624195547942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6636987624195547942'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/10/untersuchung-uber-das-hinzufugen-einer.html' title='Untersuchung über das Hinzufügen einer ResourceDictionary.xaml Datei zu einem Silverlight 4 Projekt in einem Expression Blend 4 Add-In'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Y29D3-feYio/TMGhRvouqLI/AAAAAAAAACo/UkfMOsRY9s0/s72-c/ss1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-6446505639576112887</id><published>2010-10-21T12:37:00.002+02:00</published><updated>2010-10-21T13:01:38.605+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RichTextBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Add-In'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='RichTextBox.Xaml Builder'/><title type='text'>RichTextBox.Xaml Builder Add-In Version 1.0.0.2 für Expression Blend 4</title><content type='html'>Es gibt eine &lt;a href="http://gallery.expression.microsoft.com/en-us/RTBXBAIB4V1002"&gt;neue Version des&amp;nbsp;RichTextBox.Xaml Builder Add-In für Expression Blend 4&lt;/a&gt;. Es ist die Version 1.0.0.2. Mit dieser Version gibt es ein paar ergänzende Funktionen, die im wesentlichen das Verhalten des Add-In in der Entwicklungsumgebung von Expression Blend 4 betreffen. Daneben wurde ein kleines Fehlverhalten der UI behoben.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Zusammenfassung der Neuerungen&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;A. Funktionen&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;1. Sichtbarkeit nur für Silverlight 4-basierte Projekttypen&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Das Add-In erkennt beim Öffnen einer neuen Solution oder eines neuen Projekts selbständig den Projekttyp. Weil das Add-In eine Unterstützung ausschließlich für die Entwicklung von Silverlight 4-Projekten ist, ist es nur sichtbar, wenn mindestens ein Projekt in einer Solution ein Silverlight 4-basiertes Projekt ist. In WPF-Anwendungsprojekten ist das Add-In nun nicht mehr sichtbar. Das gilt unabhängig davon, um welchen Typ von WPF-Projekt es sich handelt (WPF-Anwendung, WPF-Steuerelementbibliothek, etc.). In allen Silverlight 4-basierten Projekttypen, einschließlich Datengebundenen Silverlight-Anwendungen und SketchFlow-Anwendungen, steht es hingegen zur Verfügung.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;2. Vollständiges Löschen einer Konvertierung beim Schließen eines Projekts&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Beim Schließen eines Projekts wird eine etwaige Konvertierung gelöscht, so dass sie beim Öffnen eines neuen Projekts nicht mehr sichtbar ist. In Version 1.0.0.0 blieb der Inhalt einer Konvertierung sichtbar, was unerwünscht ist.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;3. Sicherungsabfrage für ungespeicherte Konvertierungen&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Beim Schließen eines Projekts überprüft das Add-In jetzt, ob eine nicht gespeicherte Konvertierung aktiv ist. Dadurch wird vermieden, dass Konvertierungen ungewollt verloren gehen bzw. später neu erstellt werden müssen.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;B. Bug-Fix: Überlappen in der XML-Ansicht behoben&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In Version 1.0.0.0 war es so, dass bei einer Veränderung der Breite des Add-In-Fensters bei aktiver XML-Ansicht die XML-Ansicht nicht schmaler als eine bestimmte Breite verkleinert wurde. Das führte dazu, dass in der XML-Ansicht ein Teil des Add-In-Fensters das Registerkartenpanel überlappte. Dieses Fehlverhalten ist in Version 1.0.0.2 behoben.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Download der Version 1.0.0.2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gallery.expression.microsoft.com/en-us/RTBXBAIB4V1002"&gt;Das RichTextBox.Xaml Builder Add-In für Expression Blend 4 kann in der Expression Gallery heruntergeladen werden&lt;/a&gt;. Die &lt;a href="http://gallery.expression.microsoft.com/en-us/SLRTXBB4AISL"&gt;vorherige Version&lt;/a&gt; bleibt vorerst als eigenständiger Download in der Expression Gallery erhalten. Ich empfehle aber, die neueste Version zu verwenden.&lt;br /&gt;&lt;br /&gt;Viel Spass mit der neuen Version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-6446505639576112887?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/6446505639576112887/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/10/richtextboxxaml-builder-add-in-version.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6446505639576112887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/6446505639576112887'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/10/richtextboxxaml-builder-add-in-version.html' title='RichTextBox.Xaml Builder Add-In Version 1.0.0.2 für Expression Blend 4'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-8549269248814775282</id><published>2010-10-20T08:56:00.003+02:00</published><updated>2010-10-20T09:11:52.099+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UserControl'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>FunWithArcs UserControl - Designstudie für ein Navigationssteuerelement</title><content type='html'>Mit Silverlight 4 wurden Formen eingeführt. Es gibt Stern, Ring, Hexagon, Dreieck etc. Und es gibt die Kreisform,&amp;nbsp;englisch: Arc. In der Entwicklungsumgebung von Expression Blend 4 wird das Steuerelement vom Typ Arc als Pie bezeichnet. Tatsächlich ist der Typ jedoch Arc.&lt;br /&gt;&lt;br /&gt;Nun habe ich ein bißchen damit experimentiert und herausgekommen ist ein UserControl, das FunWithArcs UserControl. Eine Funktionalität hat es (noch) nicht. Also, was soll das? Nun, es ist wie gesagt ein Experiment. Und als solches betrachtet es bitte als Zwischenergebnis für das, was noch kommt. Ziel wird es sein, das UserControl zu einem Navigationssteuerelement weiterzuentwickeln. Mit dieser Idee im Hinterkopf, erschließt sich der gegenwärtige Stand der Entwicklung.&lt;br /&gt;&lt;br /&gt;Das ist das UserControl im derzeitigen Entwicklungsstand:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/FWAUCSL4/s1.html" style="height: 602px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Es ist Kreisrund und beim Eintritt des Mouszeigers erscheinen, je nach Position des Mauszeigers, vier Unterelemente. Diese Unterelemente sehen aus wie Kuchenstücke. Am Ende der Entwicklung werden diese Unterelemente jeweils für die Unterseiten einer Website stehen. Bewegt man den Mauszeiger über das kreisförmige Element in der Mitte, dann erscheinen alle vier Unterelemente im Überblick. In der späteren Verwendung als Navigationssteuerelement erhält der Nutzer damit einen Überblick über alle Unterseiten einer Webpräsenz. Das UserControl kann außerdem per Drag &amp;amp; Drop auf den Zentrumpunkt frei an eine neue Position verschoben werden. Bei der späteren Verwendung als Navigationssteuerelement bietet das den Vorteil, dass der Nutzer sich die Benutzeroberfläche individueller gestalten kann. Die UI der Webprasenz verliert ihre Starrheit. Dazu trägt auch die Möglichkeit bei, die Größe des (späteren) Navigationssteuerelements zu verändern. Das geschieht derzeit durch Benutzen des Mausrads über dem Zentrumspunkt. (Bitte beachtet, dass die Mausrad-Zoom-Funktion bei einer Einbettung in eine HTML-Seite derzeit noch im Konflikt steht mit der Scrollbar der HTML-Seite.)&lt;br /&gt;&lt;br /&gt;Für die weitere Entwicklung habe ich derzeit folgende Ideen:&lt;br /&gt;&lt;br /&gt;1. Die Größenveränderung über das Mausrad ist wenig intuitiv. Sinnvoller wäre es z.B., ein Steuerelement an den Rand des UserControl zu platzieren, über das die Größenveränderung erfolgt. Ein gescinntes Slider-Steuerelement bietet sich an.&lt;br /&gt;&lt;br /&gt;2. Das UserControl sollte zu einem CustomControl weiterentwickelt werden. Das ermöglicht dem Designer eine größere individuelle Gestaltung des Steuerelements.&lt;br /&gt;&lt;br /&gt;3. Die Unterelemente sollten ihrerseits ebenfalls CustomControls sein. Bestandteil des Templates muss vor allem ein Content-Steuerelement sein, in das dann ein HyperlinkButton für die Navigation platziert wird.&lt;br /&gt;&lt;br /&gt;4. Das Hauptsteuerelement soll eine individuell bestimmbare Vielzahl von Unterelementen aufnehmen können. &lt;br /&gt;&lt;br /&gt;5. Der Zentrumpunkt sollte ebenfalls ein eigenes CustomControl werden. Das ist sinnvoll, damit die Funktionsweise des Zentrumpunkts verallgemeinert und z.B. auch auf Unterelemente angewendet werden kann. Der Zentrumpunkt verschafft wie erwähnt einen Überblick über alle Unterelemente. Übertragen auf eine Platzierung in einem Unterelement können im Ergebnis die Unterelemente eines Unterelements&amp;nbsp;angezeigt werden.&lt;br /&gt;&lt;br /&gt;Das war' für heute zu dieser Designstudie für ein Navigationssteuerelement. Wer Interesse hat, sich in die weitere Entwicklung mit Ideen, Fragen oder Kritik&amp;nbsp;einzubringen ist herzlich willkommen. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://gallery.expression.microsoft.com/en-us/SLFWAUCSL4?SRC=Home"&gt;Den Quellcode des UserControls gibt es als Download in der Expresson Gallery&lt;/a&gt;. Sobald ich Zeit habe werde ich den Quellcode etwas näher erläutern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-8549269248814775282?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/8549269248814775282/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/10/funwitharcs-usercontrol-designstudie.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8549269248814775282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/8549269248814775282'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/10/funwitharcs-usercontrol-designstudie.html' title='FunWithArcs UserControl - Designstudie für ein Navigationssteuerelement'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-907606033146088138</id><published>2010-10-14T15:49:00.010+02:00</published><updated>2010-10-15T11:37:45.370+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Add-In'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Sichtbarkeit von einer Expression Blend Erweiterung (Add-In) abhängig vom Projekttyp</title><content type='html'>Die Funktionalität einer Expression Blend-Erweiterung zielt meistens auf einen bestimmten Projekttyp ab. Deswegen ist es nützlich zu wissen, wie man die Sichtbarkeit der Expression Blend-Erweiterung abhängig davon steuern kann, welcher Projekttyp geöfnet ist bzw. geöffnet wird. Dieser Artikel beschreibt, wie man die Sichtbarkeit von einer Expression Blend-Erweiterung in Abhängigkeit vom Projekttyp steuern kann.&lt;br /&gt;&lt;br /&gt;Die vorgestellte Lösung funktioniert mit allen Solutiontypen von Expression Blend 4, einschließlich SketchFlow-Solutions.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Beispielprojekt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es wird eine einfache Beispiel-Erweiterung erstellt, um zu demonstrieren, wie der Quellcode funktioniert. Die Benutzeroberfläche besteht nur aus einem Fenster mit einem Textblock-Steuerelement.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y29D3-feYio/TLcFm54EOOI/AAAAAAAAACk/XiBACjEwsVw/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ex="true" height="216" src="http://4.bp.blogspot.com/_Y29D3-feYio/TLcFm54EOOI/AAAAAAAAACk/XiBACjEwsVw/s400/Screenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Generelle Vorgehensweise&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Assembly Microsoft.Expression.Project stellt die Schnittstelle IProjectManager zur Verfügung. Über die Verwendung dieser Schnittstelle kann auf das Ereignis SolutionOpened() reagiert werden. Dieses Ereignis tritt auf, wenn eine&amp;nbsp;&lt;strong&gt;Solution&lt;/strong&gt; geöffnet wird. Eine Solution kann gegebenenfalls aus mehreren Projekten mit unterschiedlichen Projekttypen bestehen. Dem Ereignis SolutionOpened() wird ein Delegate hinzugefügt. Innerhalb der Routine, auf die der Delegat zeigt, wird der aktuelle Projekttyp ermittelt, indem der Parameter e ausgewertet wird. Der Parameter e hat den Typ SolutionEventArgs. Mithilfe der Klasse SolutionEventArgs() kann der Projekttyp jedes Projekts identifiziert werden, das Teil der Solution ist. Die Projekte einer Solution können über SolutionEventArgs.Solution.Projects abgefragt werden. Der Rückgabewert von SolutionEventArgs.Solution.Projects ist vom Typ IEnumerable(Of IProject). Aber es ist nicht erforderlich, IProject selbst zu verwenden. Für das Identifizieren eines Silverlight-basierten Projekts innerhalb einer Solution, reicht es außer bei einem bestimmten Solutiontyp vielmehr aus, wenn nur der Projekttyp des Projekts ausgewertet wird, der in der Collection von SolutionEventArgs.Solution.Projects zuoberst gelistet ist.&lt;br /&gt;&lt;br /&gt;Der einzige Solutiontyp, bei dem das nicht ausreicht, ist eine Silverlight-Anwendung mit ASP-Website. Für diesen Fall, kann über die Verwendung der Schnittstelle IProjectManager ergänzend auf das Ereignis ProjectOpened() reagiert werden. Dieses Ereignis tritt auf, wenn ein &lt;strong&gt;Projekt&lt;/strong&gt; geöffnet wird. Wenn eine Solution mehrere Projekte enthält, dann feuert das Ereignis ProjektOpened() für jedes Projekt, das in der Solution enthalten ist. Es ist nach den von mir durchgeführten Tests nur für diesen Solutiontyp erforderlich, zusätzlich dem Ereignis ProjectOpened() einen Delegaten hinzuzufügen, der auf eine Routine zeigt, die sicherstellt, dass die Expression Blend-Erweiterung auch für das in dieser Solution enthaltene Silverlight-basierte Projekt zuverlässig bereitgestellt wird.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt-für-Schritt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 1 - Konfigurieren des Entwicklungsprojekts&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Für diesen Schritt verweise ich auf &lt;a href="http://silverlawone.blogspot.com/2010/10/expression-blend-4-add-in-fur-zugriff.html"&gt;Schritt 1 in einem Artikel, den ich früher veröffentlicht habe&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 2 - Assemblyverweise&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Auf die folgenden Assemblies müssen im Beispielprojekt durch Verweise einbezogen werden (in alphabetischer Reihenfolge):&lt;br /&gt;&lt;br /&gt;Microsoft.Expression.Extensibility&lt;br /&gt;Microsoft.Expression.Framework&lt;br /&gt;Microsoft.Expression.Project&lt;br /&gt;System.ComponentModel.Composition&lt;br /&gt;&lt;br /&gt;Zu beachten ist, dass der Verweis auf Microsoft.Expression.Project nur funktioniert, wenn das Ziel-Framework in den Projekt-Eigenschaften in der Registerkarte "Kompilieren" unter "Erweiterte Kompilierungsoptionen ..." auf das .Net Framework 4 gesetzt wird.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 3 - Die Klasse ProjectManagerLabExtension.vb&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Diese Klasse stellt die Expression Blend-Erweiterung bereit. Hier ist der vollständige Quellcode der Klasse:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/PMEEB4/S1/s1.html" style="height: 702px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Und so funktioniert sie im Detail: &lt;br /&gt;&lt;br /&gt;Es werden drei private Variablen benötigt:&lt;br /&gt;&lt;br /&gt;1. Die Variable windowService. Diese Variable ist vom Typ IWindowService. Die Methode IWindowService.RegisterPalette() fügt der Entwicklungsumgebung von Expression Blend eine neue RegisterPalette hinzu. Diese RegisterPallete enthält die Benutzeroberfläche der Expression Blend-Erweiterung in Gestalt des WPF-UserControls des Beispielprojekts.&lt;br /&gt;&lt;br /&gt;2. Die Variable DemoUI. Diese Variable ist ein Object vom Typ des WPF-UserControls und liefert wie gesagt die Benutzeroberfläche.&lt;br /&gt;&lt;br /&gt;3. Die Variable projectManager. Diese Variable ist vom Typ IProjectManager. Mit ihrer Hilfe prüfen wir den Solutiontyp sowie erforderlichenfalls den Projekttyp.&lt;br /&gt;&lt;br /&gt;Im Load()-Ereignisbehandler werden den Variablen windowService und projectManager die jeweiligen Schnittstellen-Typen zugewiesen. Es wird die Routine BuildExtensionUI() aufgerufen. Diese Routine erstellt die Benutzeroberfläche der Expression Blend-Erweiterung und registriert eine neue RegisterPalette. Schließlich wird dem Ereignis SolutionOpened() eine Delegat hinzugefügt, der auf die Routine ASolutionOpened() zeigt.&lt;br /&gt;&lt;br /&gt;Die Routine ASolutionOpened() ruft die Routine CheckProjectType() auf. Nachfolgend stelle ich zwei alternative Vorgehensweisen vor, um ein Silverlight-basiertes Projekt zu identifizieren.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Variante 1&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Diese Variante ist nicht zu bevorzugen. Wer gleich die bessere Variante lesen will überspringt diesen Abschnitt und liest weiter bei "Variante 2". &lt;br /&gt;&lt;br /&gt;Hier der Quellcode-Ausschnitt für Variante 1:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/PMEEB4/S2/s2.html" style="height: 722px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;In dieser Variante hat die Routine CheckProjectType() zwei Parameter. Der erste Parameter (ProjectIdentifier) ist vom Typ String. Der zweite Parameter (eESA) ist vom Typ SolutionEventArgs. Dem ersten Parameter wird der Wert des ausgewerteten Projekttyps zugewiesen. Es wird der Projekttyp des Projekts ausgewertet, das in der Collection von IEnumerable(Of IProject) zuoberst gelistet ist. Mit dem zweiten Parameter wird der Wert von e weitergereicht.&lt;br /&gt;&lt;br /&gt;In der Routine CheckProjectType wird dann der Projektidentifzierer (ProjectIdentifier) ausgewertet. Zu diesem Zweck werden vier mögliche Werte geprüft. Der Wert "Application Executable" weist auf eine WPF-Solution hin. Erfaßt werden alle Arten von WPF-Solutiontypen. Die Werte "Silverlight-based Project" und "Web Application Project" weisen auf eine Solution hin, die ein Silverlight-basiertes Project enthält. Der Wert "Web Site" weist auf ein ASP-Website-Project hin, das Teil einer Silverlight-Solution mit einer neuen ASP-Website ist. Dieser Wert wird beim Erstellen einer neuen Silverlight-Solution mit einer neuen ASP-Website übergeben. Nur in diesem Fall muss ergänzend der Projekttyp des Silverlight-Projekts abgefragt werden. Das Silverlight-Projekt in einer Silverlight-Solution mit neuer ASP-Website ist in der nullbasierten Collection IEnumerable(Of IProject) an zweiter Stelle gelistet.&lt;br /&gt;&lt;br /&gt;Jeder der vier möglichen Werte wird als Fall ausgewertet. Es wird jeweils die Routine ControlDemoUIVisibility() aufgerufen. Je nach dem, welcher ProjectIdentifier übergeben wurde, wird der Parameter ExtensionVisibility auf True oder auf False gesetzt.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Variante 2 (empfohlen):&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In dieser Variante wird die Collection IEnumerable(Of IProject) unmittelbar ausgewertet. Die Routine CheckProjectType() hat in dieser Variante nur einen Parameter. Dieser Parameter ist vom Typ SolutionEventArgs. Die Routine ASolutionOpened() ruft die Routine CheckProjectType() auf und reicht einfach den Parameter e weiter.&lt;br /&gt;&lt;br /&gt;Hier ist der Quellcode für die Variante 2:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/PMEEB4/S3/s3.html" style="height: 555px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Die Auswertung erfolgt über eine LINQ-Abfrage. Die LINQ-Abfrage wertet für jedes Projekt in der Collection den Projekt-Identifizierer aus. Die Anzahl der in der Variablen silverlightMatches enthaltenen Elemente ist nur dann größer 0 wenn mindestens ein Silverlight-basiertes Project gefunden wurde. Wenn das der Fall ist, wird die Routine ControlDemoUIVisibility() mit dem Parameterwert True aufgerufen. Andernfalls mit dem Parameterwert False. &lt;br /&gt;&lt;br /&gt;&lt;u&gt;Hinweis&lt;/u&gt;: Wenn die Abfrage darauf gerichtet sein soll, ob ein WPF-Projekt geöffnet wird, braucht man einfach nur den Projekt-Identifizierer nach dem Wert "Application Extecutable" suchen zu lassen.&lt;br /&gt;&lt;br /&gt;Die Routine ControlDemoUIVisibility() macht dann folgendes, vorausgesetzt ExtensionVisibility ist auf True gesetzt. Die Sichtbarkeit des WPF-UserControls wird auf sichtbar gesetzt. Falls die RegisterPalette noch nicht registriert ist, wird sie registriert. Die Sichtbarkeit von der RegisterPalette wird auf sichtbar gesetzt. Schließlich wird dem Ereignis IProjectManager.SolutionClosed() ein Delegat hinzugefügt, der auf die Routine ASolutionClosed() zeigt. Die Routine ASolutionClosed() entfernt die Expression Blend-Erweiterung, wenn die Silverlight-Solution geschlossen wird.&lt;br /&gt;&lt;br /&gt;Das war's im Prinzip. &lt;br /&gt;&lt;br /&gt;Es gibt eine Einschränkung, auf die ich hinweisen möchte. Wenn Expression Blend neu gestartet wird und der Benutzer im Willkommensbildschirm auf "Schließen" klickt, ohne ein Projekt zu öffnen oder ohne ein neues Projekt zu erstellen, wird gleichwohl die Expression Blend-Erweiterung im Menü unter "Fenster" angezeigt. Ich habe noch nicht herausgefunden wie man das verhindern kann. Weil das so ist, verarbeitet die Routine ControlDemoUIVisibility() ergänzend den Fall, dass der Parameter ExtensionVisibility den Wert False hat. Damit wird die Situation abgedeckt, dass Expression Blend geöffnet wird, der Willkommensbildschirm geschlossen und danach eine (neue) WPF-Solution geöffnet wird. Für diesen Fall wird ausnahmsweise die Routine ASolutionClosed() aufgerufen, damit die Expression Blend-Erweiterung entfernt wird, die in der Benutzeroberfläche bereits vorhanden ist.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Download&lt;/strong&gt;: &lt;a href="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/PMEEB4/BlendExtensionProjectManagerLab.zip"&gt;Der vollständige Quellcode des Beispielprojekts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-907606033146088138?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/907606033146088138/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://silverlawone.blogspot.com/2010/10/sichtbarkeit-von-einer-expression-blend.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/907606033146088138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/641384594223208870/posts/default/907606033146088138'/><link rel='alternate' type='text/html' href='http://silverlawone.blogspot.com/2010/10/sichtbarkeit-von-einer-expression-blend.html' title='Sichtbarkeit von einer Expression Blend Erweiterung (Add-In) abhängig vom Projekttyp'/><author><name>Martin (SilverLaw)</name><uri>http://www.blogger.com/profile/17962041539959640138</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_Y29D3-feYio/S8IcyTW4hgI/AAAAAAAAAAo/88nas7tkc4I/S220/BlogFaceResult.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Y29D3-feYio/TLcFm54EOOI/AAAAAAAAACk/XiBACjEwsVw/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-641384594223208870.post-43273441642419134</id><published>2010-10-12T14:29:00.012+02:00</published><updated>2010-10-13T10:17:29.817+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Add-In'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Blend 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><title type='text'>Expression Blend 4 Add-In für Zugriff auf Xaml-Quellcode eines Silverlight 4 Projekts</title><content type='html'>Dieser Artikel beschreibt, wie man in einem Add-In für Expression Blend 4 Zugriff auf den Xaml-Quellcode&amp;nbsp;von einem&amp;nbsp;Xaml-Dokument eines Silverlight 4 Projekts erhält, das&amp;nbsp;aktuell in der Entwicklungsumgebung geöffnet ist.&lt;br /&gt;&lt;br /&gt;Im Ergebnis liefert der vorgestellte Beispiel-Quellcode einen String zurück, der das Xaml des aktuellen Xaml-Dokuments (z.B. MainPage.xaml, App.xaml, UserControl.xaml&amp;nbsp;oder RecourceDictionary.xaml) enthält.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Beispiel-Projekt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es wird ein kleines Add-In für Expression Blend 4 erstellt, dessen Oberfläche aus einem Button besteht. Mit einem Klick auf den Button wird das Xaml des aktuellen Xaml-Dokuments abgerufen und in einer MessageBox dargestellt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Generelle Vorgehensweise&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die ActiveDocument Eigenschaft der Schnittstelle IDocumentService gibt Zugriff auf das aktuelle Xaml-Dokument. Das ActiveDocument wird zu einem SceneDocument umgewandelt. Und das SceneDocument stellt über die Eigenschaft XamlDocument.Text den Xaml-Quellcode des aktiven Xaml-Dokuments bereit. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Schritt für Schritt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 1 - Das Projekt für die Erweiterung erstellen und konfigurieren&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Für diesen Schritt verweise ich auf einen &lt;a href="http://blog.timmykokke.com/archive/2010/03/21/building-extensions-for-expression-blend-4-using-mef.aspx"&gt;Artikel von Timmy Kokke&lt;/a&gt;, in dem unter dem Punkt "Configuring the extension project" (Konfiguration des Erweiterungsprojekts) die Vorgehensweise zum Erstellen und Konfigurieren des&amp;nbsp;WPF-Entwicklungsprojekts bestens beschrieben ist. &lt;br /&gt;&lt;br /&gt;Als ergänzenden Tipp empfehle ich, Visual Studio 2010 als Adiminstrator auszuführen: Rechtklick auf die Verknüpfung zum Starten von Visual Studio 2010 und Linksklick auf "Als Administrator ausführen".&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 2 - Assemblyverweise&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Für den Zugriff auf die benötigten Funktionalitäten&amp;nbsp;muss im Projekt auf&amp;nbsp;die folgenden Assemblies verwiesen werden (in alphabetischer Reihenfolge):&lt;br /&gt;&lt;br /&gt;Microsoft.Expression.DesignModel&lt;br /&gt;Microsoft.Expression.DesignSurface&lt;br /&gt;Microsoft.Expression.Extensibility&lt;br /&gt;Microsoft.Expression.Framework&lt;br /&gt;Microsoft.Expression.Markup&lt;br /&gt;System.ComponentModel.Composition&lt;br /&gt;&lt;br /&gt;Zu beachten ist, dass der Verweis auf Microsoft.Expression.DesignSurface nur funktioniert, wenn in den Projekt-Eigenschaften in der Registerkarte "Kompilieren" unter "Erweiterte Kompilierungsoptionen ..." als Ziel-Framework das .Net Framework 4 gesetzt wird.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schritt 3 - Die UI des Add-In&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Für die UI des Add-In wird dem Projekt durch Rechtsklick auf das Projekt -&amp;gt; Hinzufügen -&amp;gt; Neues Element hinzufügen ein neues WPF-Benutzersteuerelement hinzugefügt. Das Benutzersteuerelement erhält den Namen "XamlCatcherUI.xaml". Ein eventuell schon vorhandenes UserControl wird am besten gelöscht.&lt;br /&gt;&lt;br /&gt;Hier ist der Xaml-Quellcode für die UI des UserControl:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/XCB4AISNIPPETS/S1/s1.html" style="height: 572px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Schritt 4 - Die Klasse XamlCatcherExtension&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Dem Projekt wird eine neue Klasse hinzugefügt. Diese Klasse erhält den Namen XamlCatcherExtension.vb. Hier ist der vollständige Quellcode dieser Klasse (VB.NET):&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe src="http://silverlawone.de/silverlawblogde/CBCSNIPPETS/XCB4AISNIPPETS/S2/s2.html" style="height: 702px; width: 600px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;In der Ereignisbehandlung des Load-Ereignisses wird der Oberfläche der Entwicklungsumgebung von Expression Blend 4 das Benutzersteuerelement als neue RegisterPalette&amp;nbsp;hinzugefügt. Wie das im Einzelnen funktioniert &lt;a href="http://blog.timmykokke.com/archive/2010/03/21/building-extensions-for-expression-blend-4-using-mef.aspx"&gt;beschreibt Timmy Kokke in seinem Artikel&lt;/a&gt;. Die Schnittstelle IDocumentService&amp;nbsp;gibt Zugriff auf das Dokument, das in Expression Blend 4 aktiv angezeigt wird.&lt;br /&gt;&lt;br /&gt;Dem Click-Ereignis des Button btCatchXaml des Benutzersteuerelements wird ein Delegat hingefügt, der auf die Routine &lt;em&gt;GetXamlSourceCode&lt;/em&gt; zeigt. Die Routine &lt;em&gt;GetXamlSourceCode&lt;/em&gt; enthält die eigentliche Programmlogik für den Zugriff auf den Xaml-Quellcode eines aktuellen Dokuments in Expression Blend 4.&lt;br /&gt;&lt;br /&gt;In der If-Verzweigung der Routine &lt;em&gt;GetXamlSourceCode&lt;/em&gt; wird zunächst auf die DocumentReference.Path-Eigenschaft des aktuellen Dokuments zugegriffen. Hierdurch bekommt&amp;nbsp;man den vollständigen Datei-Pfad des Dokuments, das in der Ansicht von Expression Blend 4 derzeit aktiv ist. Die Path-Eigenschaft liefert den Pfad als String. Um zu prüfen, ob es sich bei dem aktuellen Dokument in der Ansicht von Expression Blend 4 um ein Xaml-Dokument handelt, wird die Methode .String.EndsWith() benutzt. Mit dieser Methode wird abgefragt, ob der Pfad-Wert mit ".xaml" endet, was ein untrügliches Zeichen dafür ist, dass es sich beim aktuellen Dokument um ein Xaml-Dokument handelt.&lt;br /&gt;&lt;br /&gt;Wenn die If-Verzweigung True zurückgibt, wird eine Variablen&amp;nbsp;des Typs&amp;nbsp;SceneDocument deklariert. Die Variable erhält den Namen "sd". Dieser Variablen wird das zum SceneDocument gecastete ActiveDocument zugewiesen.&lt;br /&gt;&lt;br /&gt;Als letztes wird die&amp;nbsp;Eigenschaft XamlDocument.Text der Variable sd abgefragt. Diese Eigenschaft liefert das Xaml des&amp;nbsp;aktiven Dokuments als String-Wert zurück. Der erhaltene String wird dann in einer MessageBox angezeigt.&lt;br /&gt;&lt;br /&gt;Das war's.&lt;br /&gt;&lt;br /&gt;Der Rückgabewert kann nun für die weitere Verarbeitung verwendet werden, allerdings in der dargestellten Vorgehensweise nur ReadOnly. Nützlich kann dieser Zugriff zum Beispiel&amp;nbsp;sein, um den Quellcode eines Xaml-Dokuments direkt aus Expression Blend 4 heraus zu drucken oder an einem anderen Ort lokal zu speichern, beispielsweise als temporäre Sicherungskopie. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;: &lt;a href="http://www.silverlawone.de/silverlawblogde/CBCSNIPPETS/XCB4AISNIPPETS/XamlCatcher.zip"&gt;Vollständiger Quellcode des Beispiel-Add-In Projekts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/641384594223208870-43273441642419134?l=silverlawone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silverlawone.blogspot.com/feeds/43273441642419134/comments/default' title='Kommentare zum
