<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.codecomplete.de/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>XAML Blog : Tutorial</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx</link><description>Tags: Tutorial</description><dc:language>en</dc:language><generator>CommunityServer 2007 (Build: 20416.853)</generator><item><title>WPFAnwendung mit TrayIcon</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2009/08/15/wpfanwendung-mit-trayicon.aspx</link><pubDate>Sat, 15 Aug 2009 13:21:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1887</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Eine WPF Anwendung mit einem TrayIcon zu versehen ist eine einfache Sache. Doch dazu müssen wir uns - bitte nicht erschrecken - bei WindowsForms bedienen. Zuallerst schaffen wir uns wie gewohnt eine WPF Anwendung mit dem Project Wizard. Diese entspricht einer völlig normalen WPF Anwendung und wird auch eine solche bleiben. Natürlich wäre es möglich in einer WindowsForms Anwendung WPF zu hosten, aber das ist nicht der Weg, den wir hier gehen wollen. Sondern wir erweiteren eine WPF Anwendung um Funktionalitäten, die wir von WindowsForms her kennen. Dazu bringen wir die Referenzen &amp;quot;System.Windows.Forms&amp;quot; und &amp;quot;System.Drawing&amp;quot; in unsere Anwendung mit &amp;quot;Add Reference&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/WPF/iconreferences.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Damit wir im Tray erscheinen, benötigen wir auch ein TrayIcon. Das malen wir mal auf die Schnelle in der Oberfläche, nachdem wir zuvor &amp;quot;Add New Item&amp;quot; im Kontextmenü des Projektes aufgerufen und&amp;nbsp;Icon File ausgewählt haben. Dieses nennen wir entsprechend der Anwendung und malen los.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/WPF/icon.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Wenn wir mit unserem künstlerischem Werk zufrieden sind, setzen wir noch die Properties der Icon Datei auf &amp;quot;embedded Resource&amp;quot; und natürlich wollen wir die Datei nicht kopieren.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/WPF/iconproperties.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Dann gehen wir in die App.xaml und rufen den Code Behind auf: App.xaml.cs. Wir machen das in der Anwendung, denn wir wollen ja nicht ein Fenster, sondern die gesamte Anwendung mit einem Tray versehen. Dies geschieht in folgendem Code&lt;/p&gt;&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; App : System.Windows.Application
    {
        &lt;span class="kwrd"&gt;private&lt;/span&gt; System.Windows.Forms.NotifyIcon notifyIcon;

        &lt;span class="kwrd"&gt;protected&lt;/span&gt;  &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnStartup(StartupEventArgs e)
        {
            notifyIcon = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Windows.Forms.NotifyIcon();

            System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
            Stream stream = a.GetManifestResourceStream(&lt;span class="str"&gt;&amp;quot;MyApplication.MyIcon.ico&amp;quot;&lt;/span&gt;);
            notifyIcon.Icon = &lt;span class="kwrd"&gt;new&lt;/span&gt; Icon(stream);
            notifyIcon.Text = &lt;span class="str"&gt;&amp;quot;Meine Anwendung&amp;quot;&lt;/span&gt;; 
            notifyIcon.Click += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(notifyIcon_Click);
            notifyIcon.Visible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        }
        
        &lt;span class="kwrd"&gt;void&lt;/span&gt; notifyIcon_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            notifyIcon.BalloonTipText = &lt;span class="str"&gt;&amp;quot;Diese Anwendung hat ein Tray Icon&amp;quot;&lt;/span&gt;;
            notifyIcon.BalloonTipTitle = &lt;span class="str"&gt;&amp;quot;Meine Anwendung&amp;quot;&lt;/span&gt;;
            
            notifyIcon.ShowBalloonTip(2000);
        }
    }&lt;/pre&gt;
&lt;p&gt;Zuerst müssen wir die Basisklasse von unserer partial class genauer definieren. Durch die Reference von Windows.Forms ist diese nun doppelt besetzt (man kann&amp;nbsp; auch auf das &amp;quot;using System.Windows.Forms;&amp;quot; verzichten, aber warum sollte man).&amp;nbsp; Dann schaffen wir unser TrayIcon als &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx" target="_blank"&gt;System.Windows.Forms.NotifyIcon&lt;/a&gt;. Das befüllen wir im OnStartup - früher benötigen wir das nicht, später wäre aber auch keine so gute Idee. Dazu holen wir uns den ResourceStream aus der Assembly heraus . Wäre schön, den noch auf Null zu überprüfen, der Übersicht halber habe ich das oben nicht getan, ist aber unbedingt empfehlenswert. Wenn es gut klappt, haben wir nun unser gemaltes Icon, das wir nun noch mit einem Click-Handler versehen. &lt;/p&gt;
&lt;p&gt;In dem Click-Handler lasse ich ein Ballon Tooltip kurz einblenden. Natürlich kann man da auch alle anderen netten Sachen machen, wie beispielsweise alle Fenster minimieren. Auch kann man statt dem Click-Handler ein &lt;a href="http://msdn.microsoft.com/de-de/library/system.windows.forms.contextmenustrip(VS.80).aspx" target="_blank"&gt;ContextMenuStrip&lt;/a&gt; erstellen und dem notifyIcon.ContextMenuStrip diesen zuweisen. Dadurch hat man dann ein nettes Menü. Viel Spaß dabei.&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1887" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>Master Detail Forms the WPFand Silverlight Way</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2009/07/15/master-detail-forms-the-wpf-silverlight-way.aspx</link><pubDate>Wed, 15 Jul 2009 14:22:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1733</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1733</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2009/07/15/master-detail-forms-the-wpf-silverlight-way.aspx#comments</comments><description>&lt;p&gt;Sometimes things are so easy that you just do not expect them to be that way. The problem is as old as databases and forms. You got an list and a detail form and you want to have it synchronized. There are a lot of solutions in the world to that problem, but there has never been one so easy like in WPF and Silverlight.&lt;/p&gt;
&lt;p&gt;In my example I have two texboxes and a listbox. The listbox is showing a list of adresses and the texboxes are displaying name and city. The trick begins with my &amp;quot;dataclass&amp;quot;. This one I call AdrLogic and it implements &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx" target="_blank"&gt;INotifyPropertyChanged&lt;/a&gt;. So it looks like that.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt; AdrLogic: INotifyPropertyChanged&lt;/pre&gt;&lt;pre class="csharpcode"&gt;In my case I fetchted the data from a webservice, but that is another story.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt; SilverLightServiceClient.AdrService.AdrServiceClient service = &lt;font color="#0000ff"&gt;new&lt;/font&gt; SilverLightServiceClient.AdrService.AdrServiceClient();&lt;/pre&gt;For my data I use an &lt;a href="http://msdn.microsoft.com/en-us/library/ms668604.aspx" target="_blank"&gt;ObservableCollection&lt;/a&gt;. &lt;pre class="csharpcode"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/ms668604.aspx" target="_blank"&gt;ObservableCollection&lt;/a&gt; &amp;lt;SilverLightServiceClient.AdrService.AdrData&amp;gt; AdressList&lt;/pre&gt;&lt;pre class="csharpcode"&gt;And I create an Index for my Collection and here goes the property change.&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&amp;nbsp;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CurrentIndex
        {
            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; currentindex; }
            set
            {
                currentindex = Math.Min(&lt;span class="kwrd"&gt;value&lt;/span&gt;, AdressList != &lt;span class="kwrd"&gt;null&lt;/span&gt; ? AdressList.Count - 1 : -1);
                OnPropertyChanged(&lt;span class="str"&gt;&amp;quot;CurrentIndex&amp;quot;&lt;/span&gt;);
                OnPropertyChanged(&lt;span class="str"&gt;&amp;quot;CurrentAdress&amp;quot;&lt;/span&gt;);
            }
        }
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; currentindex = -1;

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnPropertyChanged(&lt;span class="kwrd"&gt;string&lt;/span&gt; name)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(name));
        }&lt;/pre&gt;So I got a list with an current Index where every change is reported as is the change of the current index pointer. All I have to do now is to connect the data and the index to my XAML. &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt; &lt;span class="attr"&gt;IsReadOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Path=IsEmpty}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;12,12&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Left&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;span class="attr"&gt;VerticalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Top&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;120&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;22&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Path=CurrentAdress.Name, Mode=TwoWay}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt; &lt;span class="attr"&gt;IsReadOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Path=IsEmpty}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;12,40&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Left&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;span class="attr"&gt;VerticalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Top&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;120&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;22&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Path=CurrentAdress.City, Mode=TwoWay}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;140,12&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Left&amp;quot;&lt;/span&gt; &lt;br /&gt;   &lt;span class="attr"&gt;VerticalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Top&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;SelectedIndex&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Path=CurrentIndex, Mode=TwoWay}&amp;quot;&lt;/span&gt; &lt;br /&gt;    &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Path=AdressList}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DataTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt; &lt;span class="attr"&gt;Orientation&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Horizontal&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Name}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0,0,50,0&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding City}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DataTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;The TwoWay Binding is now doing all the synchronization for me. By binding the SelectedIndex to the CurrentIndex of the indexed Observable Collection, there is always the selected data in my detail form.&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1733" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/English/default.aspx">English</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>Media-Dateien, Fonts einbetten in WPF Anwendungen - Mini Tutorial</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2009/06/16/media-dateien-fonts-einbetten-in-wpf-projekten.aspx</link><pubDate>Tue, 16 Jun 2009 16:52:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1616</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1616</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2009/06/16/media-dateien-fonts-einbetten-in-wpf-projekten.aspx#comments</comments><description>&lt;p&gt;Der New Yorker Nick Thuesen schrieb in seinem Blog über das Einlagern von Fonts in einer Windows Presentation Foundation (WPF) Anwendung (&amp;quot;&lt;a href="http://www.nickthuesen.com/?p=8"&gt;Embedding and Referencing Fonts in your application and/or library&lt;/a&gt;&amp;quot;). Der Artikel beschreibt in Kürze die einfache Funktionalität, doch dass es im Endeffekt funktioniert - ist irgendwo auch ein Stück Zufall. In dem folgenden kleinen Artikel habe ich das Beispiel nach Orcas transferiert und zeige, dass die Einbettung von Resourcen nicht nur mit Fonts funktioniert, dass es sie auch in .Net 3.5 gibt - und warum es bei Nick vielleicht ein Zufall war ;-)&lt;/p&gt;
&lt;h2&gt;Aufsetzen des Projektes&lt;/h2&gt;
&lt;p&gt;Das WPF Projekt &amp;quot;EmbeddedResourceExample&amp;quot; wird über den Wizard erstellt und eine gleichnamige neue Solution angelegt. Wir verwenden Visual Studio 2008 und .Net 3.5, denn wir wollen ja schließlich was neues machen (ist natürlich nicht besonders neu, denn 3.5 unterscheidet sich hier kaum von der .Net 3.0 Version - aber es ist schön zu sehen, dass es funktioniert und aufwärts kompatibel bleibt).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Anlegen der Solution" src="http://www.codecomplete.de/blogs/xamlblog/embedding/solution.jpg" width="804" height="570" /&gt;&lt;/p&gt;
&lt;p&gt;Als nächstes erzeugen wir eine Bibliothek. Wir verwenden eine &lt;strong&gt;ClassLibrary&lt;/strong&gt;. Zwar benötigen wir keine extra C# Klassen für den hier gezeigten Fall, aber der Overhead ist recht klein und in einem realen Projekt würden die Resourcen vermutlich mit entsprechend passenden Klassen zur Resourcenmanipulation begleitet. Die dabei erzeugte Klasse &amp;quot;Class1.cs&amp;quot; können wir aber beruhigt löschen - die braucht kein Mensch.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Anlegen der Library" src="http://www.codecomplete.de/blogs/xamlblog/embedding/library.jpg" width="804" height="570" /&gt;&lt;/p&gt;
&lt;p&gt;Wichtig ist es, die Bibliothek sofort als &lt;strong&gt;Referenz&lt;/strong&gt; einzutragen, sonst stehen die Resourcen nicht zur Verfügung.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Als Referenz eintragen" src="http://www.codecomplete.de/blogs/xamlblog/embedding/reference.jpg" width="482" height="406" /&gt;&lt;/p&gt;
&lt;h2&gt;Einbetten von Bildern und Fonts&lt;/h2&gt;
&lt;p&gt;&lt;img style="FLOAT:right;" alt="Ansicht auf den Solution Explorer" src="http://www.codecomplete.de/blogs/xamlblog/embedding/solutionexplorer.jpg" width="227" height="509" /&gt;Dann werden die Ordner für Fonts und Bilder angelegt. Mit Hilfe von Drag&amp;amp;Drop sammeln wir uns die Fonts und die Bilder zusammen, die wir benötigen. Beim Drag&amp;amp;Drop werden die Bilder automatisch kopiert und in die korrekten Verzeichnisse gelegt.&lt;/p&gt;
&lt;p&gt;Die Solution sollte nun so aussehen wie rechts zu sehen.&lt;/p&gt;
&lt;p&gt;Nun müssen die kopierten Dateien mit dem korrekten Property versehen werden. Das betreffende Property &amp;quot;Build Action&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Properties" src="http://www.codecomplete.de/blogs/xamlblog/embedding/properties.jpg" width="275" height="239" /&gt;&lt;/p&gt;
&lt;p&gt;muss auf den Wert &amp;quot;&lt;strong&gt;Resource&lt;/strong&gt;&amp;quot; (&lt;span class="style1"&gt;&lt;u&gt;NICHT&lt;/u&gt;&lt;/span&gt; als &amp;quot;Embedded Resource&amp;quot;) gesetzt werden. Die restlichen Einstellungen sind meist schon korrekt. So dürfen die Dateien nicht in das Output Verzeichnis kopiert werden (&amp;quot;Copy to Output Directory&amp;quot; = &amp;quot;Do not copy&amp;quot;).&lt;/p&gt;
&lt;p&gt;Wichtig für den weiteren Prozess des Ausprobierens ist es, noch kein Build durchzuführen. Bei einem realen Projekt würde dies allerdings nicht sofort nach Zufügen und setzen der Properties erfolgen.&lt;/p&gt;
&lt;h2&gt;Das Coding&lt;/h2&gt;
&lt;p&gt;Besonders komplizierter Source Code erwartet uns auf den ersten Blick nicht. Wir tragen folgendes in die Datei &amp;quot;Window1.xaml&amp;quot; ein.&lt;/p&gt;
&lt;div style="BORDER-BOTTOM:1px solid;BORDER-LEFT:1px solid;PADDING-BOTTOM:3px;LINE-HEIGHT:normal;BACKGROUND-COLOR:#ffffcc;MARGIN:4px;PADDING-LEFT:3px;PADDING-RIGHT:3px;FONT-FAMILY:&amp;#39;Courier New&amp;#39;, Courier, Monospace;FONT-SIZE:medium;BORDER-TOP:1px solid;BORDER-RIGHT:1px solid;PADDING-TOP:3px;"&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Window&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; x&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;:&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Class&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;EmbeddedResourceExample.Window1&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;xmlns&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/a&gt;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;xmlns&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;:&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;x&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/a&gt;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Title&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;Embedded Resources&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; Height&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;500&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; Width&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;520&amp;quot;&amp;gt;&lt;/p&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;StackPanel&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; Margin&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;10&amp;quot;&amp;gt;&lt;/p&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;lt;!--Use Font Embedded In Exe--&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;TextBlock&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; FontFamily&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;/Fonts/#Federation&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; FontSize&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;25&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; Text&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;Embedded Font aus der Anwendung&amp;quot; /&amp;gt;&lt;/p&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;lt;!--Use Font Embedded In Library--&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;TextBlock&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; FontFamily&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;/EmbeddedResourceLibrary;Component/Fonts/#FederationDS9Title&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; FontSize&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;25&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; Text&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;Embedded Font aus der Bibliothek&amp;quot; /&amp;gt;&lt;/p&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;lt;!--Use Picture Embedded In Library--&amp;gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Image&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;Name&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;xtopia&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; Height&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;375&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; Width&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;500&amp;quot;&lt;/font&gt;&lt;font color="#ff0000" size="2"&gt; Source&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;=&amp;quot;/EmbeddedResourceLibrary;Component/Pictures/xtopia.jpg&amp;quot; /&amp;gt;&lt;/p&gt;&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;StackPanel&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt; 
&lt;p&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;Window&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;gt;&lt;/p&gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;Aber sofort nach dem Eintragen des XAML erhalten wir eine Menge von Fehlern, die darauf beruhen, dass die Resourcen Bibliothek &amp;quot;EmbeddedResourceLibrary&amp;quot; noch nicht erstellt wurde und daher nicht gefunden werden kann.&lt;/p&gt;
&lt;h2&gt;Das Ergebnis&lt;/h2&gt;
&lt;p&gt;Also werfen wir ein &amp;quot;Rebuild All&amp;quot; an, damit auch alles korrekt erstellt wird. Kurz daraufhin sehen wir folgendes Bild in Visual Studio 2008.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Das Ergebnis in Orcas" src="http://www.codecomplete.de/blogs/xamlblog/embedding/visualstudio.jpg" width="554" height="529" /&gt;&lt;/p&gt;
&lt;p&gt;Wir sehen also, dass &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; in der vorliegenden Beta 2 nicht die Fonts benutzt, die wir als Resourcen hinterlegt haben. Das gleiche Ergebnis erwartet uns in der Preview von &lt;strong&gt;Expression Blend&lt;/strong&gt; 2. Die Fonts werden einfach nicht im Designmode verwendet.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Das gleiche in Blend" src="http://www.codecomplete.de/blogs/xamlblog/embedding/inblend.jpg" width="545" height="534" /&gt;&lt;/p&gt;
&lt;p&gt;Drücken wir aber &amp;quot;F5&amp;quot;, so erhalten wir genau das, was wir wollten.&lt;/p&gt;
&lt;p&gt;&lt;img style="BORDER-BOTTOM:1px solid;BORDER-LEFT:1px solid;BORDER-TOP:1px solid;BORDER-RIGHT:1px solid;" alt="Die Anwenung läuft" src="http://www.codecomplete.de/blogs/xamlblog/embedding/running.jpg" width="715" height="601" /&gt;&lt;/p&gt;
&lt;h2&gt;Tipps und Tricks&lt;/h2&gt;
&lt;p&gt;Als erstes will ich aufklären, warum Nicks Beispiel nur per Zufall funktionierte und leicht jeden anderen verwirren kann. &lt;/p&gt;
&lt;h3&gt;Fontnamen sind keine Dateinamen&lt;/h3&gt;
&lt;p&gt;Wie man im Coding und in dem Solution Explorer erkennt, unterscheidet der entsprechende Resource-Loader zwischen &lt;strong&gt;Fontnamen&lt;/strong&gt; und &lt;strong&gt;Dateinamen&lt;/strong&gt; bei Fonts. Es werden grundsätzlich Fontnamen ausgewertet, egal wie der Name der Datei lautet. Bei Nick war dies identisch, daher funktionierte es - ich wählte hier extra sehr unterschiedliche Namen.&lt;/p&gt;
&lt;h3&gt;Bibliotheken, Namen und Ordner&lt;/h3&gt;
&lt;p&gt;Bei der Verwendung von Bibliotheken für Resourcen, was ich unbedingt empfehlen würde, muss die Notation &amp;quot;/EmbeddedResourceLibrary;Component/&amp;quot; (also Bibliotheksname) beachtet werden. Ordnernamen kommen dahinter (siehe Coding).&lt;/p&gt;
&lt;h3&gt;Performanz und Speicher&lt;/h3&gt;
&lt;p&gt;Die übermäßige Verwendung von in Programmcode oder Bibliothekn eingebetten Resourcen sorgt zwar für ein schnelles Ladeverhalten bei der Darstellung, nicht aber beim Programmstart. DLLs werden geladen und verbleiben im Speicher. Wer darauf achten muss oder will, der sollte eine dynamischere Variante verwenden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;p.s.&lt;br /&gt;Das Photo für das Beispiel entlieh ich aus Marc Thiele &lt;/em&gt;&lt;a href="http://www.flickr.com/search/?q=Jens%20Peter%20Kleinau&amp;amp;w=77868772%40N00" target="_blank"&gt;&lt;em&gt;Flickr&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;Bibliothek und zeigt mich und Carlo Blatz auf der XTopia 2007 bei unserem Track,&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1616" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Resources/default.aspx">Resources</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>WPF4Beginners: verrückte Wege für das Layout gleichgroßer Elemente</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2009/05/25/wpf4beginners-verr-252-ckte-wege-f-252-r-das-layout-gleichgro-223-er-elemente.aspx</link><pubDate>Mon, 25 May 2009 16:52:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1852</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1852</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2009/05/25/wpf4beginners-verr-252-ckte-wege-f-252-r-das-layout-gleichgro-223-er-elemente.aspx#comments</comments><description>&lt;p&gt;Es gibt &lt;a href="http://en.wikipedia.org/wiki/50_Ways_to_Leave_Your_Lover" target="_blank"&gt;50 Wege die Freundin (den Freund)&lt;/a&gt; zu verlassen und etliche davon führen nach Rom. In einer Kaffeepause haben wir gegrübelt, wieviele Möglichkeiten es geben mag, gleichgroße Elemente in einem WPF Fenster unterzubringen. Hier sind die ersten Methoden. Für die gleichgroßen Elemente verwende ich in den Beispielen Buttons. Die Nachahmung ist nur bedingt zu empfehlen ;-)&lt;/p&gt;
&lt;h3&gt;Gridlayout&lt;/h3&gt;
&lt;p&gt;Über das Layout mit einem Grid kann die Größe durch die ColumnDefinitions und RowDefinitions festgelegt werden. Die Elemente werden durch die Zuordnung zu Spalten und Reihen in der Größe definiert. Will ich nun die Buttons verändern, muss ich die Spalten- und Reihendefinitionen verändern. Damit habe ich fast perfekt das Layout im Griff, allerdings immer noch mehr als eine Stelle, in welcher ich die Größe ändern muss.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Sizer&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Column&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Column&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Column&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Column&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Das Ergebnis sieht so aus:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/WPF/Gridlayout.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Layout per Style und Stackpanel&lt;/h3&gt;
&lt;p&gt;Das Stackpanel sortiert recht hübsch jeweils nach Vertikal oder Horizontal meine Elemente. Über Styles kann ich Werte eines Elementtypen festlegen. Dabei muss ich mich spezifischer dem Zieltypen (Tagettype) nähern, je typischer die zu beeinflussenden Eigenschaften (Properties) sind. Bei Höhe und Breite kann ich recht abstrakt bleiben und bin bei dem FrameworkElement noch gut aufgehoben.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Sizer&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FrameworkElement&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Width&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Height&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Margin&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0,0,10,10&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt; &lt;span class="attr"&gt;Orientation&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Horizontal&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource Sizer}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource Sizer}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt; &lt;span class="attr"&gt;Orientation&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Horizontal&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource Sizer}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource Sizer}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Das sieht dann so aus. Der Nachteil wird dabei deutlich. Ich habe zwar nur eine Stelle, an der ich die Größe und die Abstände ändern muss, aber wenn ich später noch mehr Eigenschaften über Styles ändern will, muss ich sie kaskadieren oder mit BasedOn vererben und die Verwaltung und Organisiation von Styles in größeren Anwendungen ist ein Buchkapitel für sich.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/WPF/StackStyle.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Layout per DataBinding und WrapPanel&lt;/h3&gt;
&lt;p&gt;Das Wrappanel stapelt vorzugsweise horizontal und wenn das nicht klappt beginnt es eine neue Reihe. Die Breite, Höhe und Abstand der Elemente wird nun über ein Master-Element bestimmt, an dessen Properties die anderen Elemente sich orientieren. Die Orientierung erfolgt per Datenbindung. D.h. die gebundenen Eigenschaften des gebundenen Elements sind gleich der Eigenschaften des Masters.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;WrapPanel&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;220&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Sizer&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0,0,10,10&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Width}&amp;quot;&lt;/span&gt; 
            &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Height}&amp;quot;&lt;/span&gt; 
            &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Margin}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Width}&amp;quot;&lt;/span&gt; 
            &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Height}&amp;quot;&lt;/span&gt; 
            &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Margin}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Width}&amp;quot;&lt;/span&gt; 
            &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Height}&amp;quot;&lt;/span&gt; 
            &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Sizer, Path=Margin}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;WrapPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Das ist mit Sicherheit die lustigste Art und Weise, gleichförmige Elemente zu erzeugen. Das Spannende daran ist, dass sie einiges an Vorteilen bietet: ich habe nur eine Stelle zum Ändern und alle nicht betroffenen Eigenschaften kann ich munter über Styles manipulieren. Der Nachteil (neben den schlecht lesbaren XAML Code) ist die kaum nachvollziehbare Struktur einer etwas komplexen Maske. Es gibt keine Darstellung, in welcher das Databindung erkennbar wäre.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/WPF/WrapDatabindung.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Noch mehr Möglichkeiten?&lt;/h3&gt;
&lt;p&gt;Es sind uns noch andere Möglichkeiten eingefallen: von eigenen Controls (Custom, User), Templates in Itemlisten, ValueConverter für Größe und so weiter und so fort. Ob ich diese mal in einer ruhigen Minute aufzählen werde, weiß ich nicht. Die obigen Beispiele fand ich recht gut, um kurz und knackig mal die Layout Container, Styles und Databinding anzuschneiden. Wer Lust und Zeit hat, in dem eigenen Blog oder per Mail weitere verrrückte Wege für das Layout gleichgroßer Elemente aufzuzeigen, den verlinke ich hier gerne oder schreibe doch einfach einen Kommentar oder ein Trackback zu deinem Blog. Ich bin neugierig, ob sich jemand was wirklich schräges einfallen lässt.&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1852" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>WPF Animations On Slow Systems</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2009/02/10/wpf-animations-on-slow-systems.aspx</link><pubDate>Tue, 10 Feb 2009 12:22:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:66</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;There is always the&amp;nbsp;demand that the new&amp;nbsp;fancy application with all the animations has to do exactly the same job&amp;nbsp;on slow office machines&amp;nbsp;as on high end gaming engines.&amp;nbsp;There are serveral ideas and recommodations to reach that goal.&amp;nbsp;But&amp;nbsp;most of them will lead only to failure. And that is why.&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;Usually animations are measured in Frames. Let us start with a simple example (the following is harshly exaggerated but based on a real case with a complex animation. But for just making the point it is sufficient).&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;The ball has to reach the wall dropping two times on the ground before. The Animation is shown in 15 Frames.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt; 
&lt;p&gt;&lt;font color="#ffffff"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;table style="BORDER-BOTTOM:medium none;BORDER-LEFT:medium none;BORDER-COLLAPSE:collapse;BORDER-TOP:medium none;BORDER-RIGHT:medium none;mso-border-alt:solid windowtext .5pt;mso-yfti-tbllook:480;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:.5pt solid windowtext;mso-border-insidev:.5pt solid windowtext;" class="MsoTableGrid" cellspacing="0" cellpadding="0"&gt;

&lt;tr style="HEIGHT:20pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:23.95pt;mso-yfti-irow:1;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:19pt;mso-yfti-irow:2;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:19pt;mso-yfti-irow:3;mso-yfti-lastrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;2&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;3&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;4&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;5&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;6&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;7&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;8&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;9&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;10&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;11&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;12&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;13&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;14&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;15&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font color="#ffffff" face="Times New Roman"&gt;.&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;In a system capable of showing 10 frames per seconds the animation will be done in 1,5 seconds. A gaming system with 30 frames per seconds will be finished one second earlier.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;That is not what we want. After all the sound team developed a superb soundfile for two plopps and one bang with an exact duration of one second.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;So we use DoubleAnimation for our bouncing ball setting a duration and start again. And to no surprise it works in time. But alas the animation is looking awful like a robotic pacman on the gaming system and looks like that on the slow office system:&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;table style="BORDER-BOTTOM:medium none;BORDER-LEFT:medium none;BORDER-COLLAPSE:collapse;BORDER-TOP:medium none;BORDER-RIGHT:medium none;mso-border-alt:solid windowtext .5pt;mso-yfti-tbllook:480;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:.5pt solid windowtext;mso-border-insidev:.5pt solid windowtext;" class="MsoTableGrid" cellspacing="0" cellpadding="0"&gt;

&lt;tr style="HEIGHT:20pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:23.95pt;mso-yfti-irow:1;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:19pt;mso-yfti-irow:2;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:19pt;mso-yfti-irow:3;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;2&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;3&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;4&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;5&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;6&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;7&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;8&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;9&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;10&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;11&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;12&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;13&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;14&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;15&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:19pt;mso-yfti-irow:4;mso-yfti-lastrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:431.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;" colspan="15"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;t = 1 second&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;&lt;font color="#ffffff"&gt;.&lt;br /&gt;&lt;/font&gt;So our next try is DoubleAnimationUsingKeyFrames and we are using SplineDoubleKeyFrames to make the ball bounce more realistic. Now it really looks cool on the gaming system, synchronous to the soundfile and everybody seems to be happy. But as old Murphy told us, something always goes wrong. In this case it is the old office system or the NVIDIA driver on the presentation Laptop. The ball does not bounce at all, it jumps.&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; &lt;br /&gt;&lt;font color="#ffffff"&gt;.&lt;/font&gt; 
&lt;table style="BORDER-BOTTOM:medium none;BORDER-LEFT:medium none;BORDER-COLLAPSE:collapse;BORDER-TOP:medium none;BORDER-RIGHT:medium none;mso-border-alt:solid windowtext .5pt;mso-yfti-tbllook:480;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:.5pt solid windowtext;mso-border-insidev:.5pt solid windowtext;" class="MsoTableGrid" cellspacing="0" cellpadding="0"&gt;

&lt;tr style="HEIGHT:20pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:20pt;BORDER-TOP:windowtext 1pt solid;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:23.95pt;mso-yfti-irow:1;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;O&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;O&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:23.95pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:19pt;mso-yfti-irow:2;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;O&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:19pt;mso-yfti-irow:3;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;2&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;3&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.75pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;4&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;5&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;6&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;7&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;8&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;9&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;10&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;11&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;12&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;13&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;14&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;15&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:19pt;mso-yfti-irow:4;mso-yfti-lastrow:yes;"&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:windowtext 1pt solid;PADDING-BOTTOM:0cm;BACKGROUND-COLOR:transparent;PADDING-LEFT:5.4pt;WIDTH:431.8pt;PADDING-RIGHT:5.4pt;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;" colspan="15"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;t = 1 second&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style="BORDER-BOTTOM:windowtext 1pt solid;BORDER-LEFT:#f0f0f0;PADDING-BOTTOM:0cm;PADDING-LEFT:5.4pt;WIDTH:28.8pt;PADDING-RIGHT:5.4pt;BACKGROUND:maroon;HEIGHT:19pt;BORDER-TOP:#f0f0f0;BORDER-RIGHT:windowtext 1pt solid;PADDING-TOP:0cm;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&lt;font color="#ffffff"&gt;.&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;Beside the fact, that this simple animation eats up 25 percent of CPU power, it still looks awful.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;And what do we learn?&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;You cannot produce nice looking time-based animations on an old office system with WPF?&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;Sadly that is true. There are some ways to work around that problem, using &lt;/font&gt;&lt;/span&gt;&lt;code&gt;&lt;span style="FONT-SIZE:10pt;mso-ansi-language:EN-GB;"&gt;CompositionTarget.Rendering &lt;/span&gt;&lt;/code&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;or develop a own animation class and manipulate the value based on timespans. But there is no way to create a clean and nice looking animation with standard classes for slow systems.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;You can always rely on the old Flash bag of tricks (e.g. using two animations based on clock controlled value changes with a second animation as a washed shadow of the moving ball). But like Iron Maiden singer Bruce Dickinson once stated: &amp;quot;Oh no sorry, you can&amp;#39;t play heavy metal with a synthesizer.&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;font size="3" face="Times New Roman"&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;As I said, this is highly exaggerated, and nobody should be afraid of bouncing a ball with WPF on any computer system capable of carrying Vista. But when it comes to complex 3D animations, stop the marketing department from spreading promises nobody can keep.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;em&gt;p.s.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;span style="mso-ansi-language:EN-GB;"&gt;&lt;em&gt;Few years later since the album Somewhere In Time (1986) Iron Maiden started to use synthesizers.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;/font&gt;&lt;/span&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=66" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Animation/default.aspx">Animation</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/English/default.aspx">English</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>Fade away - Opacity Blending von Masken</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2009/01/28/fade-away-opacity-blending-von-masken.aspx</link><pubDate>Wed, 28 Jan 2009 11:57:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:46</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=46</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2009/01/28/fade-away-opacity-blending-von-masken.aspx#comments</comments><description>&lt;p&gt;Um Masken ein- oder auszublenden scheint die entsprechende Animations sehr simpel. Man nehme schlicht und ergreifend die Maske, schenke ihr eine DoubleAnimation und reduziere das OpacityProperty in einem angemessenen Zeitraum auf den Wert 0. Doch leider stellt man fest, dass die auszublendende Maske im Ausblenden genauso anklickbar ist, wie im normalen Maskenleben.&lt;/p&gt;
&lt;p&gt;&lt;a id="more-5"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Einfallsreiche legen dann einen Canvas als Klickschutz darüber, um das Klicken zu unterbinden und es scheint, dass nun das unverklickbare Ausblenden gerettet ist. Doch damit das gut funktioniert müssen folgende Bedingungen gültig sein.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Der neue Klickschutz-Canvas muss im Z-Layer über allen anderen Masken liegen. 
&lt;li&gt;Die nun anzuzeigenden Masken (Einblendung) müssen im Z-Layer unter den alten Masken liegen. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Will man die gesamte Maske aus- oder einblenden, dann ist das noch relativ leicht machbar. Doch will man einzelne Masken nachladen und dabei einblenden, so muss man diese in einen neuen Canvas kopieren (parent, ist hier im Codebeispiel ein Panel, welches die auszublendenden Maskenteile enthält).&lt;/p&gt;&lt;pre class="csharpcode"&gt;blender = &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; Canvas();blender.Width = ((Panel)parent).ActualWidth;
blender.Height = ((Panel)parent).ActualHeight;
newblender = &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/span&gt;;UIElement[] arr =
       &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; UIElement[((Panel)parent).Children.Count];
((Panel)parent).Children.CopyTo(arr,0);
((Panel)parent).Children.Clear();
&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;/span&gt; (UIElement ele &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;/span&gt; arr)
{
&amp;nbsp;   blender.Children.Add(ele);
}&lt;/pre&gt;
&lt;p&gt;Insgesamt eine recht einfache Sache, doch irgendwie lästig. Das geht auch eleganter.&lt;/p&gt;
&lt;p&gt;Man nehme die wunderbare Klasse “RenderTargetBitmap”, verwende die festgezimmerte Bildschirmauflösung von 96dpi und mache einen Screenshot von den Elementen, die auszublenden sind.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt; SnapIt(Panel blender){       

&amp;nbsp;   RenderTargetBitmap rtb = &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;
               RenderTargetBitmap((&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt;)blender.ActualWidth,
&amp;nbsp;              (&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt;) blender.ActualHeight,
&amp;nbsp;              96d, 96d, PixelFormats.Pbgra32);       

&amp;nbsp;   rtb.Render(blender);
&amp;nbsp;   Image img = &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; Image();
&amp;nbsp;   img.Source = rtb;      blender.Children.Clear();   &amp;nbsp;
    blender.Children.Add(img);
&amp;nbsp;   DoubleAnimation dba = &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; DoubleAnimation(1d, 0,
         &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; Duration(TimeSpan.FromSeconds(opacityBlendingSeconds)));       

&amp;nbsp;   dba.Completed += &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; EventHandler(blender_Completed);
&amp;nbsp;   blender.BeginAnimation(Image.OpacityProperty, dba);
}&lt;/pre&gt;
&lt;p&gt;Damit sich das auch sauber beendet wird noch am Ende der Animation der Eventhandler aufgerufen, der schließlich das Image wieder entfernt.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt; blender_Completed(&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt; sender, EventArgs e)
{       

&amp;nbsp;   &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt; (sender != &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt; &amp;amp;&amp;amp; sender &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;is&lt;/font&gt;&lt;/span&gt; Image
&amp;nbsp;       &amp;amp;&amp;amp; ((Image)sender).Parent != &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;
&amp;nbsp;       &amp;amp;&amp;amp;  ((Image)sender).Parent &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;is&lt;/font&gt;&lt;/span&gt; Panel)
&amp;nbsp;   {
&amp;nbsp;       &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;lock&lt;/font&gt;&lt;/span&gt; (sender)
&amp;nbsp;       {
&amp;nbsp;           ((Image)sender).Visibility = Visibility.Hidden;
&amp;nbsp;           ((Panel)((Image)sender).Parent).Children.Remove(((Image)sender));
&amp;nbsp;       }
&amp;nbsp;   }
}&lt;/pre&gt;
&lt;p&gt;Nicht vergessen sollte man, dasss man mit mehreren Threads arbeitet, also munter Exception fangen und behandeln (hier im Codebeispiel verzichte ich aus Platzgründen auf die entsprechende Fehlerbehandlung).&lt;br /&gt;&lt;em&gt;Insgesamt kann man mit den Screenshots (genauer dem Rendern in eine Bitmap) recht gut arbeiten. Es sind eine Menge Effekte denkbar, nicht nur das Aus- und Einblenden.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=46" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Animation/default.aspx">Animation</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>WPF4Beginners: UniformGrid - wozu braucht man den?</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2008/11/25/wpf4beginners-uniformgrid-wozu-braucht-man-den.aspx</link><pubDate>Tue, 25 Nov 2008 16:11:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1848</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1848</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2008/11/25/wpf4beginners-uniformgrid-wozu-braucht-man-den.aspx#comments</comments><description>&lt;p&gt;Die Klasse &lt;a class="" href="http://msdn.microsoft.com/de-de/library/system.windows.controls.primitives.uniformgrid.aspx" target="_blank"&gt;UniformGrid&lt;/a&gt; ist eine der wenig beachteten in dem .Net 3.5 Framework. Dabei ist sie recht praktisch in der Anwendung. Sie sorgt dafür, dass sämtliche darin enthaltenen Zellen und Spalten die gleiche Größe haben. Sie ist damit die einfache aber auch stark limitierte Version des bekannten Grids. Der typische Anwendungsfall ist die Tastatur eines Taschenrechners. Dabei fallen sofort zwei Sachen auf.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/WPF/uniformgrid.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Es wird nur einmal der Platzbedarf eines Buttons definiert. Dieser gilt danach für alle weiteren, da die Zellenhöhe und -breite feststehen. Und es gibt auch nur einen &lt;strong&gt;Button.Click&lt;/strong&gt;. Dieser wird in dem Grid verdrahtet und leitet als Routed Event das Klick Ereignis weiter. Dieses wird im Code Behind gefangen und die Quelle des Ereignisses wird überprüft.&lt;/p&gt;
&lt;p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UniformGrid_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    Button button = e.Source &lt;span class="kwrd"&gt;as&lt;/span&gt; Button;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (button != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; button.Content &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        &lt;span class="kwrd"&gt;switch&lt;/span&gt; (button.Content &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;)
        {
            &lt;span class="rem"&gt;// irgendwelche Mathefunktionen&lt;/span&gt;
            &lt;span class="kwrd"&gt;default&lt;/span&gt;:
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.Textfeld.Text += button.Content &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;;
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
        }
        
    }
}&lt;/pre&gt;
&lt;p&gt;Im Grunde also eine sehr einfache Sache, ein Bedienfeld irgendeiner Art zu gestalten.&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1848" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>XTOPIA 2008: WPF Anwendungen optimieren</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2008/11/17/xtopia-2008-wpf-anwendungen-optimieren.aspx</link><pubDate>Mon, 17 Nov 2008 17:17:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1804</guid><dc:creator>jpkleinau</dc:creator><slash:comments>1</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1804</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2008/11/17/xtopia-2008-wpf-anwendungen-optimieren.aspx#comments</comments><description>&lt;font size="2"&gt;
&lt;p&gt;Ein für mich interessanter Track war derjenige von Dirk Primbs mit dem Thema &amp;quot;WPF Anwendungen optimieren&amp;quot;. Dirk Primbs hat den Job als Evangelist bei Microsoft und soll Technologie Wissen unter das Volk bringen.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/xtopia2008/XTOPIA%20016.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Dirk baute seinen Vortrag von Grund auf und erklärte das Threading Modell von WPF auf Dummy Niveau um das Retaining von WPF zu erklären. Dann ging er über die die Elemente des Visual Trees zu der Erklärung, warum viele Elemente langsam sind, da sie den Rendering Thread belasten. Dazu kommt noch, dass die Elemente mit Hittests und anderen UI Events das System belasten. Das stimmt zwar zum großen Teil, ist aber eigentlich eine Kinderweisheit. Aber man muss Dirk einfach recht geben, selbst &amp;quot;Kinderweisheiten&amp;quot; werden immer wieder missachtet.&lt;/p&gt;
&lt;p&gt;Das kann Dirk auch an einem Beispiel zeigen. Er verwendet das Photo Demo aus dem SDK und zeigt anhand des SNOOP Tools, das sich an die WPF Anwendungen hängt. Mit dem Tool hält er sich eine Weile auf. Das Tool ist nicht allzuschlecht. Es ist eine WPF des Spy++ Fensterspions.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/xtopia2008/XTOPIA%20018.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Das nächste Tool, das Dirk vorstellt, ist die WPF Performance Suite. Der optisch wenig gut gestylte Werkzeug enthält 5 gute Werkzeuge. Das Tool will als Admin starten und erwartet das auch von den Programmen. Mit dem &amp;quot;Perforator&amp;quot; Werkzeug schaut sich Dirk über &amp;quot;Launch Application&amp;quot; den Photostore erneut an. Der Perforator zeigt in mehreren Charts verschiedene Werte für die Anwendung an, unter anderem Frame Rate (wichtig für gut laufende Animationen), Video Speicher (die Menge des verbrauchten Video Speichers ist für Hardware und Software Rendering interessant), HWT IRT per Frame für Zwischenbitmaps beim Rendern, SW IRTs per Frame, Dirty Recht Addition Rate. Mit den Optionen kann man sich die Software Rendered Bereiche farbig anzeigen lassen. Farbig kann man sich auch die Aktualisierungen in der Oberfläche anzeigen lassen. Mit weiteren Optionen kann man sich die Auswirkungen von Optionen anschauen.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/xtopia2008/XTOPIA%20019.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Ein weiteres Werkzeug aus der Performance Suite ist der Visual Profiler. Mit diesem kann man erkennen, welche Zeit in welchen Aktionen verloren geht. Spannend ist in dem Tool der &amp;quot;Unlabled Time&amp;quot; Block, der die Auswirkungen des eigenen Codes auf WPF anzeigt. Im Element Tree Hot Path kann man sich die Elemente anzeigen lassen, die heftig CPU Zeit verbrauchen.&lt;/p&gt;
&lt;p&gt;Natürlich entdeckt Dirk in dem Photo Demo einen Bitmap Effekt. Diese werden in der aktuellen Version von .Net 3.x noch per Software gerendert. Dies wird sich voraussichtlich ändern. Bereits mit dem Service Pack für .Net 3.5 wird das Drop Shadow per Hardware erzeugt - weitere werden folgen. Doch aktuell bringt das richtig Performanz darauf zu verzichten.&lt;/p&gt;
&lt;p&gt;Um uns ein wenig Spaß zu gönnen, wirft Dirk ein 80 Photos mit ordentlich Megapixel dem Photo Demo vor. Das dauert und dauert und schließlich zieht die Demo 1,2 GB an Speicher. Das Demo hat sich die Bilder als Vollformatbilder geholt und entsprechend aufgebohrt. Durch das einfache Databinding des Source des &amp;lt;Image /&amp;gt; an das Bild wird der Speicher verbraten. Durch die Verwendung des BitmapImage Objektes beispielsweise durch einen Konverter (IValueConverter) oder durch die Änderung des ObjectDataProviders also in den Daten. Dadurch reduzierte er die Daten auf auf 40 MB bei gleicher Datenmenge.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codecomplete.de/blogs/xamlblog/xtopia2008/XTOPIA%20023.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Dirk zeigte in seiner sehr guten Session, dass Anwendungen in WPF schlank und schnell sein können. Doch dazu muss man ein wenig Wissen über den internen Aufbau des .Net Frameworks haben. Wer einfach vor sich hin programmiert oder zeichnet, kann sehr schnell in Fallen laufen, die sich leicht hätten vermeiden lassen. Allerdings ist dazu zu sagen, dass Microsoft viele dieser Fallen bereits in Patches und zukünftigen Versionen adressiert hat und das Framework anpasst. Dies betrifft vor allen Windows 7 und .Net 4.x. Trotzdem schadet es auf keinen Fall, eine Anwendung ordentlich zu optimieren.&lt;/p&gt;&lt;/font&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1804" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Events/default.aspx">Events</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/XTOPIA/default.aspx">XTOPIA</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>WPF TreeView und bubbling Events mal genauer</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2008/02/22/wpf-treeview-und-non-bubbling-events-mal-genauer.aspx</link><pubDate>Fri, 22 Feb 2008 13:29:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1668</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1668</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2008/02/22/wpf-treeview-und-non-bubbling-events-mal-genauer.aspx#comments</comments><description>&lt;p&gt;Mein Kollege &lt;strong&gt;Nikolay R. Nikolov&lt;/strong&gt; arbeitet mit mir gemeinsam an einem spannenden Projekt im Bereich der Steuern/Finanzen. Bei seinen Forschungen mit Visual Studio 2008 und .Net 3.5 findet er das eine oder andere Blümchen der Programmierkunst. Ich habe ihn gebeten eine besonders hübsche Blume zu pflücken und hier ist sie: &lt;/p&gt;
&lt;p&gt;&lt;font color="#66cc00" size="4"&gt;&lt;strong&gt;Wenn der Postmann zweimal klingelt&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Die Entwicklung von WPF Anwendungen führt manchmal zu erstaunlichen Situationen, die jedoch logisch erklärbar sind. Ein nettes Beispiel ist das Abfangen von Events wie „DoubleClick“ auf ein TreeViewItem Objekt innerhalb eines TreeView’s. Ich hab es probiert und wurde geradewegs mit Folgendem konfrontiert: 
&lt;p&gt;Das Event kommt mehrfach (im konkreten Fall zwei mal) an. Der allererste Gedanke, dass man aus Versehen einen „SingleClick“ abgefangen hat, ist falsch. 
&lt;p&gt;Der zweite, dass man xxEventArgs (im Weiteren einfach args gennant), also args.Handled = true beim ersten Ankommen setzen sollte, erweist sich auch als falsch: denn beim zweiten Mal kommt es mit args.Handled == false wieder. 
&lt;p&gt;Der Programmierer schaut nun erst jetzt auf den sender Parameter und da hat man die Lösung des Rätsels: das erste Mal ist der Sender das „eigene“ TreeViewItem (oder this in C#), das zweite Event kam bei mir mit sender == root (oder die TreeViewItem-Wurzel). 
&lt;p&gt;Zufälligerweise lag im Moment das angeklickte Objekt in der ersten Verästelung im Baum, sonst würde das Eventsignal entsprechend der Tiefe des Knotens oft auftreffen. Und vollkommen logisch ist das zudem auch. Wenn man in Visual Studio mit Mole auf den physischen Baum (das VisualTree) schaut, lernt man, dass expandierte Knoten (TreeViewItem’s) im TreeView duch ein Expander realisiert sind, und der Expander enthält seine Kinder, d.h. wenn man auf die Fläche eines TreeViewItem’s klickt, klickt man auch auf die Fläche jedes anderen expandierten Knoten rückwärts in der Baum-Hierarchie. Die Reihenfolge der Events ist jetzt auch logisch: vom innersten zum obersten. Und mit „bubbling“ Events lässt sich dies nicht erklären, sonst würde beim Setzen von Handled=true das Ereignis als abgearbeitet gesetzt bleiben. Es sind eben die „persönlichen“ Events – der hierarchisch höher liegenden Knoten, die man normalerweise gar nicht abfangen will (zumindest nicht, bevor man den Nutzen darin erkannt hat). 
&lt;p&gt;Die Erkenntnis ist folglich (C# Fragment): &lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; OnDoubleClick ( &lt;span class="kwrd"&gt;object&lt;/span&gt; sender, MouseButtonEventArgs args )
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; ( sender != &lt;span class="kwrd"&gt;this&lt;/span&gt; ) &lt;span class="rem"&gt;// Ignore event when not for me (but for child items of mine)&lt;/span&gt;
        &lt;span class="kwrd"&gt;return&lt;/span&gt;;
    ...
    args.Handled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
);
&lt;/pre&gt;
&lt;p&gt;Am Anfang der Behandlung des Event’s muss man darauf vorbereitet sein, dass es nicht nur für „mich“ passiert. TreeView sollte man als typisches WPF Control wahrnehmen. Bei seiner Benutzung lernt man, dass der innere Aufbau trotzdem nicht „gekapselt“ ist, sondern „nach außen durchschlägt“ und von Bedeutung ist. 
&lt;p&gt;Bitte beachten: Komplexere Fälle, z.B. dass ein TreeViewItem ein (oder mehrere) TreeView’s als Items direkt oder indirekt enthalten kann, wurden noch nicht untersucht. Es könnte nämlich sein, dass man so auch an „andere“ Events kommt, die man auch nicht vor hat, abzufangen.&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1668" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>WPF Rendern im Hintergrund</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2007/11/30/wpf-rendern-im-hintergrund.aspx</link><pubDate>Fri, 30 Nov 2007 14:35:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1642</guid><dc:creator>jpkleinau</dc:creator><slash:comments>2</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1642</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2007/11/30/wpf-rendern-im-hintergrund.aspx#comments</comments><description>&lt;p&gt;Wer mit der Klasse &amp;quot;RenderTargetBitmap&amp;quot; arbeitet und für den Benutzer unsichtbar eine Oberfläche rendern will, der ist vor Überraschungen nicht geschützt. Will man die Bilder als PNG oder als JPG speichern, so kann man völlig überraschend vor einem schwarzen Bild stehen und dieses wird sich auch nicht so einfach ändern.&lt;/p&gt;
&lt;p&gt;Ursache dafür ist die Optimierung bzw. die Multithreading Politik von WPF. Wir können die nachlesen in der Beschreibung der UIElement.Measure Method&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Layout updates happen asynchronously, such that the main thread is not waiting for every possible layout change. Querying an element via code-behind checking of property values may not immediately reflect changes to properties that interact with the element&amp;#39;s sizing or layout characteristics (the Width property, for example).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Wollen wir also erfolgreich und sicher rendern, dann wäre dies im Falle eines Canvas genau der richtige Weg:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;canvas.Arrange(new Rect(new System.Windows.Point(0, 0), new System.Windows.Size(height, width)));&lt;br /&gt;canvas.UpdateLayout();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;// render picture&lt;br /&gt;RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);&lt;br /&gt;bmp.Render(canvas);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Damit verhindern wir MemoryLeaks durch Überreste in der Queue und zudem zwingen wir den Canvas über seinen Inhalt nachzudenken. Das folgende Speichern über einen BitmapEncoder wird mit Hilfe eines Streams zum Kinderspiel.&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1642" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>Cider - Tipps für WPF in Visual Studio 2005</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2007/10/30/cider-tipps-f-252-r-wpf-in-visual-studio-2005.aspx</link><pubDate>Tue, 30 Oct 2007 12:45:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1627</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1627</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2007/10/30/cider-tipps-f-252-r-wpf-in-visual-studio-2005.aspx#comments</comments><description>&lt;p&gt;Wenn man in Visual Studio das WPF Designer Preview Cider verwendet, wird man auf einige Probleme stoßen. Ein erstaunliches ist dabei, die Blockade von DLLs, die man gerne kompilieren möchte. Dies passiert, wenn man eine vernünftige und unbedingt notwendige Designtime-Unterstützung in seinem Projekt für Blend erzeugt. Die Fehlermeldung lautet, dass die DLL nicht überschrieben werden kann, weil sie gerade verwendet wird. Dabei läuft augenscheinlich kein Prozess, der die gerade zu programmierende Anwendung verwendet.&lt;/p&gt;
&lt;p&gt;Doch ein Prozess ist am Laufen, der Designer in Visual Studio. Dieser ist so hartnäckig, dass er die DLLs nicht freigibt, auch wenn die betreffende XAML Datei gar nicht mehr geöffnet ist. Das ist durchaus verständlich, gehört doch das Entladen von DLLs aus dem Prozess zu den wirklich kniffligen Dingen. &lt;img src="http://www.codecomplete.de/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;
&lt;p&gt;Nun, gibt es auch dafür eine einfache Lösung:&lt;/p&gt;
&lt;p&gt;&lt;img title="XML Editor besser als Cider" style="WIDTH:576px;HEIGHT:374px;" height="374" alt="XML Editor besser als Cider" src="http://www.codecomplete.de/blogs/xamlblog/xmleditor.jpg" width="576" /&gt;&lt;/p&gt;
&lt;p&gt;Man nehme den rechten Mausklick auf den XAML Files und verwende ein &amp;quot;Öffnen mit&amp;quot; (&amp;quot;Open with&amp;quot;). Dort kann man dann den XML Editor mit &amp;quot;Set as Default&amp;quot; einstellen und sich in Zukunft seines Lebens freuen. Denn Cider gewann bei mir in Verhältnis zu Expression Blend noch nie ein Rennen, stürzt leider öfter ab oder schafft die Masken nicht darzustellen. So habe ich mein &lt;strong&gt;IntelliSense&lt;/strong&gt; und dank sauberem Schema bleibt auch jede Fehlermeldung und das Syntaxhighlighting perfekt.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1627" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>Animierte GIFs aus WPF Animationen</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2007/06/27/animierte-gifs-aus-wpf-animationen.aspx</link><pubDate>Wed, 27 Jun 2007 12:52:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:1337</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=1337</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2007/06/27/animierte-gifs-aus-wpf-animationen.aspx#comments</comments><description>&lt;p&gt;Um WPF Animationen in animierte GIFs umzuwandeln, stellt uns System.Windows.Media.Imaging die Klasse &lt;a class="" href="http://msdn2.microsoft.com/en-US/library/system.windows.media.imaging.gifbitmapencoder.aspx" target="_blank"&gt;GifBitmapEncoder&lt;/a&gt; zur Verfügung. Diese macht unser Leben deutlich einfacher. Alles was wir nun noch machen müssen, ist die Animation Frame um Frame abzufotografieren. Das ist sicherlich keine allzu schöne Lösung, doch da es sich bei den WPF Animationen nicht um framebasierte Überblendungen von Einzelbildern handelt, müssen wir entsprechend des Aufbaus von GIFs ein wenig auf Optimierung und Schönheit zumindest bei der Aufnahme verzichten.&lt;/p&gt;
&lt;p&gt;In meinem Beispiel verwende ich einen Viewport mit dem schönen Namen &amp;quot;Illusion&amp;quot;, da ich darin eine Animation ablaufen lassen, die ich mir von &lt;a class="" href="http://www.interact-sw.co.uk/iangblog/2005/09/16/dotanimation" target="_blank"&gt;IanG &lt;/a&gt;ausgeliehen habe. Dementsprechend habe ich das dazu passende Storyboard mit dem Namen &amp;quot;IllusionStoryboard&amp;quot; versehen. Das macht es mir einfacher die Fotos zu schießen.&lt;/p&gt;
&lt;p&gt;Mein Fenster erweitere ich um ein DependencyProperty. Das macht den Umgang mit&amp;nbsp;den WPF Animationsklassen&amp;nbsp;deutlich leichter, wie man unten sehen wird.&amp;nbsp;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty FrameProperty =
DependencyProperty.Register(
                &lt;span class="str"&gt;&amp;quot;Frame&amp;quot;&lt;/span&gt;,
                &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;double&lt;/span&gt;),
                &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Window1),
                &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyMetadata(&lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedCallback(FrameChangedCallback)));&lt;/pre&gt;
&lt;p&gt;Im Loaded EventHandler meines Fensters, lege ich verschiedene Member an.&amp;nbsp;Nicht zu vergessen&amp;nbsp;natürlich meinen &lt;a class="" href="http://msdn2.microsoft.com/en-US/library/system.windows.media.imaging.gifbitmapencoder.aspx" target="_blank"&gt;GifBitmapEncoder&lt;/a&gt;. Aber auch die DoubleAnimation, um meine Fotos pünktlich zu schießen (man kann sowas auch ohne DoubleAnimation sehr gut und eventuell besser durchführen, aber wir befinden uns hier im XamlBlog - schon vergessen?).&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; Window1_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
  DoubleAnimation dbl = &lt;span class="kwrd"&gt;new&lt;/span&gt; DoubleAnimation(0, numberFrames, &lt;span class="kwrd"&gt;new&lt;/span&gt; Duration(TimeSpan.FromSeconds(2)));
  dbl.AccelerationRatio = 1;
  BeginAnimation(Window1.FrameProperty, dbl);
  encoder = &lt;span class="kwrd"&gt;new&lt;/span&gt; GifBitmapEncoder();
}&lt;/pre&gt;
&lt;p&gt;Da wir im eine PropertyChangedCallback angegeben haben, ist unsere Aufgabe nur noch darauf reduziert, dass wir dort die Fotos schießen und am Ende der Animation, diese Fotos auch abspeichern.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FrameChangedCallback( DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    Window1 w = d &lt;span class="kwrd"&gt;as&lt;/span&gt; Window1;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (w != &lt;span class="kwrd"&gt;null&lt;/span&gt;) 
    {
        RenderTargetBitmap rtb = &lt;span class="kwrd"&gt;new&lt;/span&gt; RenderTargetBitmap((&lt;span class="kwrd"&gt;int&lt;/span&gt;) w.Illusion.ActualWidth, 
                                                        (&lt;span class="kwrd"&gt;int&lt;/span&gt;)w.Illusion.ActualHeight, 96d, 96d, PixelFormats.Pbgra32);
        rtb.Render(w.Illusion);
        BitmapFrame bF = BitmapFrame.Create(rtb);
        w.encoder.Frames.Add(bF);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;double&lt;/span&gt;)e.NewValue == numberFrames)
        {
            Image img = &lt;span class="kwrd"&gt;new&lt;/span&gt; Image();
            &lt;span class="kwrd"&gt;int&lt;/span&gt; i = w.encoder.Frames.Count;
            FileStream stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileStream(&lt;span class="str"&gt;&amp;quot;myAnimation.gif&amp;quot;&lt;/span&gt;, FileMode.Create);
            w.encoder.Save(stream);
            stream.Close();
        }
        
    }
}&lt;/pre&gt;
&lt;p&gt;Das Ganze ist recht nett und schnell mal dahinprogrammiert, rein um die Möglichkeiten zu testen. Wenn man das ordentlich machen will, dann sollte man auf die Framerate des erzeugten GIFs eingehen und entsprechend die Animation auf Frames umstellen, damit man die Fotos korrekt schießt. Doch für&amp;#39;s erste Ausprobieren soll das hier reichen. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=1337" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Animation/default.aspx">Animation</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>Lange Animationen in Kapitel unterteilen mit ResourceDictionary und Wiederverwendung</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2007/04/18/lange-animationen-in-kapitel-unterteilen-mit-resourcedictionary-und-wiederverwendung.aspx</link><pubDate>Wed, 18 Apr 2007 09:34:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:106</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=106</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2007/04/18/lange-animationen-in-kapitel-unterteilen-mit-resourcedictionary-und-wiederverwendung.aspx#comments</comments><description>&lt;p&gt;Das unten geschilderte Verfahren ist besonders für den Anwendungsfall gedacht, dass&amp;nbsp;eine langläufige Animation mit&amp;nbsp;sich wiederholenden Elementen erzeugt werden soll.&amp;nbsp;Vor dieser Herausforderung stand ich&amp;nbsp;Anfang 2007,&amp;nbsp;mit einer Menge Arbeit und Beta Werkzeugen&amp;nbsp;vor mir. Diese Lösung mag eventuell auch manchen Programmierer noch interessieren, der als Amateur-Designer vor der Aufgabe steht, eine optimierte, schnelle Animation zu erzeugen.&lt;/p&gt;
&lt;p&gt;Für den Kommunikationsriesen in Magenta wurde Vista zu einem kleinen Alptraum. Schließlich liefen seine wunderbaren Flash-Animationen auf den Install-CDs nicht&amp;nbsp;mehr. Diese teilweise minutenlange Animationen galt es neu zu gestalten. Aber endlose Animationen in XAML sorgen für recht aufwändig zu pflegende und kaum wartbare Animationsdateien. Zwar kann man mit Hilfe der&amp;nbsp;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ResourceDictionary.MergedDictionaries&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;die Resourcen wunderbar aufteilen. Doch dann sind da immer noch die langen Laufzeiten, wenn man ganz am Ende seiner 3,5 Minuten Animation ein Bild drei Pixel nach links schieben muss und mit Opacity Blending ausblenden soll. &lt;/p&gt;
&lt;p&gt;In der bunten Theorie der Werbeankündigungen, soll der Expression Blend uns dabei unterstützen. Aber was Timeline, Layer oder andere Nettigkeiten betrifft, ist das Werkzeug von Microsoft den Flashworkbenchs einfach unterlegen und war Anfang Januar 2007 wirklich nicht frei von Bugs. Was bleibt ist die Realisierung im Visual Studio oder mit Hilfe der freundlichen Pads - meine Wenigkeit bevorzugt Visual Studio - wen wunderts, ich bin in der Hauptsache Programmierer und in der zweiten Reihe Designer. &lt;a id="more-4"&gt;&lt;/a&gt;Aufgeteilt werden muss eine Animation (meine bestand aus 8 Kapitel mit je rund 30 Sekunden) immer noch.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;Window.Resources&lt;/font&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;      

    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary.MergedDictionaries&lt;/font&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt; &lt;span class="attr"&gt;&lt;font color="#ff0000"&gt;Source&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span class="kwrd"&gt;=”Kapitel1.xaml”&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt; &lt;span class="attr"&gt;&lt;font color="#ff0000"&gt;Source&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span class="kwrd"&gt;=”Kapitel2.xaml”&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt; &lt;span class="attr"&gt;&lt;font color="#ff0000"&gt;Source&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span class="kwrd"&gt;=”Kapitel2.xaml”&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt; &lt;span class="attr"&gt;&lt;font color="#ff0000"&gt;Source&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span class="kwrd"&gt;=”Kapitel4.xaml”&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt; &lt;span class="attr"&gt;&lt;font color="#ff0000"&gt;Source&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span class="kwrd"&gt;=”Kapitel5.xaml”&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt; &lt;span class="attr"&gt;&lt;font color="#ff0000"&gt;Source&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span class="kwrd"&gt;=”Kapitel6.xaml”&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt; &lt;span class="attr"&gt;&lt;font color="#ff0000"&gt;Source&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span class="kwrd"&gt;=”Kapitel7.xaml”&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt; &lt;span class="attr"&gt;&lt;font color="#ff0000"&gt;Source&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span class="kwrd"&gt;=”Kapitel8.xaml”&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;
      &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary.MergedDictionaries&lt;/font&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;
     &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;ResourceDictionary&lt;/font&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;      

  &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span class="html"&gt;&lt;font color="#800000"&gt;Window.Resources&lt;/font&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Dann heißt es, die Startklasse meines Fensters mit zwei winzigen Funktionen zu versehen, die über den RoutedEvent “Loaded”&lt;/p&gt;&lt;pre class="csharpcode"&gt;this.Loaded += new RoutedEventHandler(Start_Loaded);&lt;/pre&gt;
&lt;p&gt;gestartet werden . &lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;&lt;font color="#cc6633"&gt;#region&lt;/font&gt;&lt;/span&gt; Film
&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt; StartKapitel = 1;
&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt; AktuellesKapitel = -1;
&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt; EndKapitel = 8;
&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt; Storyboard findMovie(&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt; key)
{
    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt; (&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;.Resources.Contains(key) == &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/span&gt;)
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;.Resources[key] &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;as&lt;/font&gt;&lt;/span&gt; Storyboard;   

    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;/span&gt; (ResourceDictionary resourceDic &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;.Resources.MergedDictionaries)
    {
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt; (&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;.Resources.Contains(key) == &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/span&gt;)
            &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;.Resources[key] &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;as&lt;/font&gt;&lt;/span&gt; Storyboard;
    }
    MessageBox.Show(&lt;span class="str"&gt;&lt;font color="#006080"&gt;“Kann “&lt;/font&gt;&lt;/span&gt; + key + &lt;span class="str"&gt;&lt;font color="#006080"&gt;” nicht finden”&lt;/font&gt;&lt;/span&gt;,
    &lt;span class="str"&gt;&lt;font color="#006080"&gt;“Schwerer Fehler”&lt;/font&gt;&lt;/span&gt;, MessageBoxButton.OK,
     MessageBoxImage.Error);
    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;;
}   

&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt; DoTheMovie(&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt; sender, EventArgs args)
{
    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt; (AktuellesKapitel == -1)
        AktuellesKapitel = StartKapitel;
    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt; (AktuellesKapitel &amp;gt; EndKapitel)
        &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;;   

    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt; key = &lt;span class="str"&gt;&lt;font color="#006080"&gt;“Kapitel”&lt;/font&gt;&lt;/span&gt; + AktuellesKapitel;
    Storyboard movie = &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;;
    movie = findMovie(key);
    &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt; (movie != &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;)
    {
        movie.Completed += &lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; EventHandler(DoTheMovie);
        movie.Begin(&lt;span class="kwrd"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;);
    }
    AktuellesKapitel++;
}   

&lt;span class="preproc"&gt;&lt;font color="#cc6633"&gt;#endregion&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Klein aber fein suchen die Funktionen nach den Storyboards mit dem einfallsreichem Namen “Kapitel1″ bis “Kapitel8″. Werden die Storyboards gefunden, so werden sie gestartet nachdem sich die Funktion selber als Completed EventHandler eingetragen hat. Somit erfährt die Funktion selber, wann das Kapitel beendet ist und kann das nächste starten. Raffiniert wird es dann, wenn man seine Animation so plant, dass man in die späteren Kapitel springen kann. Doch dazu&amp;nbsp;sollte man zwingend den Designer nun endlich aus der Hand legen.&amp;nbsp; &lt;/p&gt;
&lt;h3&gt;Der Trick mit der Wiederverwendung&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;Bei der vorliegenden 3,5 Minuten Animation komme ich mit 33 graphischen GUI Elementen aus. Mehr verwende ich nicht. Der große Trick heißt Wiederverwendung der vorhandenen Elemente. Jedes Kapitel beginnt mit der gleichen Ausgangslage. Dafür sorgen am Anfang des Kapitels “DiscreteObjectKeyFrame”, die alle Objekte auf Hidden schalten, “DiscreteDoubleKeyFrame”, die Größe und Position setzen und “DiscreteStringKeyFrame”, die neue Texte einspielen. Dann werden mit “DiscreteObjectKeyFrame” die Hintegründe in Canvas eingebaut. Ich verwende grundsätzlich keine Image-Elemente, da Canvas weitaus flexibler einsetzbar sind. Somit verändert sich jedes Element während der Animation mehrfach, erhält neue Rollen und Aufgaben. Wird nahezu endlos wieder verwendet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Was auf den ersten Blick umständlich und mühsam erscheint, wird schnell zu einer effektiven Erstellung der Animation. Denn durch die Unterteilung in Kapitel, die jeweils die gleiche Ausgangssituation haben, lässt sich bereits erstellter Animationscode kopieren und leicht modifiziert wieder verwenden. Ob nun das Bild “Fröhlicher Surfer.jpg” oder das Bild “Glücklicher Flatratnutzer.jpg” gezeigt wird, interessiert die Animation, welche sich mit dem Canvas “Bild1″ beschäftigt herzlich wenig.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;In den meisten Fällen unterscheidet sich eine Animation von der vorherigen nur durch wenige Parameter, oft ist es nur der Hintergrund oder der Text. Somit kann man durch die Unterteilung in Kapitel, die man mit der Hand bearbeitet erstaunlich viel Zeit sparen. Die 3,5 Minuten Animation war nach&amp;nbsp;2,5 Tagen fertig und ging anstandslos durch die QS.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=106" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Animation/default.aspx">Animation</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>Play it again, XamlReader</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2007/03/20/play-it-again-xamlreader.aspx</link><pubDate>Tue, 20 Mar 2007 16:33:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:28</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=28</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2007/03/20/play-it-again-xamlreader.aspx#comments</comments><description>&lt;p&gt;Für das Laden und Abspielen von XAML Dateien stellt uns Microsoft die Klasse &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.markup.xamlreader.aspx" target="_blank"&gt;&lt;code&gt;&lt;em&gt;&lt;font color="#909d73"&gt;XamlReader &lt;/font&gt;&lt;/em&gt;&lt;/code&gt;&lt;/a&gt;zur Verfügung. Mit &lt;code&gt;&lt;em&gt;Load &lt;/em&gt;&lt;/code&gt;und &lt;code&gt;&lt;em&gt;Save &lt;/em&gt;&lt;/code&gt;Funktionen vermittelt die Klasse den Eindruck, man könnte spielend XAML Dateien erzeugen und ablegen. Doch wenn man von dem im Beispiel geschildeten Fall eines einfachen Buttons absieht, dann erkennt man schnell, dass hier eine Menge an Funktionalität fehlt, die man mühsam dazu programmieren muss.&lt;/p&gt;
&lt;p&gt;&lt;a id="more-15"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Ereignislos aber fehleranfällig&lt;/h2&gt;
&lt;p&gt;XAML Code ist grundsätzlich recht fehleranfällig, was in der Natur der Sache einer MarkUp Sprache liegt, die sich kontinuierlich weiter entwickelt. Wer jedoch erwartet, dass die XAMLReader Klasse verwendbare Fehlermeldungen spendiert, der sollte sich gegen Weihnachtsabend auf das Dach setzen, um den Weihnachtsmann zu begrüßen. Nur selten erhält der geduldige Entwickler eine Fehlermeldung, die auch mit dem ursächlichen Problem des XAML Codes einen sinnvollen Zusammenhang ergibt.&lt;/p&gt;
&lt;p&gt;In Gegensatz zu der sonstigen WPF werden bei dem XamlReader mit Ereignissen recht sparsam umgegangen. Lediglich &lt;code&gt;&lt;em&gt;LoadCompleted&lt;/em&gt;&lt;/code&gt; erhalten wir als Nachricht, wenn ein Ladevorgang erfolgreich beendet wurde.&lt;/p&gt;
&lt;p&gt;Will man also den XamlReader zu einem echten Player machen, dann wird man nicht umhin kommen einiges selbst zu programmieren. Vor allen dann, wenn man die vom Interactive Designer erzeugten XAML-ähnlichen Textdaten in verwendbares XAML verwandeln will.&lt;/p&gt;
&lt;h2&gt;XAML ist XML&lt;/h2&gt;
&lt;p&gt;Praktisch ist die Tatsache, dass man, um XAML Dateien lesen zu können, diese als XML schon laden muss. Daher ist die Umwandlung in ein XML Dokument ein Klacks:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;em&gt;XmlDocument doc = &lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;XmlDocument();&lt;br /&gt;doc.Load(meineDatei);&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Wir sollten uns dann noch einen Namespace Manager basteln und befüllen:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;em&gt;&lt;font size="2"&gt;XmlNamespaceManager nsMgr = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/em&gt;&lt;em&gt;&lt;font size="2"&gt; XmlNamespaceManager(doc.NameTable);&lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;XmlAttribute[] arrNamespace = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; XmlAttribute[firstChild.Attributes.Count];&lt;/font&gt;&lt;/em&gt;&lt;/code&gt;&lt;code&gt;&lt;em&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;foreach&lt;/font&gt;&lt;font size="2"&gt; (XmlAttribute att &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;in&lt;/font&gt;&lt;/em&gt;&lt;font size="2"&gt;&lt;em&gt; firstChild.Attributes)&lt;br /&gt;&lt;/em&gt;&lt;/font&gt;&lt;em&gt;&lt;font size="2"&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp; if&lt;/font&gt;&lt;/em&gt;&lt;font size="2"&gt;&lt;em&gt; (att.Name.StartsWith(”xmlns:”))&lt;br /&gt;&amp;nbsp; &lt;/em&gt;&lt;/font&gt;&lt;em&gt;&lt;font size="2"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/em&gt;&lt;em&gt;&lt;font size="2"&gt; prefix = att.Name.Substring(6);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font size="2"&gt;nsMgr.AddNamespace(prefix, att.Value);&lt;/font&gt;&lt;/em&gt;&lt;font size="2"&gt;&lt;br /&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arrNamespace[i++] = att;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;/em&gt;&lt;/font&gt;&lt;em&gt;&lt;font color="#0000ff" size="2"&gt;else&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;/em&gt;&lt;font size="2"&gt;&lt;em&gt; (att.Name.StartsWith(”xmlns”))&lt;br /&gt;&amp;nbsp; &lt;/em&gt;&lt;/font&gt;&lt;em&gt;&lt;font size="2"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; prefix = att.Name.Substring(5);&lt;/font&gt;&lt;font size="2"&gt;nsMgr.AddNamespace(prefix, att.Value);&lt;/font&gt;&lt;/em&gt;&lt;font size="2"&gt;&lt;br /&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arrNamespace[i++] = att;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;/em&gt;&lt;/font&gt;&lt;em&gt;&lt;font color="#0000ff" size="2"&gt;else&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;/em&gt;&lt;font size="2"&gt;&lt;em&gt; (att.Name.IndexOf(’:&amp;#39;) &amp;gt; 0 &amp;amp;&amp;amp; att.Name.IndexOf(”Class”) == -1)&lt;br /&gt;&amp;nbsp; &lt;/em&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;em&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/em&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;em&gt;arrNamespace[i++] = att;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/em&gt;&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;font size="2"&gt;Und nun kann das fröhliche XAML-Umbiegen beginnen.&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;Klassen&lt;/h2&gt;
&lt;p&gt;Vom Visual Studio oder Interactive Designer werden in die XAML Dateien fröhlich Klassen eingefügt. Was dann auch zum einfachen Aufrufen der Maske recht nützlich ist. Doch in einem generischen Player stören die Klassen, die nicht implementiert wurden ziemlich.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;em&gt;&lt;font color="#008000" size="2"&gt;// Klassen entfernen&lt;/font&gt;&lt;br /&gt;XmlNodeList nodes = doc.SelectNodes(”/*[@x:Class]”, nsMgr);&lt;br /&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt; (XmlNode node &lt;font color="#0000ff" size="2"&gt;in&lt;/font&gt; nodes)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; node.Attributes.Remove(node.Attributes[”x:Class”]);&lt;br /&gt;}&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Das obige Beispiel ist recht rigoros. Wer einen Anwendungsfall hat, bei dem Teile der Klassen wirklich auch implementiert wurden, der schaue sich mittels Reflection munter um.&lt;/p&gt;
&lt;h2&gt;Fonts, Bilder und Images&lt;/h2&gt;
&lt;p&gt;Relative Pfade sind nicht die Stärke des Interacitve Designers oder vom XAML im Allgemeinen. Zwar kann man mittels der URL tricksen, aber davon weiß der Grafiker am Nachbartisch recht wenig. Auch helfen eingebundene Bilder und Fonts recht wenig, da auch hier die Trennung zwischen Designtool und Programmierung nur auf dem Papier funktioniert. Entsprechend steht man vor dem Problem die Pfade umbiegen zu müssen, damit alles brav funktioniert.&lt;br /&gt;XPath hilft uns da bei der Interpretation wunderbar: &lt;em&gt;&lt;code&gt;&amp;quot;//*[@Property=&amp;#39;FontFamily&amp;#39;]|//*[@Property=&amp;#39;Source&amp;#39;]|//*[@ImageSource]|//*[@Source]&amp;quot;.&lt;/code&gt;&lt;br /&gt;&lt;/em&gt;Man kann also leicht die betreffenden Nodes auslesen und die Attribute modifizieren. Mit Hilfe eines Dictionaries lassen sich auch recht leicht Mapper aufbauen, die dann später beim Caching helfen können (aber das ist eine andere Geschichte).&lt;/p&gt;
&lt;h2&gt;Resourcen&lt;/h2&gt;
&lt;p&gt;Resourcen lassen sich praktischerweise in &lt;code&gt;&lt;em&gt;ResourceDictionary.MergedDictionaries&lt;/em&gt;&lt;/code&gt; unterbringen. Doch das stellt den XAML Reader schon vor kleinen Problemen. Um hier sauber die zusätzlichen von der Datei angeforderten Resourcen zu laden, sollte man das ausprogrammieren. Dazu überprüfen wir die Anwesenheit des Tags&lt;code&gt;&lt;em&gt; &amp;quot;ResourceDictionary.MergedDictionaries&amp;quot;&lt;/em&gt;&lt;/code&gt; und falls es vorhanden ist, gehen wir auf die Node und holen uns alle Nodes mit dem XPath Ausdruck &lt;code&gt;&lt;em&gt;&amp;quot;//*[@Source]&amp;quot;&lt;/em&gt;&lt;/code&gt;. Das Attribut auszulesen und die absoluten oder relativen Pfade zu wandeln ist Alltagsübung.&lt;br /&gt;Weniger geläufig aber auch recht einfach ist das Mergen. Hier wird schlicht und ergreifend der Inhalt der XAML Resource Dateien als XML Document geladen, dann über &lt;code&gt;&lt;em&gt;ImportNode &lt;/em&gt;&lt;/code&gt;in das Document anstatt des Verweises importiert.&lt;/p&gt;
&lt;h2&gt;Window und Application&lt;/h2&gt;
&lt;p&gt;Die Tags “Window” und “Application” sind für das Laden über den XAML Reader nur bedingt hilfreich. Insbesonders wenn man das Geladene Maskenteil innerhalb einer vorhandenen GUI einbinden will. Daher müssen diese Tags durch etwas neutrales wie beispielsweise “Canvas” ersetzt werden. Das allerdings geht nicht im XmlDocument, denn den Namen eines Tags kann man nur lesend betrachten. Eine einfache String Ersetzung funktioniert aber problemlos.&lt;/p&gt;
&lt;h2&gt;Buttons und andere Eingabeelemente&lt;/h2&gt;
&lt;p&gt;Wenn man schon am Durchforsten ist, dann lohnt es sich auch auf die entsprechenden Ereignisse der Oberfläche reagieren zu können. Auch hier kann man die Elemente im XML finden und sie mindenstens mit einem Namen versehen, damit sie später bei einem GUI Event auch identifziert werden können. Doch ist Vorsicht geboten, da die Elemente in Listen mehrfach vorkommen können und dementsprechend mit multiplen Instanzen vorhanden sind. Das kann zu Anwendungsfehlern aber auch zu handfesten Exceptions führen.&lt;/p&gt;
&lt;h2&gt;Bäumchen durchsuche dich&lt;/h2&gt;
&lt;p&gt;Theoretisch einfach lassen sich diese Element abhandeln, wenn der XamlReader sein Tagwerk getan hat. Mit dem &lt;font size="2"&gt;VisualTreeHelper sollte doch theoretisch jedes Element rekursiv findbar sein. Doch HALT, STOP! nicht alle Elemente sind gleich nach dem Laden durch den XamlReader da. Werden durch gebundene Daten Listen generiert, dann erscheinen die erst beim Erscheinen auf dem Bildschirm. Das ist eine wunderbare Performanzoptimierung, aber für das Untersuchen eines frisch geladenen Xaml Baumes ein Grauen. Die entsprechenden Listenelemente müssen mit dem Event &lt;/font&gt;&lt;font size="2"&gt;ItemContainerGenerator.StatusChanged eingefangen werden und die ContentPresenter durch ApplyTemplate zum Befüllen gebracht werden. Auch bei FlowDocuments hilft der VisualTreeHelper nur bedingt. Denn in den FlowDocuments können sich ganze GUI Masken verstecken, die von Außen keiner findet. Hier ist ebenfalls ein wenig Handarbeit angesagt.&lt;/font&gt;&lt;/p&gt;
&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Insgesamt lohnt sich das Laden von Masken über den XamlReader nur, wenn man eine große Menge von Masken parallel von Grafikern entwickeln will. In meinem Fall waren das über 600 Masken für die neue T-Online 6.0 CD. Hier konnten einige Grafiker sich im &lt;font size="2"&gt;Expression &lt;strong&gt;Blend &lt;/strong&gt;&lt;/font&gt;austoben. Die Masken wurden dann in dem von mir entwickelten XamlPlayer Framework geladen und konnten mit der Anwendungslogik verknüpft werden. Es wäre mein Wunsch gewesen, dass Microsoft von vorneherein hinsichtlich Trennung Design und Anwendung mehr mitbringt als nur eine einfache Klasse mit einer puren Ladefunktion.&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=28" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item><item><title>Kurvig, separat und geradlinig (Animationen in WPF)</title><link>http://www.codecomplete.de/blogs/xamlblog/archive/2007/03/20/kurvig-separat-und-geradlinig.aspx</link><pubDate>Tue, 20 Mar 2007 16:27:00 GMT</pubDate><guid isPermaLink="false">81aaacb2-e9d6-4141-b1a3-d6a38e006815:27</guid><dc:creator>jpkleinau</dc:creator><slash:comments>0</slash:comments><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.codecomplete.de/blogs/xamlblog/commentapi.aspx?PostID=27</wfw:comment><comments>http://www.codecomplete.de/blogs/xamlblog/archive/2007/03/20/kurvig-separat-und-geradlinig.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;Ein Artikel für XAML Anfänger&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dem geneigten XAML / WPF Animateur stehen drei verschiedene KeyFrame gesteuerte Animationen zur Verfügung, die sich anhand der &lt;code&gt;&lt;em&gt;DoubleAnimationUsingKeyFrames&lt;/em&gt;&lt;/code&gt; leicht erklären lassen.&lt;/p&gt;
&lt;p&gt;&lt;a id="more-6"&gt;&lt;/a&gt;&lt;strong&gt;DiscreteDoubleKeyFrame&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Allen voran steht die recht einfache &lt;code&gt;&lt;em&gt;DiscreteDoubleKeyFrame&lt;/em&gt;&lt;/code&gt; Animation. Diese nimmt nur eine einzige Aktion vor, nämlich das fixe Setzen eines Wertes zu einem bestimmten Zeitpunkt, dem KeyFrame mit der Dauer von 0 Sekunden.&lt;/p&gt;
&lt;p&gt;Geeignet ist diese Animation für das Positionieren eines Elements, die Veränderung der Größe oder als &lt;code&gt;&lt;em&gt;DiscreteStringKeyFrame&lt;/em&gt;&lt;/code&gt; den Textinhalt zu ändern oder als &lt;code&gt;&lt;em&gt;DiscreteObjectKeyFrame&lt;/em&gt;&lt;/code&gt; die Sichtbarkeit (&lt;code&gt;&lt;em&gt;Storyboard.TargetProperty=&amp;quot;(UIElement.Visibility)&amp;quot;&lt;/em&gt;&lt;/code&gt; oder den Hintergrund (&lt;code&gt;&lt;em&gt;Storyboard.TargetProperty=&amp;quot;(Canvas.Background)&amp;quot;&lt;/em&gt;&lt;/code&gt;) zu setzen.&lt;/p&gt;
&lt;p&gt;Benötigt wird diese Animation auch dazu, den Startzeitpunkt für die anderen Animationen festzulegen, die über eine Dauer, einen Wert manipulieren. Die Discrete…KeyFrame Aktion wird mit dem Zeitpunkt verwendet, der den Beginn der folgenden Animation beschreibt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LinearDoubleKeyFrame&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mit dieser Animation wird ein Wert von einem in der Animation undefinierten Anfangswert zu einem definierten Zielwert zu dem im KeyFrame festgelegten Zeitpunkt verändert. Am genannten Zeitpunkt wird also der Zielwert erreicht werden. Der Anfangszeitpunkt wird entweder durch die klammernde Außenstruktur, in diesem Fall der &lt;code&gt;&lt;em&gt;DoubleAnimationUsingKeyFrames&lt;/em&gt;&lt;/code&gt; festgelegt oder empfehlenswert (wegen der Lesbarkeit) durch eine vorherige andere Animation wie dem &lt;code&gt;&lt;em&gt;DiscreteDoubleKeyFrame&lt;/em&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Der Anstieg oder Abstieg des Wertes verläuft linear. Das bedeutet, in jedem vergehenden Moment wird der Wert gleichförmig verändert. Das unterscheidet die Animation von der folgenden &lt;code&gt;&lt;em&gt;SplineDoubleKeyFrame&lt;/em&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Geignet ist die &lt;code&gt;&lt;em&gt;LinearDoubleKeyFrame&lt;/em&gt;&lt;/code&gt; insbesonders für das Ein- oder Ausblenden, weniger für Bewegungen (außer für Roboter), da die gleichförmige Bewegung sehr unnatürlich erscheint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SplineDoubleKeyFrame&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Auch in der &lt;code&gt;&lt;em&gt;SplineDoubleKeyFrame&lt;/em&gt;&lt;/code&gt; wird ein Wert zu einem bestimmten Zeitpunkt und zu einem Zielwert hin verändert. Ebenso wird die Animation durch den Beginn der außen definierten Klammer oder zu der vorliegenden Animation gestartet.&lt;/p&gt;
&lt;p&gt;Die Wertänderung verläuft aber nicht gleichförmig sondern in einer Kurve. Am leichtesten lässt sich das mit einer Kugel erklären, die einen Berg herunterrollt. Je nach Beschaffenheit des Berges, wird sie schneller oder langsamer rollen.&lt;/p&gt;
&lt;p&gt;Beginnt der Berg recht steil und flacht in einem weitem Tal ab, so wird die Kugel sehr schnell beschleunigt, gewinnt aber kurs nach dem Gipfel nur noch wenig an Geschwindigkeit. Kurz vor dem Erreichen des Zieles wird sie sogar an Fahrt verlieren, da der Reibungsverlust die Beschleunigung überschreitet und somit wird die Kugel gebremst.&lt;/p&gt;
&lt;p&gt;Ist der Berg jedoch durch Eiszeiten abgeschliffen und im Gipfelbereich eher ein Hügel, jedoch das Tal durch Erosion sehr tief und steil eingeschnitten, wird die Kugel erst langsam anrollen, dann aber immer schneller werden und schließlich kurz vor dem Ziel am schnellsten sein. Aber auch hier wird sie schließlich am Ende gebremst werden (auch wenn das bei den meist kurz dauernden Animation visuell nicht wahrgenommen werden wird).&lt;/p&gt;
&lt;p&gt;Fachlich wird die &lt;a href="http://de.wikipedia.org/wiki/Spline-Interpolation"&gt;&lt;font color="#909d73"&gt;“splined interpolation”&lt;/font&gt;&lt;/a&gt; durch eine so genannte &lt;a href="http://de.wikipedia.org/wiki/B%C3%A9zierkurve"&gt;&lt;font color="#909d73"&gt;Bezier Kurve&lt;/font&gt;&lt;/a&gt; bestimmt. Zwei Kontrollpunkte definieren den Kurvenverlauf:&lt;br /&gt;&lt;code&gt;&lt;em&gt;KeySpline=&amp;quot;0.6,0.0 0.9,0.00&amp;quot;&lt;/em&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Diese durch ein Leerzeichen getrennten Punkte sind sich in einem Koordinatensystem zu denken, das mit 0,0 beginnt und mit 1,1 endet. Daher werden die Punkte in X- und Y-Koordinaten als Double ausgedrückt (das Beispiel beginnt recht langsam und wird gegen Ende ziemlich schnell). Splines sind sprachhistorisch gesehen dünne Holzlatten, die man auf Schiffsskelette genagelt hatte und die sich aufgrund der holzeigenen Beschaffenheit sauber in einer Kurve gebogen haben.&lt;/p&gt;
&lt;p&gt;Geeignet sind&amp;nbsp; &lt;code&gt;&lt;em&gt;SplineDoubleKeyFrame&lt;/em&gt;&lt;/code&gt; für alle Bewegungen, denn sie geben der Animation ein natürliches Verhalten von Beschleunigung und Abbremsung.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DiscreteMatrixKeyFrame&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wer sich noch nicht mir 2D Matrix Transformationen beschäftigt hat, der wird vor der &lt;code&gt;&lt;em&gt;DiscreteMatrixKeyFrame&lt;/em&gt;&lt;/code&gt; etwas zurück schrecken. Das scheint allerdings unbegründet.&lt;/p&gt;
&lt;p&gt;Mit Hilfe des RenderTransform Properties wird das Verändern von Position und Größe ein Kinderspiel. Dieses sollte in dem entsprechenden Element definiert sein. Die einfachste Animation erreicht man mit &lt;code&gt;&lt;/code&gt;. Damit verschiebt man das Element auf die entsprechenden Koordinaten. Komplizierter wird es mit den weiteren Feldern der Matrizen Multiplikation. Zwar lässt WPF nur &lt;a href="http://de.wikipedia.org/wiki/Affine_Abbildung"&gt;&lt;font color="#909d73"&gt;Affine Transformation&lt;/font&gt;&lt;/a&gt; aber auch die Verwendung von m11, m12, m21, m22 ist nur etwas für Cracks und wird vielleicht einen andern Blogeintrag füllen. Hier soll allein auf die praktische Möglichkeit hingewiesen werden, dass man mit den Matrix Animationen sehr einfach das Objekt verschieben kann. Denn selbst das einfach Größeändern mit m11 führt zu einer unscharfen Darstellung, da die Vektoren in Pixel umgerechnet werden und dann von der Grafikkarte durch Unschärfe auf mehrere Pixel verteilt werden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Die oben genannten Animationen stellen das Basiswissen für den XAML Anfänger dar. Hiermit lassen sich 90% der Flashfilme, welche man aktuell im Internet findet, mit XAML realisieren. Dabei stellen sie nur einen Bruchteil der Animationsmöglichkeiten der WPF dar. Das Potential der Möglichkeiten in WPF ist dementsprechend beeindruckend.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.codecomplete.de/aggbug.aspx?PostID=27" width="1" height="1"&gt;</description><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Xaml/default.aspx">Xaml</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Animation/default.aspx">Animation</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://www.codecomplete.de/blogs/xamlblog/archive/tags/Tutorial/default.aspx">Tutorial</category></item></channel></rss>