tag:blogger.com,1999:blog-13632073082651203142024-02-21T05:46:08.605+00:00Benjamin Gopp (HiQ-Software)Mein Blog von und für .NET DeveloperHiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.comBlogger36125tag:blogger.com,1999:blog-1363207308265120314.post-12939620370047616752011-05-16T07:52:00.000+01:002011-05-16T07:53:40.362+01:00Spekulativ: VisualStudio 2012, TFS in da Cloud, und .NET 4.5<p>Heute findet die <a href="http://northamerica.msteched.com">teched North America</a> in Atlanta statt. Die großen Zeiten einer teched sind längst vorbei, als noch Bill Gates die Keynote hielt, oder Dr. Brown mit seinem <a href="http://www.youtube.com/watch?v=KxMrBuluEJ8">DeLorean</a>, “zurück aus der Zukunft” kam. Stattdessen erwartet man heutzutage von Konferenzen wie der MIX oder PDC die großen Ankündigungen.</p> <p>Schaut man sich jedoch die diesjährige Sessionliste an, kann man von der heutigen Keynote ein paar wichtige Ankündigungen erwarten. Einige Informationen sind schon durchgesickert, wie bereits <a href="http://www.heise.de/developer/artikel/Microsoft-NET-Framework-4-5-1229095.html">“der Dotnet-Doktor”</a> schrieb.</p> <p>Wenn Jason Zander die Keynote hält, geht es meistens um VisualStudio und das .NET Framework; er ist nämlich der Hauptverantwortliche dafür. Sicherlich wird er einige Demos von VisualStudio 2012 und .NET 4.5 vorführen. Ich denke aber nicht, dass es bereits jetzt eine Beta geben wird.</p> <p>Nach der Keynote folgen die Foundation Sessions, d.h. Vertiefungen von den Demos die in der Keynote gezeigt wurden. Diese sind meine Highlights: </p> <ul> <p><a href="http://northamerica.msteched.com/signin"></a></p> <li> <p><a href="http://northamerica.msteched.com/topic/details/FDN03#showdetails">FDN03 | The Future of Microsoft Visual Studio Application Lifecycle Management</a></p> </li> <li> <p><a href="http://northamerica.msteched.com/topic/details/FDN02#showdetails">FDN02 | Collaboration in the Cloud with SharePoint: A New World of Productivity</a></p> </li> <li> <p><a href="http://northamerica.msteched.com/topic/details/FDN04#showdetails">FDN04 | Microsoft SQL Server: The Data and BI Platform for Today and Tomorrow</a></p> </li> </ul> <p>Wie es mit TFS/VisualStudio als ALM Plattform weitergehen soll, hat Brian Harry auf der PDC10 gezeigt: Es geht in die Cloud!</p> <p>Ein weiteres wichtiges Thema wird die “Async" Spracherweiterung für VB und C#sein. Damit wird Asynchrone Programmierung quasi zum Kinderspiel. </p> <ul> <li><a href="http://northamerica.msteched.com/topic/details/DEV324#showdetails">DEV324 | C# and Visual Basic Future: Async Made Simple </a></li> </ul> <p>Unterstützung wird es vom Framework über neue APIs in der TPL sowie in WCF geben. </p> <ul> <li><a href="http://northamerica.msteched.com/topic/details/DEV301#showdetails">DEV301 | The Future of Parallel Programming in the Microsoft .NET Framework</a> </li> <li><a href="http://northamerica.msteched.com/topic/details/DEV340#showdetails">DEV340 | Tackle the Complexity of Async Calls in Microsoft Silverlight and WPF Clients</a> </li> <li><a href="http://northamerica.msteched.com/topic/details/MID310#showdetails">MID310 | Windows Communication Foundation Futures</a> </li> </ul> <p>Evtl. gibt es auch hier die CTP3</p> <p>Mal gucken ob ich mit meinem Blick in die Glaskugel recht behalte :-)</p> HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com2tag:blogger.com,1999:blog-1363207308265120314.post-49213364973360571172010-10-22T08:18:00.001+01:002010-10-22T08:18:02.909+01:00PDC10 Sessions online<p>Die Sessions für die PDC vom 28. / 29. Oktober sind online.</p> <p>Anhand der Session Beschreibungen lässt sich erahnen, welche Überraschungen uns erwarten werden. </p> <p>Direkt nach der Keynote, die in den UserGroups zusammen gesehen wird, berichtet Anders Heijlsberg über die Zukunft von C# und VB. Vermutlich wird es aber kein C# 5 oder VB 11 geben. Ich könnte mir aber vorstellen, dass es eine CTP vom “Compiler as a Service” geben könnte.</p> <p>In dem gleichen Slot behandelt Bart de Smet ein nicht weniger wichtiges Thema, nämlich LINQ und Rx.</p> <p>Auffällig ist, dass einige Slots noch nicht besetzt sind. Es sind also einige neu Ankündigungen zu erwarten, im Bereich Azure, Windows Phone 7 und sogar VisualStudio. Unteranderem gibt es auch einen Placeholder für Silverlight! Vielleicht erhalten wir einen Blick von Silverlight 5?!</p> <p>In der letzten Session geht es um die Zukunft von F#.</p> <p>Alle Sessions werden live gestreamt! Es lohnt sich also statt dem Abendspielfilm, oder dem Besuch im Kino, eine Session von der PDC anzusehen!</p> HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-60357510561213882132010-10-06T09:09:00.001+01:002010-10-06T09:09:15.231+01:00The Silverlight Developer Runtime is not installed<p>Silverlight ist schon eine tolle Plattform…</p> <p>Heute morgen bin ich auf <a href="http://channel9.msdn.com">channel9</a> gesurft und wollte mir ein Video anschauen. Nach klick auf den Play Button, kam ein netter Bildschirm, der mich darauf hinwies, dass ich nicht die aktuellste Silverlight Version installiert hätte. Da ich das Video unbedingt gucken wollte, und auch sonst keine Probleme damit habe immer die neuste Version zu installieren, lud ich die neueste SL Version herunter und installierte sie.</p> <p>Gleichzeitig war ich aber auch mit VisualStudio zugange. Während ich also das Video auf channel9 sah, arbeite ich fleißig an einem Silverlight-Spike. Als ich nun F5 drückte, kam folgende Meldung:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2DCHhI94CRdI442zfFyxjnByW1BszRnRbiDhKScaKi8ZjzxxHuyte_jQ71BU1tYwVbO91fYjUpfn8DqZ-a8KFtzr-V8hjfjnZAvxVTgn307cDRfiCpfZ0QPFv1k_CyFgxoDpO3BEbo4E/s1600-h/untitled%5B4%5D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="untitled" border="0" alt="untitled" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizq-pIQrkLZVM5PlIfDFnugY9krjrM2vqo-r5uJ52F71KqwTDEmzyZG3LuDqYmWXAwoW_S_oEWEUxet3Wk7F4tGRuv4WH_Ne4r7GMxmURxl_ZXPQD_wFNPIdsGZv2wo9wAxDhdfh49UFI/?imgmax=800" width="425" height="225" /></a> </p> <p>Zunächst dachte ich, dass es daran liegen könnte, dass nach der Installation der Silverlight Runtime nun die Silverlight Tools für VisualStudio ebenfalls aktualisiert werden müssten. Die Installation der SL Tools brachte aber keine Lösung.</p> <p>Nach etwas “bingen” stieß ich auf einige Foreneinträge. Dieses Problem scheint wohl häufiger aufzutauchen,was ich erstaunlich fand. (Jedoch nicht ungewöhnlich für Silverlight) </p> <p><strong>Für Silverlight gibt es zwei Runtimes!</strong> Eine für “Normalos” und eine für Entwickler. Die developer runtime ist jedoch nicht im SDK oder den Tools enthalten, sondern es muss das sog. <a title="http://go.microsoft.com/fwlink/?LinkID=188039" href="http://go.microsoft.com/fwlink/?LinkID=188039">Silverlight managed debugging package</a>  heruntergeladen werden.</p> <p>Überlegt euch also gut, ob ihr immer die neuste Silverlight Version braucht, sie könnte euer VisualStudio kaputt machen.</p> HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-41309597100279973352010-04-16T10:53:00.001+01:002010-04-16T10:53:34.246+01:00VB – Quo Vadis?<span xmlns=''><p>Ja ich gebe zu, ich mag VB.<br /></p><p>Ich finde VB10 hat ein paar sehr nützliche Features. So sind z.B. in den meisten Fällen keine underscores (_) als sog. Line continuations mehr nötig.<br /></p><p>Auch nett sind die collection initializer, die es momentan in C# in der Form nicht gibt.<br /></p><p>Bisher mochte ich VB immer verteidigen, wenn es darum ging, ob VB schlechter ist als C#.<br /></p><p>Doch mittlerweile kommen mir Zweifel. Das mag daran liegen, dass ich C# doch recht lieb gewonnen habe. Vielleicht aber auch daran, dass ich immer mehr F# Code schreibe und dessen Eleganz einfach umwerfend finde.<br /></p><p>Der Grund warum mir Zweifel an VB kommen, folgender VB10 Code, den ich in einem Blog entdeckt habe. <br /></p><p><span style='font-family:Courier New; font-size:10pt'>Public Sub LoadPolicyDetail()<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> Dim client As New Services.Service1Client()<br /></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'> AddHandler client.GetPolicyDetailCompleted,<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> Sub(s As Object, e As GetPolicyDetailCompletedEventArgs)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> If e.Result <> Nothing Then<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> MessageBox.Show("Awesome!")<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> End If<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> End Sub<br /></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'> client.GetPolicyDetailAsync()<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>End Sub<br /></span></p><p><br /> </p><p>Dieser Code zeigt, wie man eine anonyme Methode an einen Event bindet. Hier der gleiche Code in C#<br /></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>void</span> LoadPolicyDetail()<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> {<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>var</span> client = <span style='color:blue'>new</span><br /> <span style='color:#2b91af'>Service1Client</span>();<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> client.GetPolicyDetailCompleted += (s,e) => <span style='color:blue'>if</span> (<span style='color:black'>e</span>.Result != <span style='color:blue'>null</span>) <span style='color:black'>MessageBox</span>.Show(<span style='color:#a31515'>"Awesome!"</span>);<br /></span></p><p><span style='font-family:Courier New'><span style='font-size:10pt'><br /> </span><span style='font-size:10pt'>client.GetPolicyDetailAsync()</span><span style='font-size:10pt'><br /> </span></span></p><p><span style='font-family:Courier New; font-size:10pt'> }<br /></span></p><p><br /> </p><p>Dieser Code ist doch deutlich lesbarer. Statt 8 Zeilen Code und einer Menge "Rauschen" brauche ich mit C# nur 3 Zeilen. Gut man könnte den Code noch etwas formatieren, dann kommt man auf 5.<br /></p><p>Ich verstehe nicht, welche Vorteile eine Programmiersprache bringen soll, für die man bei gleichem Ergebnis 3x so viel Code schreiben muss.<br /></p><p><br /> </p><p><br /> </p><p><br /> </p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com4tag:blogger.com,1999:blog-1363207308265120314.post-35186576335220415992010-03-03T12:35:00.001+00:002010-03-03T12:35:01.165+00:00F# und der Umgang mit out Parametern<span xmlns=''><p>Jede Funktion bzw. Methode kann zunächstmal nur immer eine Informationen zurückgegeben. Dies wird durch den Rückgabewert oder Rückgabeparameter ausgedrückt. Was macht man aber, wenn man in einer Methode mehrere Informationen zurückgeben möchte, die evtl. sogar optional sein sollen? Eine Möglichkeit ist natürlich einen komplexen Datentyp zu definieren und diesen als Rückgabetyp der Methode zu benennen. Aus Bequemlichkeit macht man das aber eher nicht.<br /></p><p>Ein pragmatischster Ansatz ist es, für die zusätzlichen Rückgabewerte jeweils <em>out</em> Parameter zu definieren. Die <em>out</em> Parameter sind in der Regel primitive Datentypen wie <em>string</em> oder <em>int</em>.<br /></p><p>Im .NET Framework gibt es einige Methoden die einen <em>out</em> Parameter haben. Eine oft verwendete Klasse ist z.B. das <em>Dictionary</em>.<br /></p><p>Hier ein Beispiel:<br /></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>var</span> dict = <span style='color:blue'>new</span><br /> <span style='color:#2b91af'>Dictionary</span><<span style='color:blue'>string</span>, <span style='color:blue'>int</span>>();<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>dict.Add(<span style='color:#a31515'>"A"</span>, 1);<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>dict.Add(<span style='color:#a31515'>"B"</span>, 2);<br /></span></p><p><br /> </p><p>Jetzt versuchen wir Werte aus dem Dictionary zu ziehen. Da nicht garantiert werden kann, dass der gesuchte Wert auch in dem Dictionary ist, verwenden wir die Methode <em>TryGetValue</em>. Da diese nun einen <em>out</em> Parameter definiert, müssen wir bevor wir diese Methode aufrufen können eine Variable mit dem entsprechenden <em>out</em> Parameter Typ definieren und die Methode mit der Variablen aufrufen.Der Rückgabewert von <em>TryGetValue</em> ist ein <em>bool</em>, so dass man erkennen kann, ob der Wert im Dictionary vorhanden ist. Nur wenn der Wert vorhanden ist, hat auch die Variable einen Wert. Aber Vorsicht! Da <em>int</em> ein Werttyp, ist hat er immer einen Defaultwert, nämlich 0. Zur Sicherheit sollte man daher der <em>out</em> Variablen einen anderen Wert als den Defaultwert zuweisen, bei <em>int</em> z.B: -1 statt o.<span style='font-family:Courier New; font-size:13pt'><br /> </span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>int</span> value = -1;<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>var</span> success = dict.TryGetValue(<span style='color:#a31515'>"A"</span>, value);<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (success)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:#2b91af'>Console</span>.WriteLine(value);<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>}</span><span style='font-size:8pt'><br /> </span></p><p>Soweit dürfte das jedem klar sein und sicherlich schon oft gemacht worden. Für mich ist die o.g. Methode, genauso wie <em>TryParse</em>, ein legitimer Grund <em>out</em> Paramter zu verwenden. Alle anderen Gründe sind eher zweitrangig da hier Bequemlichkeit im Vordergrund steht. Man will halt keinen komplexen Datentypen nur für einen Rückgabeparameter erstellen.<br /></p><p>Aber es geht auch anders: mit F#!<br /></p><h1>F# to the rescue<br /></h1><p>Da F# eine ganz normale .NET Sprache ist, kann man natürlich auch die Klassen des Frameworks aufrufen. Z.B. auch die Methoden die <em>out</em> Parameter definieren, wie z.B. das Dictionary. Wie geht F# damit um?<br /></p><p>In F# können wir ganz normal ein Dictionary erzeugen.<br /></p><p><span style='font-family:Consolas; font-size:10pt'><span style='color:blue'>open</span> System.Collections.Generic<br /></span></p><p><span style='font-family:Consolas; font-size:10pt'><span style='color:blue'>let</span> dict = new Dictionary<string,int>()<br /></span></p><p>Nun fügen wir Werte zum Dictionary hinzu<br /></p><p><span style='font-family:Consolas; font-size:10pt'>dict.Add(<span style='color:maroon'>"A"</span>,1)<br /></span></p><p><span style='font-family:Consolas'><span style='font-size:10pt'>dict.Add(<span style='color:maroon'>"B"</span>,2)</span><span style='font-size:8pt'><br /> </span></span></p><p>Schließlich wollen wir die Werte auch wieder auslesen.<br /></p><p><span style='font-family:Consolas; font-size:10pt'><span style='color:blue'>let</span> result = dict.TryGetValue(<span style='color:maroon'>"A"</span>)<br /></span></p><p>Nun von welchem Typ ist jetzt result? Und warum muss man keinen <em>out</em> Parameter übergeben?<br /></p><p>F# Interactive gibt die Anwort.<br /></p><p><span style='font-family:Courier New; font-size:10pt'>val result : bool * int = (true, 1)</span><span style='font-size:14pt'><br /> </span></p><p>Result ist vom Typ <span style='font-family:Courier New; font-size:10pt'>bool * int</span><span style='font-size:14pt'><br /> </span>, was in F# bedeutet dass dies ein Tupel ist. In .NET 4.0 kann man dies als <span style='font-size:10pt'><span style='font-family:Consolas'>Tuple<bool,int></span><br /> </span>beschreiben.<br /></p><p>Nun können wir diesen Tupel mit den Funktionen <em>fst</em> und <em>snd</em> zerlegen.<br /></p><p><span style='font-family:Consolas; font-size:10pt'><span style='color:blue'>let</span> success = fst result<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>val success : bool = true<br /></span></p><p><br /> </p><p><span style='font-family:Consolas; font-size:10pt'><span style='color:blue'>let</span> value = snd result<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>val value : int = 1<br /></span></p><p>F# wäre nicht F# wenn man es nicht noch einfacher ausdrücken könnte. Man kann nämlich den Tuple direkt in seine Bestandteile zerlegen.<span style='font-family:Consolas; font-size:10pt'><br /> </span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>let</span> (success,value) = dict.TryGetValue(<span style='color:maroon'>"A"</span>)</span><span style='font-size:8pt'><br /> </span></p><p><span style='font-family:Courier New; font-size:10pt'>val value : int = 1<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>val success : bool = true<br /></span></p><p><span style='font-family:Courier New'><span style='font-size:10pt'><span style='color:blue'>let</span> (success,value) = dict.TryGetValue(<span style='color:maroon'>"C"</span>)</span><span style='font-size:5pt'><br /> </span></span></p><p><span style='font-family:Courier New; font-size:10pt'>val value : int = 0<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>val success : bool = false<br /></span></p><h1>Fazit<br /></h1><p>Für meine Begriffe ist dies ein gutes Bespiel wie ausdrucksstark F# ist. In der Vergangeneheit sind viele Fehler im Programmiersprachendesign gemacht worden. Allem voran C++, aber leider auch bei C#. Tuples sind ein hervoragendes Mittel, um <em>out</em> Parameter zu vermeiden. Da Tuple in .NET 4.0 ein "first Class" Datentyp ist, gibt es keinen Grund mehr diesen nicht auch in C# als Alternative zu <em>out</em> Parametern zu verweden. Letztendlich macht es aber mit F# mehr Spaß!<br /></p><p>Over und <em>out</em>!</p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-68547664093294935132010-02-24T18:43:00.004+00:002010-02-24T18:49:49.410+00:00Cassidy Marie shipped<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNgm02Vp7pKx2z0uwy_ZAzdPO5XSJq54tMmepAZ12Gxxg_gVsDeuqcDwGlek8vBbXjlNOqenqlUUoiqbNAWRhNEj8q74DEsODBIzCr1NzriM71mz9kpT6NOkvsnLzTjbZ_pqczKee6UG0/s1600-h/2D.bmp"><img style="WIDTH: 206px; HEIGHT: 223px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441882976194807826" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNgm02Vp7pKx2z0uwy_ZAzdPO5XSJq54tMmepAZ12Gxxg_gVsDeuqcDwGlek8vBbXjlNOqenqlUUoiqbNAWRhNEj8q74DEsODBIzCr1NzriM71mz9kpT6NOkvsnLzTjbZ_pqczKee6UG0/s400/2D.bmp" /></a><br />Beta<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju38gQ8xkXPoot4WtAOunIS31vKELwQJZHlvHjOVrXIzP9JGzAqeDYBSKJYrrmcwQECcf-pOLB7mBmxsdISxGxllnuvhP3f7zzC69C9nv6izxj7xcuHeFhHTha1N9NJ4b5MKAGX52UCk4/s1600-h/3D.jpg"><img style="WIDTH: 220px; HEIGHT: 270px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441882975195145234" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju38gQ8xkXPoot4WtAOunIS31vKELwQJZHlvHjOVrXIzP9JGzAqeDYBSKJYrrmcwQECcf-pOLB7mBmxsdISxGxllnuvhP3f7zzC69C9nv6izxj7xcuHeFhHTha1N9NJ4b5MKAGX52UCk4/s400/3D.jpg" /></a><br />Release Candidate<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QsnNcebMqeSSF-5v3LmAbY4iSBC0nWLcTQ07oEsHWuZR_3J7rM-K-xyIlAm6ltYqlax7Y88xM5t6Dkm3h7I3VCY7pHgZD6GDtEwqVVAdEAvUESaWwY3JUidfu0JDuMTdee8m_Idk5Z8/s1600-h/Cassy.jpg"><img style="WIDTH: 400px; HEIGHT: 293px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441882985518305362" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QsnNcebMqeSSF-5v3LmAbY4iSBC0nWLcTQ07oEsHWuZR_3J7rM-K-xyIlAm6ltYqlax7Y88xM5t6Dkm3h7I3VCY7pHgZD6GDtEwqVVAdEAvUESaWwY3JUidfu0JDuMTdee8m_Idk5Z8/s400/Cassy.jpg" /></a><br />Cassidy Marie shipped<br /><br />Die glücklichen und schlaflosen Eltern<br />Marika und Benjamin GoppHiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com2tag:blogger.com,1999:blog-1363207308265120314.post-84370933609405583172010-02-12T10:17:00.001+00:002010-02-12T10:17:00.713+00:00F#: Units of Measure<span xmlns=''><p>Mit dem diese Woche erschienenen Release Candidate von VS2010, hat sich auch was bei F# getan. Wie Don Syme in seinem Blog schreibt, ist der F# Compiler auf Version 2.0 heraufgesetzt worden. Das bedeutet F# ist ausgereift um es produktiv einzusetzen (Obwohl viele es bereits mit früheren Version eingesetzt haben). Zeit sich also endlich ernsthaft mit F# und seinen genialen Features zu beschäftigen!<br /></p><p>Ein Feature über das ich heute schreiben möchte sind <em>Units of Measure</em> oder zu Deutsch <em>Maßeinheiten</em>. Bei diesem Feature geht es um das Problem bei der Verwendung von unterschiedlichen Maßeinheiten im Code. Wie der Unfall des NASA Mars Climate Orbiter 1999 zeigt, kommt es auch heute noch zu Fehlern auf Grund der Verwendung von unterschiedlichen Maßeinheiten. Mittlerweile wird auch in der USA in Wissenschaft und Technik das Metrische System verwendet. Ein Zulieferer hatte jedoch in Pfund und Fuß gerechnet, was letztlich dazu führte, dass die Mars Sonde verglühte. <br /></p><p>Dieses Feature hat also einen relativ ernsten Hintergrund. Damit solche Fehler sich nicht in Produktivcode einschleichen verwendet F# eine erweiterte statische Codeanalyse. Maßeinheiten werden dabei mit Attributen annotiert und bei Ihrer Verwendung vom Compiler auf Korrektheit geprüft. Dabei wird jedoch nicht nur geprüft ob der entsprechende Typ korrekt ist, sondern auch ob die Funktion in dem man diesen Typ verwendet, mathematisch korrekt ist. Durch die intelligente Typinferenz in F# können sogar abgeleitete Maßeinheiten ermittelt werden.<br /></p><p>Nun wie funktioniert das? In C# könnte man eine gewisse Art der Typsicherheit hinbekommen, indem man für Maßeinheit einen eigenen Typen erstellt. Somit würde der Compiler beim Verwenden des Types dessen Typsicherheit garantieren. Was jedoch nicht möglich ist, dass auch auf die Einhaltung der mathematischen Regeln geprüft wird. Dies könnte man vielleicht zur Laufzeit realisieren in dem man für Maßeinheiten entsprechende Rules definiert. Letzlich würde aber eine Prüfung zur Laufzeit nicht den Absturz einer 100.000 km entfernten Sonde verhindern können. Die Prüfung muss also viel früher, also zur Compilezeit erfolgen.<br /></p><p>Noch ein Hinweis: Units of Measure können nur mit <strong>Gleitkommazahlen</strong> verwendet werden! Dies liegt daran, dass man nicht nur dumme Maßeinheiten verwenden kann, sondern auch physikalische Größen wie Beschleunigung etc. Dies würde nicht mit Integers oder anderen Typen funktionieren. (Tatsächlich kann man aber Units of Measure mit Komplexen Zahlen oder Vektoren verwenden)<br /></p><p>Ein Beispiel:<br /></p><p>Man definiert zunächst die Maßeinheiten die man verwenden will als Typen. Diese Typen attributiert man mit<span style='font-family:Courier New; font-size:12pt'>[<Measure>]</span>. (So sehen Attribute in F# aus. Eine Misschung aus C# und VB Attribute)<br /></p><p><span style='font-family:Courier New; font-size:12pt'>[<Measure>] <span style='color:blue'>type</span> kg<br /></span></p><p><span style='font-family:Courier New; font-size:12pt'>[<Measure>] <span style='color:blue'>type</span> s<br /></span></p><p><span style='font-family:Courier New; font-size:12pt'>[<Measure>] <span style='color:blue'>type</span> m<br /></span></p><p><br /> </p><p>Nun können wir Formeln schreiben. Wir wollen wissen, mit welcher Geschwindigkeit wir auf der Erde aufkommen, wenn wir aus einer bestimmten Höhe springen. Zunächst definieren wir die Höhe als Gleitkommazahl und auf welche Maßeinheit sich diese bezieht.<br /></p><p><span style='font-family:Courier New; font-size:12pt'><span style='color:blue'>let</span> höhe = 2.0<m><br /></span></p><p><br /> </p><p>Nun definieren wir die Gravitation. Diese ist eine Beschleunigungskraft: also Gravitationskonstate mal Meter pro Sekunde im Quadrat<br /></p><p><span style='font-family:Courier New; font-size:12pt'><span style='color:blue'>let</span> gravitation = 9.81<m/s^2><br /></span></p><p><br /> </p><p>Wir können nun ausrechnen wie groß die Geschwindigkeit ist, mit der man auf der Erde auftrifft.<br /></p><p><span style='font-family:Courier New; font-size:12pt'><span style='color:blue'>let</span> geschwindigkeit = sqrt (2.0 * gravitation * höhe)<br /></span></p><p><br /> </p><p>F# Interactive sagt uns, dass die Geschwindigkeit in Metern pro Sekunde berechnet wird.<br /></p><p><span style='font-family:Courier New; font-size:12pt'>val geschwindigkeit : float<m/s> = 14.00714104<br /></span></p><p><br /> </p><p>Demnach schlgt man mit 14 Metern pro Sekunde bei einem Sprung aus 2 Metern Höhe auf der Erde auf. Gut zu wissen!<br /></p><p>Im F# Power Pack sind weitere Standardmaßeinheinten definiert, so dass man nicht jedes mal alle Naturgesetze herunterbeten muss. Auf der anderen Seite stellt sich die Frage, wann man dieses Feature wirklich brauch. Hier zeigt sich wieder das F# eine super Ergänzung zu bestehenden C# Code ist, jedoch keinesfalls den Anspruch erhebt C# in seiner Gesamtheit abzulösen. Bisher sind noch keine Überlegungen gemacht worden, Units of Measure auch nach C# zu portieren oder sogar in die CLR. Man wird mit der Zeit sehen müssen, ob dieses und andere Feature auch nach C# portiert werden, oder ob es dann keinen Grund mehr geben würde F# zu verwenden. Das wäre außerst schade!<br /></p><p>Viel Spaß beim Ausprobieren mit F#<br /></p><p>Benjamin<br /></p><p><br /> </p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-80225735095457881212010-01-26T07:54:00.001+00:002010-01-26T07:54:52.118+00:00Top Ten Free Extensions for Visual Studio 2010<span xmlns=''><p>Kate Gregory hat auf Codeproject eine Top 10 der Erweiterungen für Visual Studio 2010 zusammengestellt.<br /></p><p>Darunter auch meine Erweiterung die "<span style='font-size:12pt'><strong>ZoomEditorMargin</strong></span>". Meine Beschreibung findet ihr hier: <a href='http://hiq-software.blogspot.com/2009/10/vs2010-extension-zoomeditormargin.html'>http://hiq-software.blogspot.com/2009/10/vs2010-extension-zoomeditormargin.html</a><br /> </p><p>Ein Video von meiner Extension kann man sich bei Youtube ansehen <a href='http://www.youtube.com/watch?v=sM_20hptWDc'>http://www.youtube.com/watch?v=sM_20hptWDc</a><br /> </p><p>Weitere Tools und die entsprechenden Videos hierzu findet ihr unter <a href='http://www.codeproject.com/KB/macros/TopTenFreeExtensions2010.aspx'>http://www.codeproject.com/KB/macros/TopTenFreeExtensions2010.aspx</a><br /> </p><p><br /> </p><p>Benjamin</p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-53471181449461306372009-11-17T11:34:00.001+00:002009-11-17T11:34:04.302+00:00VSTO 4.0 Runtime<span xmlns=''><p>Die VSTO 4.0 Runtime wird nicht installiert, wenn man Office 2010 bereits installiert hat. Stattdessen wird die VSTO 3.5 Runtime installiert!<br /></p><p>Warum? Keine Ahnung!<br /></p><p>Mehr Informationen findet man unter: <a href='http://msdn.microsoft.com/en-us/library/bb608603(VS.100).aspx'>http://msdn.microsoft.com/en-us/library/bb608603(VS.100).aspx</a><br /> </p><p>Wer die Installation nachholen will kann die Runtime über den entsprechenden Bootstrapper installieren. Der wird nämlich installiert.<br /></p><p>Der Bootstrapper Pfad lautet: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\VSTOR40</p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-35508060896694648552009-10-20T15:27:00.005+01:002009-10-20T15:37:50.168+01:00VS2010 Extension: ZoomEditorMargin<p>VS2010 Beta2 ist endlich draußen. Kaum heruntergeladen und installiert, habe ich auch schon die erste Erweiterung für den neuen WPF Codeeditor geschrieben!<br /></p><br /><br /><p>Besonders gespannt war ich auf die Zoom Funktion des Codeeditors. Als ich VS2010 zum ersten Mal öffnete, war ich jedoch etwas enttäuscht. Auf der linken Seite des Code Editors befand sich lediglich eine Combobox, über die man den Zoom einstellen kann. Aus meiner Erfahrung mit Office 2007, hätte ich jedoch gerne einen Slider gehabt, mit dem ich stufenlos zoomen könnte.<br /></p><br /><br /><p>Zum Glück lässt sich der neue WPF Codeeditor in VS2010 an allen Ecken und Enden anpassen. Gesagt getan, habe ich eine eigene "Margin" für den Editor geschrieben. Eine Margin ist ein Bereich im Codeeditor, in dem man ein WPF Control platzieren kann. Dies ist nur eine von vielen Möglichkeiten den Codeeditor anzupassen und zu erweitern.<br /></p><br /><br /><p>Wer das <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/c271d574-a481-4974-b7dd-f319404de898">ZoomEditorMargin</a> herunterladen und direkt ausprobieren möchte, kann dies in der ,<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiQWl-lRxJHrYxGOWkz3MFOGsqU7lRxI7TAdqiLS_1MNPrDkFoH9NE3Jm09e0n5doWwlZ-DJgdQiarXwGjBhxawVzudpDnHiTW4HlNItBWIXTbA-DAuCQrU9XgWGm1Gaxhu9bPKfHXLi0/s1600-h/image1.png"><img style="WIDTH: 247px; HEIGHT: 34px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5394689417474184882" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiQWl-lRxJHrYxGOWkz3MFOGsqU7lRxI7TAdqiLS_1MNPrDkFoH9NE3Jm09e0n5doWwlZ-DJgdQiarXwGjBhxawVzudpDnHiTW4HlNItBWIXTbA-DAuCQrU9XgWGm1Gaxhu9bPKfHXLi0/s400/image1.png" /></a> oder über den ExtensionManager in VisualStudio tun.<br /></p><br /><br /><h3>Der Code Editor <span style="TEXT-DECORATION: underline">ohne</span> Zoom Extension<br /></h3><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9LW-vxNRHaEAVAYwNP9b6EP7YRxcE2TONaLTOl0tfa5D5fqrGJCtguPw7OHii_l1826PqBr8zgovotq3dlcEWvJAbqoPMidaaNOaenafqCiEFlw4-KGAOivC2Jp0dRwaeELABqNMMLkU/s1600-h/image2.png"><img style="WIDTH: 400px; HEIGHT: 335px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5394689749484963378" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9LW-vxNRHaEAVAYwNP9b6EP7YRxcE2TONaLTOl0tfa5D5fqrGJCtguPw7OHii_l1826PqBr8zgovotq3dlcEWvJAbqoPMidaaNOaenafqCiEFlw4-KGAOivC2Jp0dRwaeELABqNMMLkU/s400/image2.png" /></a><br /><br /><h3>Der Code Editor <span style="TEXT-DECORATION: underline">mit</span> Zoom Extension</h3><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimd2jBSgbYgshjxdEDuakQYVb6xlvNY3b7CTSvbI2FHEkRtdU1ybj3UGyrmGFeIo73wOpQCLWKQtAgMe8GEo7J2gC8upohLBhZRSAujaUAR6iYH7i0StgYm2Dekfz3Fxrl35ki_iBmm_o/s1600-h/image3.jpeg"><img style="WIDTH: 400px; HEIGHT: 316px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5394689762215166530" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimd2jBSgbYgshjxdEDuakQYVb6xlvNY3b7CTSvbI2FHEkRtdU1ybj3UGyrmGFeIo73wOpQCLWKQtAgMe8GEo7J2gC8upohLBhZRSAujaUAR6iYH7i0StgYm2Dekfz3Fxrl35ki_iBmm_o/s400/image3.jpeg" /></a><br /><br /><p>In den nächsten Posts werde ich erklären, wie ich diese Extension erstellt habe. Es gibt viele Aspekte, auf die ich näher eingehen möchte. Deswegen verrate ich nicht alles schon in diesem Blog Post.<br /></p><br /><br /><p>Viel Spaß und stay tuned<br /></p><br /><br /><p>Benny</p>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com1tag:blogger.com,1999:blog-1363207308265120314.post-74983010335342677402009-10-15T09:41:00.002+01:002009-10-15T09:42:55.152+01:00Stirnrunzeln über: "Stirnrunzeln über das Neuste von Microsoft seit geschnitten Brot"<span xmlns=""> <p>Ralf Westphal schrieb in seinem Blog "Stirnrunzeln über das Neuste von Microsoft seit geschnitten Brot", über das neue Reaktive Framework (Rx) von Microsoft. Zunächst wollte ich einen Kommentar in sein Blog schreiben. Der Kommentar ist dann etwas länger ausgefallen, so dass ich mich entschieden habe, einen eigenen Blog Eintrag mit meiner Meinung zu diesem Thema zu schreiben. Ralf fordert sogar zu Reaktionen auf: <em>"Oder übersehe ich hier die eigentliche Erfindung? Geht der brillante Innovationshub an mir vorbei? Ich bitte um Erhellung"</em><br /></p><p>Also versuch ich doch etwas Licht ins Dunkeln zu bringen.<br /></p><h2>Wo ist das Problem?!<br /></h2><p>Für Ralf besteht das Problem an dieser neuen Technologie, dass er ein "<em>neues Vokabular für etwas Altes</em>" benutzen muss. Nach dem Motto: <strong>Raider ist jetzt Twix</strong>. Klar, wenn etwas Neues mit einem alten Begriff besetzt ist und das Neue immer mit dem Alten assoziiert wird, sinkt natürlich die Akzeptanz für das Neue. Heißt das aber, dass da Neue schlecht ist? Das kann ich (noch) nicht beurteilen. Trotzdem bin ich Neuem erst mal aufgeschlossen eingestellt.<br /></p><p>Was ist also das Alte? Für Ralf ist das Alte: <strong>Complex Event Processing (CEP).</strong><br /></p><h3>"Das ist nicht neu, das ist kein Hexenwerk".<br /></h3><p>Aber das ist doch mit den meisten Erfindungen so! Irgendwo hat's Irgendwer bereits erfunden. Das Neue sieht nur hübscher aus: "<em>es ist eben keine tolle neue Erfindung seit geschnitten Brot, sondern etwas lange Bekanntes in aufgehübschtes Gewand gekleidet</em>". Ja, das ist vermutlich so.<br /></p><h3>"Tut mir leid, da ist nichts Neues für mich dabei. Wenn ich im etablierten Paradigma data flow denke, dann ist das etwas uraltes und kann mit heutigen Mitteln bewältigt werden."<br /></h3><p>Ralf, das mag für dich alles "kalter Kaffee" sein. Aber hallo? Data flow, etabliert? Wo denn bitte? In welcher Firma die Software Entwicklung ist denn dieses Paradigma etabliert? Frag doch aber bitte mal deine Kunden, die Teilnehmer der CCD Seminare, die Besucher einer Konferenz, die Zuhörer deiner Vorträge. Wer von denen:<br /></p><ul style="MARGIN-LEFT: 54pt"><li>hat von CEP, Esper oder CCR gehört?<br /></li><li>hat einen Artikel über CEP, Esper oder CCR gelesen (von dir oder jemand anders)?<br /></li><li>verwendet CEP, Esper oder CCR produktiv in seinen Buisiness Anwendungen?<br /></li></ul><p>Antwort: <em>fast</em><br /><strong>Niemand</strong>.<br /></p><p>Das ist das Problem: Für Dich und einige Wenige ist das alles Schnee von gestern (siehe 1. Kommentar von Holger Hofstätte). Für die breite Masse, absolutes Neuland.<br /></p><h3>"Wer das wirklich einmal ausprobieren will, was man mit einer Abfragesprache auf Event-Strömen tun kann, dann kann mit NEsper spielen"<br /></h3><p>Nein Ralf, ich will nichts ausprobieren, ich will auch nicht nur damit spielen. Ich möchte diese Funktionalität im .NET Framework haben und produktiv sein.<br /></p><p><span style="font-size:16;"><strong>Reaktive Programmierung wird im Core .NET Framework vorhanden sein. Das ist das Neue! Das ist Etablierung!<br /></strong></span></p><p><br /> </p><h2>Was ist mit LINQ<br /></h2><p>Zur Erinnerung: für Ralf besteht das Problem am Reactive Framework, dass es das alles schon einmal gab. Was war aber gleich nochmal LINQ?<br /></p><p>Das Konzept hinter LINQ kommt aus der funktionalen Programmierung (Map, Filter, Reduce). Anscheinend hatte hier Ralf keine oder nicht genügend Berührungspunkte mit der funktionalen Programmierung, dass er automatsch LINQ mit einer längst erfundenen Technologie assoziiert hätte. Zumindest wird Erik Meijer für sein "Brainchild" LINQ gelobt, jedoch nicht für seine anderen Projekte (z.B: Volta und Rx).<br /></p><p>Funktionale Programmierung war doch auch nur ein akademisches Thema. Vielleicht ist man im Studium mit LISP, ML oder Miranda in Berührung gekommen. Angekommen im Berufsleben hat man aber seine Daten über geschachtelte for-Schleifen gefiltert. Von wegen Map, Filter, Reduce. Obwohl die Technologie doch bereits in .NET vorhanden war (Delegates, Iteratoren). Trotzdem hat es keiner genutzt. Aber dann kam LINQ daher und mit ein bischen "syntactic sugar" für C#, etabliert sich ein Konzept aus der funktionalen Programmierung auch in einer objektorientierten Programmiersprache wie .NET. Und da das Konzept im Framework verankert ist, ist LINQ sogar für alle.NET basierten Programmiersprachen verfügbar.<br /></p><p>Erst mit LINQ hat sich das funktionale Paradigma in der breiten Masse etabliert. Immer mehr Leute benutzen LINQ Queries um ihre Listen zu projizieren, filtern und aggregieren. Immer mehr Leute verwenden Lambda Ausdrücke für die alltäglichsten Dinge.<br /></p><h2>BetaMax vs. VHS, HD vs. BlueRay<br /></h2><p>LINQ hat da eine Tür aufgestoßen, das Reaktive Framework wird das gleiche machen und den Weg in den Mainstream finden<br /></p><h3>"Flows habe ich aber natürlich nicht erfunden. Die sind alt"... "Mainstream ist es aber nicht geworden, wie wir sehen. Schade. Denn die Schritte in einem Flow steigern die Evolvierbarkeit von Software, finde ich"<br /></h3><p>Ralf, das ist doch genau dein Wunsch, dass das Konzept den Weg in den Mainstream findet. Welche Technologie letztendlich das Rennen macht spielt doch keine Rolle. Ob BetaMax oder VHS, HD oder BlueRay, CEP oder Rx.<br /></p><p><br /> </p><h2>Fazit<br /></h2><p>Es gab schon immer Erfindungen, die nur einem kleinen elitären Bereich in Industrie und Forschung, zugänglich oder erschlossen waren. Nur weil es eine Technologie in einem kleinem Bereich Anklang gefunden hat, kann man nicht sagen die Technologie sei <strong>etabliert</strong>. Erst wenn sie es in den Mainstream geschafft hat, kann man von Etablierung sprechen. LINQ ist ein super Beispiel dafür, dass ein akademisches Thema dem Mainstream zugänglich wird.<br /></p><p>CEP, Esper und CCR haben sich nicht etabliert und werden sich nicht etablieren.Das Reactive Framework wird sich aber etablieren. Warum? Ganz einfach, es wird Kernbestandteil von .NET sein und damit zugänglich und allgegenwärtig für .NET Entwickler. Kein separates Tool, kein irgendwo runterladen, kein rumspielen. Es wird einfach da sein. Bleibt nur noch es auch zu nutzen...</p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com1tag:blogger.com,1999:blog-1363207308265120314.post-16228445566810610592009-06-25T08:18:00.001+01:002009-06-25T08:18:54.467+01:00F# - Teil 1<span xmlns=''><p>Vorgestern habe ich einen Vortrag bei der User Group Köln über F# gehalten. Dort habe ich über meine Erfahrungen mit F# geredet und ein paar Sprachfeatures gezeigt. Leider waren 30 Minuten viel zu wenig um alles zu zeigen und auch noch Fragen zu beantworten. In den kommenden Blogeinträgen werde ich daher meine Erfahrungen mit F# schriftlich festhalten.<br /></p><p>F# ist eine neue Programmiersprache in der .NET Familie. Diese wird in VS2010 neben VB und C# eine der Hauptsprachen für die .NET Entwicklung werden; so der Plan.<br /></p><p><span style='color:#17365d; font-size:13pt'><strong>Déjà-vu<br /></strong></span></p><p>Als ich zum ersten Mal die Beta1 von VisualStudio 2010 öffnete, hatte ich ein Déjà-vu Erlebnis. F# hatte ich bereits in VS2008 ausprobiert, aber erst mit VS2010 ist mir bewusst geworden, was Microsoft da eigentlich vor hat. Und dann lief es mir eiskalt den Rücken runter. Denn als ich zum ersten Mal vor ca. 6 Jahren ein VisualStudio 2003 installierte, um .NET zu lernen, stand neben VB und C# eine weitere Programmiersprache zur Auswahl; und das war <strong>J#</strong>.<br /></p><p>Welchen Weg J# gegangen ist, muss ich nicht erwähnen. (Wer noch aktiv in J# programmiert, der möge sich bitte bei mir melden!). Könnte das gleiche Schicksal F# ereilen?<br /></p><h2>J# vs. F#<br /></h2><p>Die Frage ist, ob nur weil F# in VS2010 bereits vorinstalliert ist und man es sich nicht separat herunterladen muss, dieses dann auch öfters genutzt wird. Bei J# hat das ja auch nicht geholfen.<br /></p><p>Nun, auf den ersten Blick hat F# ein schlechtes "Karma". Warum kann man aber doch sagen, das F# seinen Weg machen wird?<br /><table border='0' style='border-collapse:collapse'><colgroup><col style='width:189px'/><col style='width:136px'/><col style='width:136px'/><col style='width:121px'/></colgroup><tbody valign='top'><tr style='background: #4f81bd'><td style='padding-left: 9px; padding-right: 9px; border-top: solid #7ba0cd 1.0pt; border-left: solid #7ba0cd 1.0pt; border-bottom: solid #7ba0cd 1.0pt; border-right: none'> </td><td style='padding-left: 9px; padding-right: 9px; border-top: solid #7ba0cd 1.0pt; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p><span style='color:white'><strong>J#</strong></span></p></td><td style='padding-left: 9px; padding-right: 9px; border-top: solid #7ba0cd 1.0pt; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p><span style='color:white'><strong>C#</strong></span></p></td><td style='padding-left: 9px; padding-right: 9px; border-top: solid #7ba0cd 1.0pt; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: solid #7ba0cd 1.0pt'><p><span style='color:white'><strong>F#</strong></span></p></td></tr><tr style='background: #d3dfee'><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: solid #7ba0cd 1.0pt; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p><strong>Paradigma</strong></p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p>objektorientiert</p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p>objektorientiert</p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: solid #7ba0cd 1.0pt'><p>funktional</p></td></tr><tr><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: solid #7ba0cd 1.0pt; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p><strong>Sprachfamilie</strong></p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p>C</p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p>C</p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: solid #7ba0cd 1.0pt'><p>ML</p></td></tr><tr style='background: #d3dfee'><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: solid #7ba0cd 1.0pt; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p><strong>Kompatibilität</strong></p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p>JAVA</p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: none'><p>-</p></td><td style='padding-left: 9px; padding-right: 9px; border-top: none; border-left: none; border-bottom: solid #7ba0cd 1.0pt; border-right: solid #7ba0cd 1.0pt'><p>OCAML</p></td></tr></tbody></table><h5>Vergleich von J# und F#<br /></h5><p><br /> </p><p>Der Vergleich zeigt, dass sich J# und C# einfach zu ähnlich sind, als dass es einen wirklichen Gewinn bringen wurde. Wer Java programmieren will, der macht das mit Java und nicht mit J#. Zumal man mit Eclipse eine weitaus bessere Entwicklungsumgebung hat. F# hat hingegen nichts mit C# zu tun. Die Sprache basiert nicht auf C sonder auf ML (Meta Language). Auch die Art der Programmierung ist anders, nämlich funktional. Microsoft hat jedoch mit F# ein paar Zugeständnisse gemacht. F# bezeichnet sich selber als "Multi Paradigmen" Programmiersprache, im Gegensatz zu reinen funktionalen Programmiersprachen wie Haskell. Man kann z.B. mit F# objektorientierte Klassenbibliotheken definieren, die von anderen .NET Programmen aufgerufen werden können. <br /></p><h2>Fazit<br /></h2><p>F# kann nicht mir J# verglichen werden, auch wenn es viele Ähnlichkeiten aufweist. Nicht in der Art der Syntax, sondern in der Art wie F# marketingtechnisch platziert wird. Ich vermute ganz stark, dass F# einen großen Einfluss auf die Weiterentwicklung von C# und .NET haben wird. F# hat dazu beigetragen, dass C# 2.0 Generics erhalten hat. Für C# 3.0 und LINQ wurden weitere Konzepte der funktionalen Welt in die objektorientierte Welt übertragen: Typinferenz, Lambda Ausdrücke und das sehr esoterische Konzept der Monadentheorie. Ich spekuliere dass C# 5.0, nachdem C# 4.0 Features aus der dynamischen Welt bekommen hat, wieder Konzepte aus der funktionalen Welt adaptieren wird. Meine Wunschfeatures für C# 5.0 sind: Pattern Matching, erweiterte Typinferenz, und Metaprogrammierung.<br /></p><p>Ich glaube, dass man folgendes plakativ von F# sagen kann (andere funktionale Sprachen eingeschlossen):<br /></p><p>Dank F# gibt es Generics. Dank F# gibt es Lambda Ausdrücke. Dank F# gibt es LINQ.<br /></p><p>Danke F#!<br /></p><h2>Ausblick<br /></h2><p>Ich habe vor ein paar grundlegende Blogeinträge zu F# zu schreiben. Im nächsten Blog Eintrag wird es darum gehen, warum man eigentlich F# verwenden sollte.</p></p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com1tag:blogger.com,1999:blog-1363207308265120314.post-20789786521783856262009-03-18T15:11:00.001+00:002009-03-18T15:11:14.582+00:00Silverlight 3<span xmlns=''><p>WOW! <br /></p><p>Bereits vor der eigentlichen Ankündigung bei der Keynote auf der Mix09, ist das Silverlight 3 SDK freigegeben worden. Ob es jetzt offiziell ist, weiß ich nicht - auf jeden Fall kann man es jetzt schon downloaden ;-))<br /></p><p>Als WPF Entwickler war ich eher enttäuscht von Silverlight 2. Ein intuitives programmieren war nicht möglich. Eigentlich war es nur ein Krampf. Also habe ich beschlossen "Silverlight" erst mal "silverNight" sein zu lassen. Bis ... ja bis heute.<br /></p><p>Auf die Schnell konnte ich folgende interessanten, lang erwarteten und teilweise überraschenden Neuerungen feststellen.<br /></p><h3>ObservableCollection<T><br /></h3><p>Wie bereits aus WPF bekannt, implementiert diese Collection das <em>INotifyCollectionChanged</em> Interface. Damit können Controls feststellen, ob sich etwas an dieser Collections geändert hat, also Items hinzugefügt oder gelöscht wurden, so dass man die UI aktuallisieren kann. Siehe ItemsControl und ListBox<br /></p><h3>ICollectionView<br /></h3><p>Eng mit der ObservableCollection sind die sog. CollectionViews verbunden. In WPF gibt es diverse View Implementiereungen, <em>ItemsCollectionView</em>, <em>EnumerationCollectionView</em>, <em>ListCollectionView</em>, <em>BindingListCollectionView</em>. Diese gibt es aber <strong>nicht</strong> in Silverlight 3.<br /></p><h3>PagedCollectionView<br /></h3><p>Interessanterweise gibt es aber die <em>PagedCollectionView</em>; die es aber nicht in WPF gibt...<br /></p><p>Nachwievor bewegen sich WPF und Silverlight immer noch stark auseinander. Leider.<br /></p><h2>Animationen<br /></h2><p>Für Animationen gibt es jetzt "<strong>Ease</strong>" Funktionen. Diese interpolieren eine Funktion die z.B. eine Beschleunigung simuliert. So kann man z.B. auch einen Ball springen lassen.<br /></p><p>In WPF kann man solche Effekte über "KeySplines" erzeugen, aber auch diese gibt es nicht in Silverlight.<br /></p><p><br /> </p><p>Weitere Neuerungen werden noch gepostet. Stay tuned.<br /></p><p>So jetzt schnell nach Hause, damit ich mir die Keynote live gestreamt angucken kann!<br /></p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com1tag:blogger.com,1999:blog-1363207308265120314.post-52790959350651843892009-01-28T11:13:00.002+00:002009-01-28T11:15:11.471+00:00WPF Window als Vollbild<span xmlns=""><p>Ein WPF Fenster kann auch im Vollbildmodus angezeigt werden und somit den gesamten Bildschirmplatz einnehmen ohne die Windowsstartleiste<br /></p><p>Wie funktioniert das?<br /></p><p>Nun, es ist einfacher als man denkt. Dafür braucht man keine nativen Windows APIs aufzurufen.<br /></p><p>Folgender XAML Code zeigt wie es geht:<br /></p><p><br /> </p><p><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">Window</span><span style="color:red;"> x</span><span style="color:blue;">:</span><span style="color:red;">Class</span><span style="color:blue;">="WpfApplication1.Window1"<br /></span></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:red;">xmlns</span><span style="color:blue;">="http://schemas.microsoft.com/winfx/2006/xaml/presentation"<br /></span></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:red;">xmlns</span><span style="color:blue;">:</span><span style="color:red;">x</span><span style="color:blue;">="http://schemas.microsoft.com/winfx/2006/xaml"<br /></span></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:red;">Title</span><span style="color:blue;">="Window1"</span><br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:red;">WindowStyle</span><span style="color:blue;">="None"</span><br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:red;">WindowState</span><span style="color:blue;">="Maximized"</span><br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:red;">WindowStartupLocation</span><span style="color:blue;">="CenterScreen"><br /></span></span></p><p><span style="font-family:Courier New;font-size:10;"><span style="color:#a31515;"><br /></span><span style="color:blue;"><</span><span style="color:#a31515;">Grid</span><span style="color:red;"> Background</span><span style="color:blue;">="Red"><br /></span></span></p><p><br /> </p><p><span style="font-family:Courier New;font-size:10;"><span style="color:#a31515;"><br /></span><span style="color:blue;"></</span><span style="color:#a31515;">Grid</span><span style="color:blue;">><br /></span></span></p><p><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"></</span><span style="color:#a31515;">Window</span><span style="color:blue;">><br /></span></span></p><p>Zunächst wir der <em>WindowState</em> mit Maximized angegeben. Das bewirkt natürlich dass das Fenster den gesamten Bildschirm ausfüllt.<br /></p><p>Den ganzen Bildschirm? Nein, denn unten (oder oben) [oder auch an den Seiten] befindet sich die Windows Taskbar. <span style="font-family:Courier New;font-size:10;color:blue;"><br /></span></p><p>Wird nun der <em>WindowStyle</em> wird auf <em>None</em> gesetzt, hat das Fenster keinen Rahmen, also auch keine Titelleiste und Controlbar.<br /></p><p>Allerdings verschwindet nun auch die Taskbar und das Fenster füllt tatsächlich den gesamten Screen aus.<br /></p><p>Nun kann z.B. eine Photoshow starten.<br /></p><p><br /> </p><p>Problematisch wird es, wenn der Anwender versucht das Fenster zu schließen, denn es fehlt ja die Titelleiste mit dem Schließen bzw. Minimieren Button. Man sollte daher noch auf Events der Tasten ESC oder F11 reagieren. Diese werden standardmäßig in Vollbild Applikationen verwendet, um in den normalen Fenstermodus zurückzukehren.<br /></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">public</span><br /><span style="color:blue;">partial</span><br /><span style="color:blue;">class</span><br /><span style="color:#2b91af;">Window1</span> : <span style="color:#2b91af;">Window<br /></span></span></p><p><span style="font-family:Courier New;font-size:10;">{<br /></span></p><p><br /> </p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">public</span> Window1()<br /></span></p><p><span style="font-family:Courier New;font-size:10;">{<br /></span></p><p><span style="font-family:Courier New;font-size:10;">InitializeComponent();<br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">this</span>.KeyDown = RootKey;<br /></span></p><p><span style="font-family:Courier New;font-size:10;">}<br /></span></p><p><br /> </p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">void</span> RootKey(<span style="color:blue;">object</span> sender, <span style="color:#2b91af;">KeyEventArgs</span> e)<br /></span></p><p><span style="font-family:Courier New;font-size:10;">{<br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">if</span> ((e.Key == <span style="color:#2b91af;">Key</span>.Escape) (e.Key == <span style="color:#2b91af;">Key</span>.F11))<br /></span></p><p><span style="font-family:Courier New;font-size:10;">{<br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">if</span> (<span style="color:blue;">this</span>.WindowStyle == <span style="color:#2b91af;">WindowStyle</span>.None)<br /></span></p><p><span style="font-family:Courier New;font-size:10;">{<br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">this</span>.WindowStyle = <span style="color:#2b91af;">WindowStyle</span>.ThreeDBorderWindow;<br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">this</span>.WindowState = <span style="color:#2b91af;">WindowState</span>.Normal;<br /></span></p><p><span style="font-family:Courier New;font-size:10;">}<br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">else<br /></span></span></p><p><span style="font-family:Courier New;font-size:10;">{<br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">this</span>.WindowStyle = <span style="color:#2b91af;">WindowStyle</span>.None;<br /></span></p><p><span style="font-family:Courier New;font-size:10;"><br /><span style="color:blue;">this</span>.WindowState = <span style="color:#2b91af;">WindowState</span>.Maximized;<br /></span></p><p><span style="font-family:Courier New;font-size:10;">}<br /></span></p><p><br /> </p><p><span style="font-family:Courier New;font-size:10;">e.Handled = <span style="color:blue;">true</span>;<br /></span></p><p><br /> </p><p><span style="font-family:Courier New;font-size:10;">}<br /></span></p><p><br /> </p><p><span style="font-family:Courier New;font-size:10;">}<br /></span></p><p><span style="font-family:Courier New;font-size:10;">}</span><br /></p><p><br /> </p><p>Ob dieses Feature beabsichtigt ist; weiß ich nicht. Ob dieses Feature jede Anwendung benötigt? Eher nicht.<br /></p><p>Wer allerdings eine Vollbild Anwendung entwicklen will, der kann auch das mit WPF tun, und zwar mit relativ wenig Aufwand.<br /></p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com1tag:blogger.com,1999:blog-1363207308265120314.post-11923333060957256102008-10-08T11:08:00.002+01:002008-10-08T11:15:54.410+01:00PDC08: new XAML featuresXAML ist DIE deklarative Programmiersprache für .NET.<br /><br />Sie findet hauptsächlich Anwendung in WPF, aber auch in WF und WCF<br /><br />Auf der PDC wird sich eine Session rund um XAML drehen. Es wird gezeigt wie eine Anwendung komplett deklarativ in XAML geschrieben werden kann.<br /><br />XAML wird außerdem mit XOML aus der Workflow Foundation vereinigt. Man darf gespannt sein auf welche Anwendungsbereiche XAML ausgeweitet werden wird.<br /><br />Neue XAML Features werden sein:<br />- support für generics<br />- object references<br />- non default constructors<br /><br /><br />cu @ PDC<br />BenjaminHiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-60390590625205268582008-10-08T09:31:00.003+01:002008-10-08T09:57:31.009+01:00C# 4.0: dynamic<div>C# wird dynamisch!</div><br /><div></div><br /><div>Das erste publik gemachte Feature von C# 4.0 sind dynamic lookups. Diese werden durch das neue Schlüsselwort - <span style="font-family:courier new;font-size:130%;color:#3333ff;"><strong>dynamic</strong></span> - ermöglicht.</div><br /><div></div><br /><div>Dynamic lookups ermöglichen das Auflösen von Namen zur Laufzeit und nicht zur Compilezeit. Das bedeutet, dass dies ein neues Runtime Feature ist, denn ein Sprachfeature von C#. Alle .NET Sprachen können also diesen dynamic lookup verwenden. VB.NET konnte dieses Szenario bereits umsetzen - besser bekannt als "Late Binding" - , musste jedoch deafür auf eigene Methoden aus der Microsoft.VisualBasic.dll zurückgreifen. (Daher musste man bisher immer diese DLL deployen, wenn man .NET in VB programmiert hat).</div><br /><div></div><br /><div>Dynamic Lookups sind in der DLR (Dynamic Language Runtime) implementiert und für dynamische Sprachen unerlässlich.</div><br /><div></div><br /><div>Das folgende Beispiel ist den Slides der Keynote von Anders Hejsberg auf der JAOO entnommen</div><br /><div></div><br /><div></div><br /><div></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnupOSt7XObrX9GXkjpWZK9NaxFpSjblF2wSVCFeBcnvgxOo3aDFl6neBy7yi0JW4T8NyjQtou5hJg6HFCuG1MGtB2Gle9FPBn4E1IQE5z8ILD7QE2bH9x4rHw1acNfFR2QUhyphenhyphen-KnW2qM/s1600-h/dynamic.png"><img id="BLOGGER_PHOTO_ID_5254704228735620482" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnupOSt7XObrX9GXkjpWZK9NaxFpSjblF2wSVCFeBcnvgxOo3aDFl6neBy7yi0JW4T8NyjQtou5hJg6HFCuG1MGtB2Gle9FPBn4E1IQE5z8ILD7QE2bH9x4rHw1acNfFR2QUhyphenhyphen-KnW2qM/s400/dynamic.png" border="0" /></a><br /><div></div><br /><div></div><br /><div></div>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-87086993126827424852008-09-10T08:45:00.002+01:002008-09-10T09:02:08.810+01:00Olso und D#Während die PDC immer näher rückt, werden die ersten heiß erwarteten Neuerungen bekannt. Unteranderem kommen immer mehr Details zum Vorschein, zu der langerwarteten Plattform Olso, die Teil des .NET Framework 4.0 sein wird.<br /><br /><a href="http://www.pluralsight.com/community/blogs/dbox/default.aspx">Don Box</a> ist einer der Architekten von Oslo und gibt in seinem Blog kleine versteckte Hinweise. Heute wies er auf einen interessanten <a href="http://www.eweek.com/c/a/Windows/The-Origins-of-Microsofts-Oslo-Software-Modeling-Platform/">Artikel </a>hin, der weitere Geheimnisse zu Olso enthüllt.<br /><br />Nach LINQ wird dieses Jahr ein weiterer Hammer vorgestellt werden:<br /><span style="font-size:130%;"><strong>Textuelle Domain Specific Languages (DSL)</strong></span><br /><br />Microsoft hat bereits ein DSL Toolkit mit dem man graphische DSL erstellen kann. Diese können dann über einen Designer in VisualStudio verwendet werden. Das Neuartige and denOslo DSL ist, dass sie wie eine eigene Programmiersprache funktionieren; also textuell. Diese TDSL basieren auf dem Microsoft Research Projekt TLA+ (T-emporalen L-ogik der A-ktionen)<br /><br />Übrigens der Codename für diese TDSL ist "D".<br />Vielleicht bekommen wir nach C# nun ein D# !?<br /><br />C.U. at PDC<br />BenjaminHiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-2252028101341092602008-05-29T06:32:00.002+01:002008-05-29T06:38:14.779+01:00PDC2008 I'm commingBei der letzten PDC habe ich mir noch alle Sessions online angesehen. <br /><br />Jetzt bin ich LIVE dabei!<br /><br />Themen werden sein:<br /><br />- The Live Developer platform, including the MESH.<br />- Cloud Computing" from computation, to storage and much more! <br />- Visual Studio 10" and .NET Framework 4.0<br />- ASP.NET Futures including v.next of MVC, Ajax and Dynamic data<br />- Silverlight Futures, including Silverlight for business applications<br />- And much, much more.HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-59550307974747173592008-05-08T16:27:00.001+01:002008-05-08T16:27:55.024+01:00StackPanel Items in umgekehrter Reihenfolge anzeigen<span xmlns=''><p>Das StackPanel in WPF kann Controls untereinander anordnen.<br /></p><p>Mit der Eigenschaft Orientation=Horizontal ist es möglich auch die Elemente von Links nach Rechts anzuordnen.<br /></p><p>Es gibt aber keine Eigenschaft StackItemsFrom="Top|Bottom".<br /></p><p>Natürlich kann man ein eigenes StackPanel implementieren, das dies kann. Es geht aber auch einfacher.<br /></p><h2>Am Anfang war das ItemsControl<br /></h2><p>Wir benötigen zunächst ein ItemsControl. Ein ItemsControl kann beliebige Objekte, also auch Double, Boolean, Person etc., aufnehmen. Ein Panel hingegen nur Controls.<br /></p><p>Das ItemControl benötigt jedoch ein Panel um die Objekte darstellen zu können. Standardmäßig ist dies ein StackPanel. <br /></p><p>Über die Eigenschaft ItemsPanel können wir ein ItemsPanelTemplate definieren, und ein anderes von Panel abgeleiteten "Panel" angeben, in das nun die Items angeordnet werden.<br /></p><p>Wie die Objekte aussehen bestimmt ein DataTemplate. Für jedes Objekt generiert das ItemsControl einen Container (ContentPresenter, für ListBox -> ListBoxItem). Da man auf diesen Container nicht direkt zugreifen kann, definiert das ItemsControl eine Property um den Style für den "ItemContainer" festlegen zu können. <br /></p><h2>Verkehrte Welt<br /></h2><p>Um nun die Elemente von unten nach oben statt von oben nach unten anordnen zu können, wie es das StackPanel macht, benötigen wir ein anderes Panel. Ein DockPanel ist geeignet, da es mehr als eine Möglichkeit gibt, Elemente in ihm anzuordnen. (Top,Left,Right,Bottom).<br /></p><p>Nun müssen wir noch im ItemContainerStyle festlegen, dass die Elemente jeweils von Unten angeordnet werden sollen.<br /></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>ItemsControl</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>ItemsControl.ItemsPanel</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>ItemsPanelTemplate</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>DockPanel</span><span style='color:red'> VerticalAlignment</span><span style='color:blue'>="Top"</span><span style='color:red'> LastChildFill</span><span style='color:blue'>="False" /><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'></</span><span style='color:#a31515'>ItemsPanelTemplate</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'></</span><span style='color:#a31515'>ItemsControl.ItemsPanel</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>ItemsControl.ItemContainerStyle</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>Style</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>Setter</span><span style='color:red'> Property</span><span style='color:blue'>="DockPanel.Dock"</span><span style='color:red'> Value</span><span style='color:blue'>="Bottom"/><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'></</span><span style='color:#a31515'>Style</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'></</span><span style='color:#a31515'>ItemsControl.ItemContainerStyle</span><span style='color:blue'>><br /></span></span></p><p> <br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>Button</span><span style='color:blue'>></span><span style='color:#a31515'>1</span><span style='color:blue'></</span><span style='color:#a31515'>Button</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>Button</span><span style='color:blue'>></span><span style='color:#a31515'>2</span><span style='color:blue'></</span><span style='color:#a31515'>Button</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'><</span><span style='color:#a31515'>Button</span><span style='color:blue'>></span><span style='color:#a31515'>3</span><span style='color:blue'></</span><span style='color:#a31515'>Button</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'><br /> </span><span style='color:blue'></</span><span style='color:#a31515'>ItemsControl</span><span style='color:blue'>><br /></span></span></p><h2>Et Voila<br /></h2><p><br /> </p><p/></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-25031167355578740342008-05-08T12:04:00.001+01:002008-05-08T12:04:39.566+01:00AttachedProperties richtig initialisieren<span xmlns=''><p>Manchmal ist es angebracht, nachdem sich ein Objekt bei einem AttachedProperty registriert hat, einige Initialisierungen durchzuführen. Hierbei kann in der Set Methode, nach dem Setzen des AttachedProperty, z.B. eine Initialisierungsmethode aufgerufen werden.<br /></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>public</span><br /> <span style='color:blue'>static</span><br /> <span style='color:blue'>void</span> SetAttachedProperty(<span style='color:#2b91af'>DependencyObject</span> obj, <span style='color:blue'>int</span> value)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> obj.SetValue(AttachedProperty, value);<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> InitializeProperty();<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>}<br /></span></p><p>Die Set-Methode macht nichts Weiteres, als bei dem übergebenen DependencyObjekt <span style='font-family:Courier New; font-size:10pt'>SetValue</span> aufzurufen. Der eigentliche Wert der AttachedProperty wird also wie eine ganz normale DependencyProperty gesetzt. Stellen Sie sich einfach vor, eine DependencyProperty ist nichts anderes als ein Schlüssel der zusammen mit einem Wert in einem Dictionary gespeichert wird. Jedes DependencyObject hat so ein Dictionary. Die Werte können aber auch von anderen Objekten abgefragt und gesetzt werden.<br /></p><p>Um eine AttachedProperty zu setzen, reicht es tatsächlich lediglich die DependencyProperty am eigenen Objekt zu setzen und nicht am Containerobjekt durch <span style='font-family:Courier New; font-size:10pt'>Set[Property]</span>! Das bedeutet aber auch, dass die Initialisierungsmethode nicht mehr aufgerufen wird, da die AttachedProperty über einen anderen Weg gesetzt wird. Nun kann man es natürlich zur Konvention machen in dem in einem API vorschreibt, dass AttachedProperties immer über <span style='font-family:Courier New; font-size:10pt'>Set[Property]</span> gesetzt werden müssen. So ist der XAMLReader drauf angewiesen, dass wenn er eine AttachedProperty im Markup erkennt, auch eine entsprechende Set-Methode verfügbar ist, die er aufrufen kann.<br /></p><p>Trotzdem ist es besser eine Initialisierung anders durchzuführen. Wie? Über einen Callbackmechanismus. Jede DependencyProperty verfügt über Metadaten die es erlauben, Code bzw. Callbacks für Validierungen, Änderungen etc. zu hinterlegen. Ändert sich z.B. der Wert einer DependencyProperty, so wird der Callback aufgerufen und die Initialisierung kann durchgeführt werden. Dieser Mechanismus funktioniert unabhängig davon wie eine DependencyProperty, gesetzt wurde.<br /></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>public</span><br /> <span style='color:blue'>static</span><br /> <span style='color:blue'>readonly</span><br /> <span style='color:#2b91af'>DependencyProperty</span> PropertyWithCallback; <br /></span></p><p><br /> </p><p><span style='color:green; font-family:Courier New; font-size:10pt'>//Definition der Metadaten mit Callback<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>PropertyMetadata</span> metadata = <span style='color:blue'>new</span><br /> <span style='color:#2b91af'>PropertyMetadata</span>();<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>metadata.PropertyChangedCallback += OnPropertyWithCallbackChanged;<br /></span></p><p><br /> </p><p><span style='color:green; font-family:Courier New; font-size:10pt'>//Registrierung der DependencyProperty<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>PropertyWithCallback = <span style='color:#2b91af'>DependencyProperty</span>.RegisterAttached(<span style='color:#a31515'>"PropertyWithCallback"</span>,<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>typeof</span>(<span style='color:blue'>int</span>), <span style='color:blue'>typeof</span>(<span style='color:#2b91af'>Window1</span>), metadata);<br /></span></p><p><br /> </p><p><span style='color:green; font-family:Courier New; font-size:10pt'>//Der Callback ruft die eigentliche Initializierungsmethode auf<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>private</span><br /> <span style='color:blue'>static</span><br /> <span style='color:blue'>void</span> OnPropertyWithCallbackChanged(<span style='color:#2b91af'>DependencyObject</span> obj, <span style='color:#2b91af'>DependencyPropertyChangedEventArgs</span> value)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> InitializeProperty();<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>}<br /></span></p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-29558604040169506762008-05-07T08:36:00.002+01:002008-05-07T09:01:27.756+01:00Eigene Linien in Grid Panel zeichnen<span xmlns=''><p>Das Grid ist das Mächtigste und am Häufigsten gebrauchte Panel in WPF.<br /></p><p>Mit der Eigenschaft "ShowGridLines" lassen sich Hilfslinien anzeigen.<br /></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>Grid</span><span style='color:red'> ShowGridLines</span><span style='color:blue'>="True"><br /></span></span></p><p><span style='color:blue; font-family:Courier New; font-size:10pt'><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheji5q-29Y7KrOinICP_hH_Wib-HDLnFFiM_kpBcWkpjjvwFPBCqJoIs1pjV6iNjZtDsL0zdtLFywafIAY0mQXICrlFYc9p4amqjAluPBA8n7GHVtzK94MrI5QrXC9lzhAEee_fmqC7M4/s1600-h/image1.png"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheji5q-29Y7KrOinICP_hH_Wib-HDLnFFiM_kpBcWkpjjvwFPBCqJoIs1pjV6iNjZtDsL0zdtLFywafIAY0mQXICrlFYc9p4amqjAluPBA8n7GHVtzK94MrI5QrXC9lzhAEee_fmqC7M4/s400/image1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5197541523974140690" /></a><br /><br /> </span></p><p>Diese Linien dienen nur als Hilfestellung für den Entwickler, der so die Position der Spalten und Reihen erkennen kann.<br /></p><p>Leider kann man nicht selber bestimmen wie diese Linien aussehen. Oder etwas doch?<span style='color:blue; font-family:Courier New; font-size:10pt'><br /> </span></p><h2>Was passiert eigentlich im Grid wenn ShowGridLines=True gesetzt wird?<br /></h2><p>WPF-Controls können sich selbst zeichnen, in dem sie die OnRender Methode überschreiben. Wie dies auch bei OnPaint in WinForms der Fall ist.<br /></p><p>Doch beim Grid wird davon nicht Gebrauch gemacht um die Linien zu zeichnen! Stattdessen wird zu den logischen UI-Elementen in dem Panel ein zusätzliches visuelles Element der "GridLinesRenderer" hinzugefügt. Dies geschieht nicht per ControlTemplate. (Templates ändern ebenfalls das Aussehen also den VisualTree), sonder programmatisch durch den Aufruf von AddVisualChild(visual) in der Basisklasse. <br /></p><p>Der GridLinesRenderer ist von DrawingVisual abgeleitet. UIElement und DrawingVisual haben also den Selben Vorfahr "Visual". DrawingVisuals sind jedoch wesentlichen performanter als UIElements, da sie direkt auf den "Bildschrim" (WPF-Subsystem) zeichnen. <br /></p><p>Der VisualTree im XamlPad zeigt, dass neben dem logischen Child – einem Button - noch ein visuelles Element - der GridLinesRenderer - in der Hierarchie zu finden ist.<br /></p><p><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq__55__yg5rV8DrvyIK5XpBjTHLIMPfvzJMtpjiJsdYMzdeGp0nLfcF44RqsyzlrwIo2jBGvqyHl4GZgOjLCZLSfQA-LrqEOCffy7FB4eyOoQ3fi5na6L3uRl82m5cJ67zw1OxdbgEf8/s1600-h/image2.png"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq__55__yg5rV8DrvyIK5XpBjTHLIMPfvzJMtpjiJsdYMzdeGp0nLfcF44RqsyzlrwIo2jBGvqyHl4GZgOjLCZLSfQA-LrqEOCffy7FB4eyOoQ3fi5na6L3uRl82m5cJ67zw1OxdbgEf8/s400/image2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5197541528269108002" /></a><br /><br /> </p><p><br /> </p><h2>Möglichkeit 1: Einen eigenen GridLinesRenderer schreiben<br /></h2><p>Meine erste Idee war es einen eigenen GridLinesRenderer zu schreiben. Ganz nach dem Vorbild des in dem Grid zu findenden Renderer.<br /></p><p>Das Problem ist, dass es nicht möglich ist den Renderer in den VisuallTree des Grid einzufügen. Die Methode die dieses möglich machen würde – AddVisualChild – ist nämlich protected.<br /></p><p>Ein eigenes Grid zu erstellen, nur um die GridLinien zeichnen zu können war mir dann aber zu aufwändig. <br /></p><p>Es muss einen anderen Weg geben.<br /></p><h2>Möglichkeit 2: Einen GridLinesAdorner schreiben<br /></h2><p>Wenn es keine Möglichkeit gibt ein UIElement von Innen zu verändern ohne ein eigenes Control abzuleiten, so muss man es eben von Außen probieren. Das machen sog. Adorner.<br /></p><p>Adorner "verzieren" ein UIElement. Wie, das bestimmt der Adorner. Wichtig ist, dass ein Adorner immer über einem UIElement gezeichnet wird. D.h. der Adorner verdeckt darunter liegende Zeichnungen.<br /></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>Public</span><br /> <span style='color:blue'>Class</span> GridLinesAdorner<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Inherits</span> Adorner<br /></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Private</span> Grid <span style='color:blue'>As</span> System.Windows.Controls.Grid<br /></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:green'>'Übergabe des zu verzierenden Elements (hier Grid)<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Sub</span><br /> <span style='color:blue'>New</span>(<span style='color:blue'>ByVal</span> grid <span style='color:blue'>As</span> System.Windows.Controls.Grid)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>MyBase</span>.New(grid)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Me</span>.Grid = grid<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>End</span><br /> <span style='color:blue'>Sub<br /></span></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Private</span> _pen <span style='color:blue'>As</span> Pen<br /></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:green'>'Stift um die Linien zeichnen zu können<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Public</span><br /> <span style='color:blue'>Property</span> Pen() <span style='color:blue'>As</span> Pen<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Get<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Return</span> _pen<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>End</span><br /> <span style='color:blue'>Get<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Set</span>(<span style='color:blue'>ByVal</span> value <span style='color:blue'>As</span> Pen)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> _pen = value<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>End</span><br /> <span style='color:blue'>Set<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>End</span><br /> <span style='color:blue'>Property<br /></span></span></p><p><br /> </p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:green'>'Zeichnen der Linien<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Protected</span><br /> <span style='color:blue'>Overrides</span><br /> <span style='color:blue'>Sub</span> OnRender(<span style='color:blue'>ByVal</span> dc <span style='color:blue'>As</span> System.Windows.Media.DrawingContext)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>If</span> Pen <span style='color:blue'>Is</span><br /> <span style='color:blue'>Nothing</span><br /> <span style='color:blue'>Then</span><br /> <span style='color:blue'>Exit</span><br /> <span style='color:blue'>Sub<br /></span></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>If</span> Grid.ColumnDefinitions.Count > 0 <span style='color:blue'>Then<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Dim</span> x <span style='color:blue'>As</span><br /> <span style='color:blue'>Double<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>For</span> i <span style='color:blue'>As</span><br /> <span style='color:blue'>Integer</span> = 1 <span style='color:blue'>To</span> Grid.ColumnDefinitions.Count - 1<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> x = Grid.ColumnDefinitions(i).Offset<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> dc.DrawLine(Pen, <span style='color:blue'>New</span> Point(x, 0), <span style='color:blue'>New</span> Point(x, Grid.ActualHeight))<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Next<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>End</span><br /> <span style='color:blue'>If<br /></span></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>If</span> grid.RowDefinitions.Count > 0 <span style='color:blue'>Then<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Dim</span> y <span style='color:blue'>As</span><br /> <span style='color:blue'>Double<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>For</span> i <span style='color:blue'>As</span><br /> <span style='color:blue'>Integer</span> = 1 <span style='color:blue'>To</span> Grid.RowDefinitions.Count - 1<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> y = Grid.RowDefinitions(i).Offset<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> dc.DrawLine(Pen, <span style='color:blue'>New</span> Point(0, y), <span style='color:blue'>New</span> Point(Grid.ActualWidth, y))<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Next<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>End</span><br /> <span style='color:blue'>If<br /></span></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>End</span><br /> <span style='color:blue'>Sub<br /></span></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>End</span><br /> <span style='color:blue'>Class<br /></span></span></p><p><br /> </p><p>Die Methode OnRender führt nun das Zeichnen der Gridlinien durch. Über die Row- und ColumnDefinitions des Grid, kann der Offset der einzelnen Spalten vom Grid abgerufen werden. Diese dienen uns als Koordination um an diesen Stellen die entsprechenden Linien zu zeichnen.<br /></p><h2>Anwenden des Adorners<br /></h2><p>Um den Adorner zum Einsatz zu bringen, müssen wir nun noch die Code-Behind Datei anpassen. Leider ist es nicht möglich den Adorner in XAML direkt anzuwenden. (Die Klasse AdornerDecorator ist nur dafür da einen Layer für ein zu verzierendes Element bereitzustellen, worauf ein Adorner angewendet werden kann; aber nicht für den Adorner selbst.)<br /></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>Class</span> Window1 <br /></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Private</span><br /> <span style='color:blue'>Sub</span> Window1_Loaded(<span style='color:blue'>ByVal</span> sender <span style='color:blue'>As</span><br /> <span style='color:blue'>Object</span>, <span style='color:blue'>ByVal</span> e <span style='color:blue'>As</span> System.Windows.RoutedEventArgs) <span style='color:blue'>Handles</span><br /> <span style='color:blue'>Me</span>.Loaded<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:green'>'Layer für das Element holen in dem der Adorner gezeichnet wird<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Dim</span> layer <span style='color:blue'>As</span> AdornerLayer = AdornerLayer.GetAdornerLayer(<span style='color:blue'>Me</span>.Grid)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:green'>'Adorner mit Stift erstellen<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>Dim</span> adorner <span style='color:blue'>As</span><br /> <span style='color:blue'>New</span> GridLinesAdorner(Grid)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> adorner.Pen = <span style='color:blue'>New</span> Pen(Brushes.Black, 2)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:green'>'Adorner dem Layer hinzufügen<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> layer.Add(adorner)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><br /> <span style='color:blue'>End</span><br /> <span style='color:blue'>Sub<br /></span></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>End</span><br /> <span style='color:blue'>Class<br /></span></span></p><p><br /> </p><h2>Das Ergebnis<br /></h2><p><br /> </p><p><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcgRmfqA09swZjCzJE6D11Vmpo-f4ZR5TasyxWrqiJ8EkW48xsKVEic88YeW_n6Wx9SivuQrZLbLi9AzQBgKM7S3d5L3qvVPNJrWHR-9YJKXuHzuw0kQaV8TtQ-Nz0UT-KaDoFvX2aFNs/s1600-h/image3.png"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcgRmfqA09swZjCzJE6D11Vmpo-f4ZR5TasyxWrqiJ8EkW48xsKVEic88YeW_n6Wx9SivuQrZLbLi9AzQBgKM7S3d5L3qvVPNJrWHR-9YJKXuHzuw0kQaV8TtQ-Nz0UT-KaDoFvX2aFNs/s400/image3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5197541532564075314" /></a><br /><br /> </p><p>Wer noch einen Rahmen um das Grid herum haben möchte, der brauch nur noch das Grid in ein Border zu packen.<br /></p><p>Achtung: Wie man sieht wird der Adorner <span style='text-decoration:underline'>über</span> das Grid gezeichnet. Daher sind die Ränder der im Grid befindlichen Buttons nicht ganz zu sehen.<br /></p><p>Hier muss dann noch ein entsprechendes Margin auf die Buttons angewendet werden um den richtigen Abstand zu den Gridinnenseiten zu ermöglichen.<br /></p><p><br /> </p><p><br /> </p><p><br /> </p><p><br /> </p></span>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com1tag:blogger.com,1999:blog-1363207308265120314.post-89630950223648169412008-04-29T21:02:00.002+01:002008-04-29T21:37:24.106+01:00WPF goes TransitionsEffekte a la PowerPoint? Mit WPF kein Problem!?<br /><br />WPF bietet zwar Animationsunterstützungen, doch diese müssen mühsam programmiert werden. <br /><br />Nun gibt es ein Framework das Übergangseffekte für WPF bereitsstellt.<br />z.B. Wipe, Fade, oder RotatingCube. Auch aufwendige 3D Animation sind frei verfügbar.<br /><br />Entwickelt hat dies <a href="http://blogs.msdn.com/jbienz">Jaraed Bienz</a>.<br />Download auf CodePlex: <a href="http://www.codeplex.com/transitionals">Transitionals</a><br /><br />Wer jetzt vielleicht sagt: "He, das habe ich schonmal gesehen!"<br />der hat vollkommen recht. Auf der letzten Basta habe ich einen Vortrag über CAB gehalten und auch Acropolis vorgestellt. Für mich hatte Acropolis keine Zukunfstaussichten (Wurde ja auch eingestampft). Jedoch einige Bestandteile hatten Potential in WPF intigriert zu werden. U.a. auch das Transitionframework.<br /><br />Zwar ist das Transitionframework (noch) kein Teil von WPF. Aber dennoch sehr nützlich, zumal frei zugänglich und erweiterbar.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2cpul2VGO2JhRyNAEJVEpZPDxDW9vuW4nD4cFQ-TuVTROJJ8mu7in3QeOKQOJ31aYRracSVD5zQ9FLcCYLLOU78eVVQHOETq5Gnk-txx6yP0UzSvPwg0v1GjknhDiywZvERbbVNwd5YU/s1600-h/clip_image001_2.jpg"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2cpul2VGO2JhRyNAEJVEpZPDxDW9vuW4nD4cFQ-TuVTROJJ8mu7in3QeOKQOJ31aYRracSVD5zQ9FLcCYLLOU78eVVQHOETq5Gnk-txx6yP0UzSvPwg0v1GjknhDiywZvERbbVNwd5YU/s400/clip_image001_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5194768882066404098" /></a>HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com1tag:blogger.com,1999:blog-1363207308265120314.post-55025385824936038362007-12-10T17:24:00.000+00:002007-12-10T17:27:40.767+00:00Basta! 2008 Spring EditionSchon zum 2. Mal werde ich auf der BASTA! sprechen.<br /><br />Meine Session(s)<br /><br /><h4>Reflection in Action</h4><br />Reflection gehört zu den coolesten und nützlichsten Features von .NET. In dieser Session schauen wir uns die bekannten und unbekannten Möglichkeiten von Reflection an. U.a. Wie performant ist Reflection und wie kann man die Performance optimieren? Wie generiert man dynamisch IL Code und kann ihn wieder auslesen!? Und vieles vieles mehr.<br /><br />Allein dafür lohnt es sich auf die BASTA! zukommen.<br /><br />Benny<br /><br /><br /><br /><!-- Software & Support Verlag: BASTA! Speakerbutton --><br /><object width="160" height="160"><param name="movie" value="http://www.entwickler.com/banner/extern/buttons/basta_speakerbutton.swf"></param><param name="wmode" value="transparent"></param><embed src="http://www.entwickler.com/banner/extern/buttons/basta_speakerbutton.swf" type="application/x-shockwave-flash" wmode="transparent" width="160" height="160"></embed></object><br /><!-- END Software & Support Verlag: BASTA! Speakerbutton -->HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-46162170684115011132007-12-07T09:39:00.000+00:002007-12-07T09:46:24.325+00:00PDC2008 announced!Nachdem die PDC2007 ausgefallen ist, weil "zu wenig Neues" und die TechEd2007 Europe tatsächlich wenig Neues zu bieten hatte, findet sie nun statt:<br /><br /><h3>die PDC2008 in Los Angeles!</h3><br /><a href="http://msdn2.microsoft.com/en-gb/events/bb288534.aspx">Link</a><br /><br />Vermutliche Themen:<br />- .NET Framework 4.0<br />- Volta (MSIL Recompiler)<br />- Software + Services<br />- WPF Composite Smart Clients<br />- (hoffentlich neue (WPF Controls bzw. Features))<br />- Silverlight 2.0 und DLR<br /><br />Urlaub ist schon geplant!<br /><br />BennyHiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0tag:blogger.com,1999:blog-1363207308265120314.post-89535816604487243982007-10-30T07:39:00.000+00:002007-10-30T08:29:30.911+00:00WPF Composite Clients formally known as AcropolisDas war es also mit "Acropolis". Dem Produkt das eigentlich CAB (Composite UI Application Block) ersetzen sollte...<br /><br />Hier die offizielle Bekanntmachung:<br /><a href="http://blogs.msdn.com/acropolis/rss.xml">Acropolis Team Blog</a><br /><br />Die Erkenntnisse aus dem Acropolis Projekt werden zerstückelt und fließen in die .NET Klassenbibliothek ein (Version 4.0?). Dies Vermutung habe ich bereits auf der BASTA! 2007 in Mainz geäußert, wo ich einen Vortrag über CAB gehalten habe und einen Ausblick auf Acropolis gezeigt habe. Ein Artikel für das dotnet Magazin war bereits in Arbeit. Aber eine innere Stimme hat mich zurückgehalten weiter zu machen. Jetzt weiß ich warum!<br /><br />Von Seiten der CAB-Community hagelte es eine Menge Kritik an Acropolis. Der Ärger bestand darin dass CAB und die Smart Client Software Factory nicht mehr weiterentwickelt werden. Stattdessen wurde das ehrgeizige Projekt Acropolis hochgezogen, dass viel wollte aber nichts konnte. Das größte Problem war eine nicht existierende Roadmap für das Produkt.<br /><br />Hier ein Kommentar dazu aus der CAB Comunity.<br /><a href="http://neverindoubtnet.blogspot.com/feeds/posts/default?alt=rss"><br />Requiem for Acropolis; Fanfare for CAB + <br /></a><br /><br />Aber es gibt schon wieder ein Neues Projekt: WPF Composite Clients<br /><br />Diesmal wieder unter der Leitung der Patterns & Practices Group. Hier fließt die ganze Erfahrung aus CAB mit ein. Acropolis ist (war) nähmlich ein Projekt der UIFX Teams, das für ASP.NET und WPF zuständig ist.<br /><br />Glen Block bescheibt in seinem Blog das neue Projekt.<br /><a href="http://blogs.msdn.com/gblock/archive/2007/10/26/wpf-composite-client-guidance-it-s-coming.aspx"> Glenn Block</a><br /><br />WPF Composite Client ist keine neue Version von CAB. Es wird eine neue Library und Guidance geben. Zielplattform ist WPF. Der Grund für den Aufbau einer neuen Klassenbibliothek besteht darin, dass CAB nicht für WPF designt wurde. WPF bringt eigene Konzepte wie Commands und RoutedEvents mit sich, die es in WinForms nicht gibt und somit auch nicht in CAB unterstützt werden.<br /><br />WPF bietet außerdem eine komplette andere "experience". Es wird daher <strong>keinen </strong>Migrationspfad von WinForms geben. (So wie dies noch in Acropolis vorgesehen war). <br /><br />Wie herausklang wird es weiter Verbesserungen an WinForms geben! WinForms geht also noch nicht in Rente.<br /><br />Ich lass erstmal die Korken knallen, dass wir das Thema Acropolis hinter uns lassen können! Ich habe schon befürchtet, dass wir uns ernsthaft mit dem Produkt auseinandersetzen müssen!HiQ-Softwarehttp://www.blogger.com/profile/17952163358850374510noreply@blogger.com0