<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-1363207308265120314</id><updated>2009-10-20T21:59:01.433+01:00</updated><title type='text'>Benjamin Gopp (HiQ-Software)</title><subtitle type='html'>Mein Blog von und für .NET Developer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default?start-index=26&amp;max-results=25'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-3550806089669464855</id><published>2009-10-20T15:27:00.005+01:00</published><updated>2009-10-20T15:37:50.168+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='VS2010'/><title type='text'>VS2010 Extension: ZoomEditorMargin</title><content type='html'>&lt;p&gt;VS2010 Beta2 ist endlich draußen. Kaum heruntergeladen und installiert, habe ich auch schon die erste Erweiterung für den neuen WPF Codeeditor geschrieben!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Wer das &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/c271d574-a481-4974-b7dd-f319404de898"&gt;ZoomEditorMargin&lt;/a&gt; herunterladen und direkt ausprobieren möchte, kann dies in der ,&lt;a href="http://4.bp.blogspot.com/_c4ehIbstBAc/St3JcWIblrI/AAAAAAAAACY/Eeqg0Hi9s9A/s1600-h/image1.png"&gt;&lt;img style="WIDTH: 247px; HEIGHT: 34px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5394689417474184882" border="0" alt="" src="http://4.bp.blogspot.com/_c4ehIbstBAc/St3JcWIblrI/AAAAAAAAACY/Eeqg0Hi9s9A/s400/image1.png" /&gt;&lt;/a&gt; oder über den ExtensionManager in VisualStudio tun.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Der Code Editor &lt;span style="TEXT-DECORATION: underline"&gt;ohne&lt;/span&gt; Zoom Extension&lt;br /&gt;&lt;/h3&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_c4ehIbstBAc/St3Jvq9-BjI/AAAAAAAAACo/JhnOAn_BUow/s1600-h/image2.png"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 335px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5394689749484963378" border="0" alt="" src="http://4.bp.blogspot.com/_c4ehIbstBAc/St3Jvq9-BjI/AAAAAAAAACo/JhnOAn_BUow/s400/image2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Der Code Editor &lt;span style="TEXT-DECORATION: underline"&gt;mit&lt;/span&gt; Zoom Extension&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_c4ehIbstBAc/St3JwaZFgkI/AAAAAAAAACw/rWMaoyPZ2bA/s1600-h/image3.jpeg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 316px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5394689762215166530" border="0" alt="" src="http://2.bp.blogspot.com/_c4ehIbstBAc/St3JwaZFgkI/AAAAAAAAACw/rWMaoyPZ2bA/s400/image3.jpeg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Viel Spaß und stay tuned&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Benny&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-3550806089669464855?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/3550806089669464855/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=3550806089669464855' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/3550806089669464855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/3550806089669464855'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2009/10/vs2010-extension-zoomeditormargin.html' title='VS2010 Extension: ZoomEditorMargin'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_c4ehIbstBAc/St3JcWIblrI/AAAAAAAAACY/Eeqg0Hi9s9A/s72-c/image1.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-7498301033534267740</id><published>2009-10-15T09:41:00.002+01:00</published><updated>2009-10-15T09:42:55.152+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reactive Framework'/><title type='text'>Stirnrunzeln über: "Stirnrunzeln über das Neuste von Microsoft seit geschnitten Brot"</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;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: &lt;em&gt;"Oder übersehe ich hier die eigentliche Erfindung? Geht der brillante Innovationshub an mir vorbei? Ich bitte um Erhellung"&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Also versuch ich doch etwas Licht ins Dunkeln zu bringen.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Wo ist das Problem?!&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;Für Ralf besteht das Problem an dieser neuen Technologie, dass er ein "&lt;em&gt;neues Vokabular für etwas Altes&lt;/em&gt;" benutzen muss. Nach dem Motto: &lt;strong&gt;Raider ist jetzt Twix&lt;/strong&gt;. 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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Was ist also das Alte? Für Ralf ist das Alte: &lt;strong&gt;Complex Event Processing (CEP).&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;"Das ist nicht neu, das ist kein Hexenwerk".&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Aber das ist doch mit den meisten Erfindungen so! Irgendwo hat's Irgendwer bereits erfunden. Das Neue sieht nur hübscher aus: "&lt;em&gt;es ist eben keine tolle neue Erfindung seit geschnitten Brot, sondern etwas lange Bekanntes in aufgehübschtes Gewand gekleidet&lt;/em&gt;". Ja, das ist vermutlich so.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;"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."&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;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:&lt;br /&gt;&lt;/p&gt;&lt;ul style="MARGIN-LEFT: 54pt"&gt;&lt;li&gt;hat von CEP, Esper oder CCR gehört?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;hat einen Artikel über CEP, Esper oder CCR gelesen (von dir oder jemand anders)?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;verwendet CEP, Esper oder CCR produktiv in seinen Buisiness Anwendungen?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Antwort: &lt;em&gt;fast&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;Niemand&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;"Wer das wirklich einmal ausprobieren will, was man mit einer Abfragesprache auf Event-Strömen tun kann, dann kann mit NEsper spielen"&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:16;"&gt;&lt;strong&gt;Reaktive Programmierung wird im Core .NET Framework vorhanden sein. Das ist das Neue! Das ist Etablierung!&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;h2&gt;Was ist mit LINQ&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;Zur Erinnerung: für Ralf besteht das Problem am Reactive Framework, dass es das alles schon einmal gab. Was war aber gleich nochmal LINQ?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;BetaMax vs. VHS, HD vs. BlueRay&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;LINQ hat da eine Tür aufgestoßen, das Reaktive Framework wird das gleiche machen und den Weg in den Mainstream finden&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;"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"&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;h2&gt;Fazit&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;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 &lt;strong&gt;etabliert&lt;/strong&gt;. 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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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...&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-7498301033534267740?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/7498301033534267740/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=7498301033534267740' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/7498301033534267740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/7498301033534267740'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2009/10/stirnrunzeln-uber-uber-das-neuste-von.html' title='Stirnrunzeln über: &amp;quot;Stirnrunzeln über das Neuste von Microsoft seit geschnitten Brot&amp;quot;'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-1622844556681061059</id><published>2009-06-25T08:18:00.001+01:00</published><updated>2009-06-25T08:18:54.467+01:00</updated><title type='text'>F# - Teil 1</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='color:#17365d; font-size:13pt'&gt;&lt;strong&gt;Déjà-vu&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;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 &lt;strong&gt;J#&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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?&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;J# vs. F#&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Nun, auf den ersten Blick hat F# ein schlechtes "Karma". Warum kann man aber doch sagen, das F# seinen Weg machen wird?&lt;br /&gt;&lt;table border='0' style='border-collapse:collapse'&gt;&lt;colgroup&gt;&lt;col style='width:189px'/&gt;&lt;col style='width:136px'/&gt;&lt;col style='width:136px'/&gt;&lt;col style='width:121px'/&gt;&lt;/colgroup&gt;&lt;tbody valign='top'&gt;&lt;tr style='background: #4f81bd'&gt;&lt;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'&gt; &lt;/td&gt;&lt;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'&gt;&lt;p&gt;&lt;span style='color:white'&gt;&lt;strong&gt;J#&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;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'&gt;&lt;p&gt;&lt;span style='color:white'&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;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'&gt;&lt;p&gt;&lt;span style='color:white'&gt;&lt;strong&gt;F#&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style='background: #d3dfee'&gt;&lt;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'&gt;&lt;p&gt;&lt;strong&gt;Paradigma&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style='padding-left: 9px; padding-right: 9px; border-top:  none; border-left:  none; border-bottom:  solid #7ba0cd 1.0pt; border-right:  none'&gt;&lt;p&gt;objektorientiert&lt;/p&gt;&lt;/td&gt;&lt;td style='padding-left: 9px; padding-right: 9px; border-top:  none; border-left:  none; border-bottom:  solid #7ba0cd 1.0pt; border-right:  none'&gt;&lt;p&gt;objektorientiert&lt;/p&gt;&lt;/td&gt;&lt;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'&gt;&lt;p&gt;funktional&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;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'&gt;&lt;p&gt;&lt;strong&gt;Sprachfamilie&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style='padding-left: 9px; padding-right: 9px; border-top:  none; border-left:  none; border-bottom:  solid #7ba0cd 1.0pt; border-right:  none'&gt;&lt;p&gt;C&lt;/p&gt;&lt;/td&gt;&lt;td style='padding-left: 9px; padding-right: 9px; border-top:  none; border-left:  none; border-bottom:  solid #7ba0cd 1.0pt; border-right:  none'&gt;&lt;p&gt;C&lt;/p&gt;&lt;/td&gt;&lt;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'&gt;&lt;p&gt;ML&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style='background: #d3dfee'&gt;&lt;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'&gt;&lt;p&gt;&lt;strong&gt;Kompatibilität&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style='padding-left: 9px; padding-right: 9px; border-top:  none; border-left:  none; border-bottom:  solid #7ba0cd 1.0pt; border-right:  none'&gt;&lt;p&gt;JAVA&lt;/p&gt;&lt;/td&gt;&lt;td style='padding-left: 9px; padding-right: 9px; border-top:  none; border-left:  none; border-bottom:  solid #7ba0cd 1.0pt; border-right:  none'&gt;&lt;p&gt;-&lt;/p&gt;&lt;/td&gt;&lt;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'&gt;&lt;p&gt;OCAML&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h5&gt;Vergleich von J# und F#&lt;br /&gt;&lt;/h5&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;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. &lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Fazit&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ich glaube, dass man folgendes plakativ von F# sagen kann (andere funktionale Sprachen eingeschlossen):&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Dank F# gibt es Generics. Dank F# gibt es Lambda Ausdrücke. Dank F# gibt es LINQ.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Danke F#!&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Ausblick&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-1622844556681061059?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/1622844556681061059/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=1622844556681061059' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1622844556681061059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1622844556681061059'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2009/06/f-teil-1.html' title='F# - Teil 1'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-2078978652178385626</id><published>2009-03-18T15:11:00.001Z</published><updated>2009-03-18T15:11:14.582Z</updated><title type='text'>Silverlight 3</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;WOW! &lt;br /&gt;&lt;/p&gt;&lt;p&gt;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 ;-))&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Auf die Schnell konnte ich folgende interessanten, lang erwarteten und teilweise überraschenden Neuerungen feststellen.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;ObservableCollection&amp;lt;T&amp;gt;&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Wie bereits aus WPF bekannt, implementiert diese Collection das &lt;em&gt;INotifyCollectionChanged&lt;/em&gt; 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&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;ICollectionView&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Eng mit der ObservableCollection sind die sog. CollectionViews verbunden. In WPF gibt es diverse View Implementiereungen, &lt;em&gt;ItemsCollectionView&lt;/em&gt;, &lt;em&gt;EnumerationCollectionView&lt;/em&gt;, &lt;em&gt;ListCollectionView&lt;/em&gt;, &lt;em&gt;BindingListCollectionView&lt;/em&gt;. Diese gibt es aber &lt;strong&gt;nicht&lt;/strong&gt; in Silverlight 3.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;PagedCollectionView&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Interessanterweise gibt es aber die &lt;em&gt;PagedCollectionView&lt;/em&gt;; die es aber nicht in WPF gibt...&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Nachwievor bewegen sich WPF und Silverlight immer noch stark auseinander. Leider.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Animationen&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;Für Animationen gibt es jetzt "&lt;strong&gt;Ease&lt;/strong&gt;" Funktionen. Diese interpolieren eine Funktion die z.B. eine Beschleunigung simuliert. So kann man z.B. auch einen Ball springen lassen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In WPF kann man solche Effekte über "KeySplines" erzeugen, aber auch diese gibt es nicht in Silverlight.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Weitere Neuerungen werden noch gepostet. Stay tuned.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So jetzt schnell nach Hause, damit ich mir die Keynote live gestreamt angucken kann!&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-2078978652178385626?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/2078978652178385626/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=2078978652178385626' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/2078978652178385626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/2078978652178385626'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2009/03/silverlight-3.html' title='Silverlight 3'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-5279095935065184389</id><published>2009-01-28T11:13:00.002Z</published><updated>2009-01-28T11:15:11.471Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>WPF Window als Vollbild</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;Ein WPF Fenster kann auch im Vollbildmodus angezeigt werden und somit den gesamten Bildschirmplatz einnehmen ohne die Windowsstartleiste&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Wie funktioniert das?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Nun, es ist einfacher als man denkt. Dafür braucht man keine nativen Windows APIs aufzurufen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Folgender XAML Code zeigt wie es geht:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:red;"&gt; x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Class&lt;/span&gt;&lt;span style="color:blue;"&gt;="WpfApplication1.Window1"&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;Title&lt;/span&gt;&lt;span style="color:blue;"&gt;="Window1"&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;WindowStyle&lt;/span&gt;&lt;span style="color:blue;"&gt;="None"&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;WindowState&lt;/span&gt;&lt;span style="color:blue;"&gt;="Maximized"&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;WindowStartupLocation&lt;/span&gt;&lt;span style="color:blue;"&gt;="CenterScreen"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;span style="color:#a31515;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:red;"&gt; Background&lt;/span&gt;&lt;span style="color:blue;"&gt;="Red"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;span style="color:#a31515;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Zunächst wir der &lt;em&gt;WindowState&lt;/em&gt; mit Maximized angegeben. Das bewirkt natürlich dass das Fenster den gesamten Bildschirm ausfüllt.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Den ganzen Bildschirm? Nein, denn unten (oder oben) [oder auch an den Seiten] befindet sich die Windows Taskbar. &lt;span style="font-family:Courier New;font-size:10;color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Wird nun der &lt;em&gt;WindowStyle&lt;/em&gt; wird auf &lt;em&gt;None&lt;/em&gt; gesetzt, hat das Fenster keinen Rahmen, also auch keine Titelleiste und Controlbar.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Allerdings verschwindet nun auch die Taskbar und das Fenster füllt tatsächlich den gesamten Screen aus.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Nun kann z.B. eine Photoshow starten.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;partial&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;Window1&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;Window&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; Window1()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;InitializeComponent();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.KeyDown = RootKey;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;void&lt;/span&gt; RootKey(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;KeyEventArgs&lt;/span&gt; e)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; ((e.Key == &lt;span style="color:#2b91af;"&gt;Key&lt;/span&gt;.Escape)  (e.Key == &lt;span style="color:#2b91af;"&gt;Key&lt;/span&gt;.F11))&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;this&lt;/span&gt;.WindowStyle == &lt;span style="color:#2b91af;"&gt;WindowStyle&lt;/span&gt;.None)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.WindowStyle = &lt;span style="color:#2b91af;"&gt;WindowStyle&lt;/span&gt;.ThreeDBorderWindow;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.WindowState = &lt;span style="color:#2b91af;"&gt;WindowState&lt;/span&gt;.Normal;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;else&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.WindowStyle = &lt;span style="color:#2b91af;"&gt;WindowStyle&lt;/span&gt;.None;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.WindowState = &lt;span style="color:#2b91af;"&gt;WindowState&lt;/span&gt;.Maximized;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;e.Handled = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Ob dieses Feature beabsichtigt ist; weiß ich nicht. Ob dieses Feature jede Anwendung benötigt? Eher nicht.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Wer allerdings eine Vollbild Anwendung entwicklen will, der kann auch das mit WPF tun, und zwar mit relativ wenig Aufwand.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-5279095935065184389?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/5279095935065184389/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=5279095935065184389' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/5279095935065184389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/5279095935065184389'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2009/01/wpf-window-als-vollbild.html' title='WPF Window als Vollbild'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-1192333306095725610</id><published>2008-10-08T11:08:00.002+01:00</published><updated>2008-10-08T11:15:54.410+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDC08'/><title type='text'>PDC08: new XAML features</title><content type='html'>XAML ist DIE deklarative Programmiersprache für .NET.&lt;br /&gt;&lt;br /&gt;Sie findet hauptsächlich Anwendung in WPF, aber auch in WF und WCF&lt;br /&gt;&lt;br /&gt;Auf der PDC wird sich eine Session rund um XAML drehen. Es wird gezeigt wie eine Anwendung komplett deklarativ in XAML geschrieben werden kann.&lt;br /&gt;&lt;br /&gt;XAML wird außerdem mit XOML aus der Workflow Foundation vereinigt. Man darf gespannt sein auf welche Anwendungsbereiche XAML ausgeweitet werden wird.&lt;br /&gt;&lt;br /&gt;Neue XAML Features werden sein:&lt;br /&gt;- support für generics&lt;br /&gt;- object references&lt;br /&gt;- non default constructors&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;cu @ PDC&lt;br /&gt;Benjamin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-1192333306095725610?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/1192333306095725610/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=1192333306095725610' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1192333306095725610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1192333306095725610'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2008/10/pdc08-new-xaml-features.html' title='PDC08: new XAML features'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-6039059062520526858</id><published>2008-10-08T09:31:00.003+01:00</published><updated>2008-10-08T09:57:31.009+01:00</updated><title type='text'>C# 4.0: dynamic</title><content type='html'>&lt;div&gt;C# wird dynamisch!&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Das erste publik gemachte Feature von C# 4.0 sind dynamic lookups. Diese werden durch das neue Schlüsselwort - &lt;span style="font-family:courier new;font-size:130%;color:#3333ff;"&gt;&lt;strong&gt;dynamic&lt;/strong&gt;&lt;/span&gt; - ermöglicht.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;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).&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Dynamic Lookups sind in der DLR (Dynamic Language Runtime) implementiert und für dynamische Sprachen unerlässlich.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Das folgende Beispiel ist den Slides der Keynote von Anders Hejsberg auf der JAOO entnommen&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_c4ehIbstBAc/SOx1p8mHlYI/AAAAAAAAACA/18Wx_HcqbMM/s1600-h/dynamic.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5254704228735620482" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_c4ehIbstBAc/SOx1p8mHlYI/AAAAAAAAACA/18Wx_HcqbMM/s400/dynamic.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-6039059062520526858?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/6039059062520526858/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=6039059062520526858' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/6039059062520526858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/6039059062520526858'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2008/10/c-40-dynamic.html' title='C# 4.0: dynamic'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_c4ehIbstBAc/SOx1p8mHlYI/AAAAAAAAACA/18Wx_HcqbMM/s72-c/dynamic.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-8708699312682742485</id><published>2008-09-10T08:45:00.002+01:00</published><updated>2008-09-10T09:02:08.810+01:00</updated><title type='text'>Olso und D#</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pluralsight.com/community/blogs/dbox/default.aspx"&gt;Don Box&lt;/a&gt; ist einer der Architekten von Oslo und gibt in seinem Blog kleine versteckte Hinweise. Heute wies er auf einen interessanten &lt;a href="http://www.eweek.com/c/a/Windows/The-Origins-of-Microsofts-Oslo-Software-Modeling-Platform/"&gt;Artikel &lt;/a&gt;hin, der weitere Geheimnisse zu Olso enthüllt.&lt;br /&gt;&lt;br /&gt;Nach LINQ wird dieses Jahr ein weiterer Hammer vorgestellt werden:&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Textuelle Domain Specific Languages (DSL)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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)&lt;br /&gt;&lt;br /&gt;Übrigens der Codename für diese TDSL ist "D".&lt;br /&gt;Vielleicht bekommen wir nach C# nun ein D# !?&lt;br /&gt;&lt;br /&gt;C.U. at PDC&lt;br /&gt;Benjamin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-8708699312682742485?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/8708699312682742485/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=8708699312682742485' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8708699312682742485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8708699312682742485'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2008/09/olso-und-d.html' title='Olso und D#'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-225202810134109260</id><published>2008-05-29T06:32:00.002+01:00</published><updated>2008-05-29T06:38:14.779+01:00</updated><title type='text'>PDC2008 I'm comming</title><content type='html'>Bei der letzten PDC habe ich mir noch alle Sessions online angesehen. &lt;br /&gt;&lt;br /&gt;Jetzt bin ich LIVE dabei!&lt;br /&gt;&lt;br /&gt;Themen werden sein:&lt;br /&gt;&lt;br /&gt;- The Live Developer platform, including the MESH.&lt;br /&gt;- Cloud Computing" from computation, to storage and much more! &lt;br /&gt;- Visual Studio 10" and .NET Framework 4.0&lt;br /&gt;- ASP.NET Futures including v.next of MVC, Ajax and Dynamic data&lt;br /&gt;- Silverlight Futures, including Silverlight for business applications&lt;br /&gt;- And much, much more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-225202810134109260?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/225202810134109260/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=225202810134109260' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/225202810134109260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/225202810134109260'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2008/05/pdc2008-im-comming.html' title='PDC2008 I&apos;m comming'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-5955030797474717359</id><published>2008-05-08T16:27:00.001+01:00</published><updated>2008-05-08T16:27:55.024+01:00</updated><title type='text'>StackPanel Items in umgekehrter Reihenfolge anzeigen</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;Das StackPanel in WPF kann Controls untereinander anordnen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Mit der Eigenschaft Orientation=Horizontal ist es möglich auch die Elemente von Links nach Rechts anzuordnen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Es gibt aber keine Eigenschaft StackItemsFrom="Top|Bottom".&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Natürlich kann man ein eigenes StackPanel implementieren, das dies kann. Es geht aber auch einfacher.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Am Anfang war das ItemsControl&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;Wir benötigen zunächst ein ItemsControl. Ein ItemsControl kann beliebige Objekte, also auch Double, Boolean, Person etc., aufnehmen. Ein Panel hingegen nur Controls.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Das ItemControl benötigt jedoch ein Panel um die Objekte darstellen zu können. Standardmäßig ist dies ein StackPanel. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ü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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Wie die Objekte aussehen bestimmt ein DataTemplate. Für jedes Objekt generiert das ItemsControl einen Container (ContentPresenter, für ListBox -&amp;gt; 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. &lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Verkehrte Welt&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;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).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Nun müssen wir noch im ItemContainerStyle festlegen, dass die Elemente jeweils von Unten angeordnet werden sollen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;ItemsControl&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;ItemsControl.ItemsPanel&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;ItemsPanelTemplate&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;DockPanel&lt;/span&gt;&lt;span style='color:red'&gt; VerticalAlignment&lt;/span&gt;&lt;span style='color:blue'&gt;="Top"&lt;/span&gt;&lt;span style='color:red'&gt; LastChildFill&lt;/span&gt;&lt;span style='color:blue'&gt;="False" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#a31515'&gt;ItemsPanelTemplate&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#a31515'&gt;ItemsControl.ItemsPanel&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;ItemsControl.ItemContainerStyle&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;Style&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;Setter&lt;/span&gt;&lt;span style='color:red'&gt; Property&lt;/span&gt;&lt;span style='color:blue'&gt;="DockPanel.Dock"&lt;/span&gt;&lt;span style='color:red'&gt; Value&lt;/span&gt;&lt;span style='color:blue'&gt;="Bottom"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#a31515'&gt;Style&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#a31515'&gt;ItemsControl.ItemContainerStyle&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;        &lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;Button&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;1&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#a31515'&gt;Button&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;Button&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;2&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#a31515'&gt;Button&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;Button&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;3&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#a31515'&gt;Button&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#a31515'&gt;&lt;br /&gt;					&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#a31515'&gt;ItemsControl&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Et Voila&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p/&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-5955030797474717359?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/5955030797474717359/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=5955030797474717359' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/5955030797474717359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/5955030797474717359'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2008/05/stackpanel-items-in-umgekehrter.html' title='StackPanel Items in umgekehrter Reihenfolge anzeigen'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-2503116735557874034</id><published>2008-05-08T12:04:00.001+01:00</published><updated>2008-05-08T12:04:39.566+01:00</updated><title type='text'>AttachedProperties richtig initialisieren</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;public&lt;/span&gt;&lt;br /&gt;					&lt;span style='color:blue'&gt;static&lt;/span&gt;&lt;br /&gt;					&lt;span style='color:blue'&gt;void&lt;/span&gt; SetAttachedProperty(&lt;span style='color:#2b91af'&gt;DependencyObject&lt;/span&gt; obj, &lt;span style='color:blue'&gt;int&lt;/span&gt; value)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;    obj.SetValue(AttachedProperty, value);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;    InitializeProperty();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Die Set-Methode macht nichts Weiteres, als bei dem übergebenen DependencyObjekt &lt;span style='font-family:Courier New; font-size:10pt'&gt;SetValue&lt;/span&gt; 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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Um eine AttachedProperty zu setzen, reicht es tatsächlich lediglich die DependencyProperty am eigenen Objekt zu setzen und nicht am Containerobjekt durch &lt;span style='font-family:Courier New; font-size:10pt'&gt;Set[Property]&lt;/span&gt;! 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 &lt;span style='font-family:Courier New; font-size:10pt'&gt;Set[Property]&lt;/span&gt; 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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;public&lt;/span&gt;&lt;br /&gt;					&lt;span style='color:blue'&gt;static&lt;/span&gt;&lt;br /&gt;					&lt;span style='color:blue'&gt;readonly&lt;/span&gt;&lt;br /&gt;					&lt;span style='color:#2b91af'&gt;DependencyProperty&lt;/span&gt; PropertyWithCallback; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='color:green; font-family:Courier New; font-size:10pt'&gt;//Definition der Metadaten mit Callback&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:#2b91af'&gt;PropertyMetadata&lt;/span&gt; metadata = &lt;span style='color:blue'&gt;new&lt;/span&gt;&lt;br /&gt;					&lt;span style='color:#2b91af'&gt;PropertyMetadata&lt;/span&gt;();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;metadata.PropertyChangedCallback += OnPropertyWithCallbackChanged;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='color:green; font-family:Courier New; font-size:10pt'&gt;//Registrierung der DependencyProperty&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;PropertyWithCallback = &lt;span style='color:#2b91af'&gt;DependencyProperty&lt;/span&gt;.RegisterAttached(&lt;span style='color:#a31515'&gt;"PropertyWithCallback"&lt;/span&gt;,&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;					&lt;span style='color:blue'&gt;typeof&lt;/span&gt;(&lt;span style='color:blue'&gt;int&lt;/span&gt;), &lt;span style='color:blue'&gt;typeof&lt;/span&gt;(&lt;span style='color:#2b91af'&gt;Window1&lt;/span&gt;), metadata);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='color:green; font-family:Courier New; font-size:10pt'&gt;//Der Callback ruft die eigentliche Initializierungsmethode auf&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;private&lt;/span&gt;&lt;br /&gt;					&lt;span style='color:blue'&gt;static&lt;/span&gt;&lt;br /&gt;					&lt;span style='color:blue'&gt;void&lt;/span&gt; OnPropertyWithCallbackChanged(&lt;span style='color:#2b91af'&gt;DependencyObject&lt;/span&gt; obj, &lt;span style='color:#2b91af'&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; value)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;    InitializeProperty();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-2503116735557874034?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/2503116735557874034/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=2503116735557874034' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/2503116735557874034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/2503116735557874034'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2008/05/attachedproperties-richtig.html' title='AttachedProperties richtig initialisieren'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-2955860404016950676</id><published>2008-05-07T08:36:00.002+01:00</published><updated>2008-05-07T09:01:27.756+01:00</updated><title type='text'>Eigene Linien in Grid Panel zeichnen</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;Das Grid ist das Mächtigste und am Häufigsten gebrauchte Panel in WPF.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Mit der Eigenschaft "ShowGridLines" lassen sich Hilfslinien anzeigen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#a31515'&gt;Grid&lt;/span&gt;&lt;span style='color:red'&gt; ShowGridLines&lt;/span&gt;&lt;span style='color:blue'&gt;="True"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='color:blue; font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_c4ehIbstBAc/SCFgenHSMxI/AAAAAAAAAA8/6weQ4embPhA/s1600-h/image1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_c4ehIbstBAc/SCFgenHSMxI/AAAAAAAAAA8/6weQ4embPhA/s400/image1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5197541523974140690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Diese Linien dienen nur als Hilfestellung für den Entwickler, der so die Position der Spalten und Reihen erkennen kann.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Leider kann man nicht selber bestimmen wie diese Linien aussehen. Oder etwas doch?&lt;span style='color:blue; font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Was passiert eigentlich im Grid wenn  ShowGridLines=True gesetzt wird?&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;WPF-Controls können sich selbst zeichnen, in dem sie die OnRender Methode überschreiben. Wie dies auch bei OnPaint in WinForms der Fall ist.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;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. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Der VisualTree im XamlPad zeigt, dass neben dem logischen Child – einem Button - noch ein visuelles Element - der GridLinesRenderer  - in der Hierarchie zu finden ist.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_c4ehIbstBAc/SCFge3HSMyI/AAAAAAAAABE/w12VxJLO-Fo/s1600-h/image2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_c4ehIbstBAc/SCFge3HSMyI/AAAAAAAAABE/w12VxJLO-Fo/s400/image2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5197541528269108002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;   &lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;h2&gt;Möglichkeit 1: Einen eigenen GridLinesRenderer schreiben&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;Meine erste Idee war es einen eigenen GridLinesRenderer zu schreiben. Ganz nach dem Vorbild des in dem Grid zu findenden Renderer.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ein eigenes Grid zu erstellen, nur um die GridLinien zeichnen zu können war mir dann aber zu aufwändig. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Es muss einen anderen Weg geben.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Möglichkeit 2: Einen GridLinesAdorner schreiben&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;Public&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Class&lt;/span&gt; GridLinesAdorner&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Inherits&lt;/span&gt; Adorner&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Private&lt;/span&gt; Grid &lt;span style='color:blue'&gt;As&lt;/span&gt; System.Windows.Controls.Grid&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:green'&gt;'Übergabe des zu verzierenden Elements (hier Grid)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Sub&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;New&lt;/span&gt;(&lt;span style='color:blue'&gt;ByVal&lt;/span&gt; grid &lt;span style='color:blue'&gt;As&lt;/span&gt; System.Windows.Controls.Grid)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;MyBase&lt;/span&gt;.New(grid)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Me&lt;/span&gt;.Grid = grid&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Sub&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Private&lt;/span&gt; _pen &lt;span style='color:blue'&gt;As&lt;/span&gt; Pen&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:green'&gt;'Stift um die Linien zeichnen zu können&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Public&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Property&lt;/span&gt; Pen() &lt;span style='color:blue'&gt;As&lt;/span&gt; Pen&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Get&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Return&lt;/span&gt; _pen&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Get&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Set&lt;/span&gt;(&lt;span style='color:blue'&gt;ByVal&lt;/span&gt; value &lt;span style='color:blue'&gt;As&lt;/span&gt; Pen)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;            _pen = value&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Set&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Property&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:green'&gt;'Zeichnen der Linien&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Protected&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Overrides&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Sub&lt;/span&gt; OnRender(&lt;span style='color:blue'&gt;ByVal&lt;/span&gt; dc &lt;span style='color:blue'&gt;As&lt;/span&gt; System.Windows.Media.DrawingContext)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;If&lt;/span&gt; Pen &lt;span style='color:blue'&gt;Is&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Nothing&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Then&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Exit&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Sub&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;If&lt;/span&gt; Grid.ColumnDefinitions.Count &amp;gt; 0 &lt;span style='color:blue'&gt;Then&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Dim&lt;/span&gt; x &lt;span style='color:blue'&gt;As&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Double&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;For&lt;/span&gt; i &lt;span style='color:blue'&gt;As&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Integer&lt;/span&gt; = 1 &lt;span style='color:blue'&gt;To&lt;/span&gt; Grid.ColumnDefinitions.Count - 1&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;                x = Grid.ColumnDefinitions(i).Offset&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;                dc.DrawLine(Pen, &lt;span style='color:blue'&gt;New&lt;/span&gt; Point(x, 0), &lt;span style='color:blue'&gt;New&lt;/span&gt; Point(x, Grid.ActualHeight))&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Next&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;If&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;If&lt;/span&gt; grid.RowDefinitions.Count &amp;gt; 0 &lt;span style='color:blue'&gt;Then&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Dim&lt;/span&gt; y &lt;span style='color:blue'&gt;As&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Double&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;For&lt;/span&gt; i &lt;span style='color:blue'&gt;As&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Integer&lt;/span&gt; = 1 &lt;span style='color:blue'&gt;To&lt;/span&gt; Grid.RowDefinitions.Count - 1&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;                y = Grid.RowDefinitions(i).Offset&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;                dc.DrawLine(Pen, &lt;span style='color:blue'&gt;New&lt;/span&gt; Point(0, y), &lt;span style='color:blue'&gt;New&lt;/span&gt; Point(Grid.ActualWidth, y))&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Next&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;If&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Sub&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Class&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Anwenden des Adorners&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;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.)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;Class&lt;/span&gt; Window1 &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Private&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Sub&lt;/span&gt; Window1_Loaded(&lt;span style='color:blue'&gt;ByVal&lt;/span&gt; sender &lt;span style='color:blue'&gt;As&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Object&lt;/span&gt;, &lt;span style='color:blue'&gt;ByVal&lt;/span&gt; e &lt;span style='color:blue'&gt;As&lt;/span&gt; System.Windows.RoutedEventArgs) &lt;span style='color:blue'&gt;Handles&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Me&lt;/span&gt;.Loaded&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:green'&gt;'Layer für das Element holen in dem der Adorner gezeichnet wird&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Dim&lt;/span&gt; layer &lt;span style='color:blue'&gt;As&lt;/span&gt; AdornerLayer = AdornerLayer.GetAdornerLayer(&lt;span style='color:blue'&gt;Me&lt;/span&gt;.Grid)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:green'&gt;'Adorner mit Stift erstellen&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Dim&lt;/span&gt; adorner &lt;span style='color:blue'&gt;As&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;New&lt;/span&gt; GridLinesAdorner(Grid)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;        adorner.Pen = &lt;span style='color:blue'&gt;New&lt;/span&gt; Pen(Brushes.Black, 2)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:green'&gt;'Adorner dem Layer hinzufügen&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;        layer.Add(adorner)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Sub&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:10pt'&gt;&lt;span style='color:blue'&gt;End&lt;/span&gt;&lt;br /&gt;     &lt;span style='color:blue'&gt;Class&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;h2&gt;Das Ergebnis&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_c4ehIbstBAc/SCFgfHHSMzI/AAAAAAAAABM/1vp8lLPqKIs/s1600-h/image3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_c4ehIbstBAc/SCFgfHHSMzI/AAAAAAAAABM/1vp8lLPqKIs/s400/image3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5197541532564075314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;   &lt;/p&gt;&lt;p&gt;Wer noch einen Rahmen um das Grid herum haben möchte, der brauch nur noch das Grid in ein Border zu packen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Achtung: Wie man sieht wird der Adorner &lt;span style='text-decoration:underline'&gt;über&lt;/span&gt; das Grid gezeichnet. Daher sind die Ränder der im Grid befindlichen Buttons nicht ganz zu sehen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Hier muss dann noch ein entsprechendes Margin auf die Buttons angewendet werden um den richtigen Abstand zu den Gridinnenseiten zu ermöglichen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-2955860404016950676?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/2955860404016950676/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=2955860404016950676' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/2955860404016950676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/2955860404016950676'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2008/05/eigene-linien-in-grid-panel-zeichnen.html' title='Eigene Linien in Grid Panel zeichnen'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_c4ehIbstBAc/SCFgenHSMxI/AAAAAAAAAA8/6weQ4embPhA/s72-c/image1.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-8963095022364816941</id><published>2008-04-29T21:02:00.002+01:00</published><updated>2008-04-29T21:37:24.106+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>WPF goes Transitions</title><content type='html'>Effekte a la PowerPoint? Mit WPF kein Problem!?&lt;br /&gt;&lt;br /&gt;WPF bietet zwar Animationsunterstützungen, doch diese müssen mühsam programmiert werden. &lt;br /&gt;&lt;br /&gt;Nun gibt es ein Framework das Übergangseffekte für WPF bereitsstellt.&lt;br /&gt;z.B. Wipe, Fade, oder RotatingCube. Auch aufwendige 3D Animation sind frei verfügbar.&lt;br /&gt;&lt;br /&gt;Entwickelt hat dies &lt;a href="http://blogs.msdn.com/jbienz"&gt;Jaraed Bienz&lt;/a&gt;.&lt;br /&gt;Download auf CodePlex: &lt;a href="http://www.codeplex.com/transitionals"&gt;Transitionals&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wer jetzt vielleicht sagt: "He, das habe ich schonmal gesehen!"&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Zwar ist das Transitionframework (noch) kein Teil von WPF. Aber dennoch sehr nützlich, zumal frei zugänglich und erweiterbar.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_c4ehIbstBAc/SBeGxnHSMwI/AAAAAAAAAA0/U6D0jc_n58U/s1600-h/clip_image001_2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_c4ehIbstBAc/SBeGxnHSMwI/AAAAAAAAAA0/U6D0jc_n58U/s400/clip_image001_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5194768882066404098" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-8963095022364816941?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/8963095022364816941/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=8963095022364816941' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8963095022364816941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8963095022364816941'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2008/04/wpf-goes-transitions.html' title='WPF goes Transitions'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_c4ehIbstBAc/SBeGxnHSMwI/AAAAAAAAAA0/U6D0jc_n58U/s72-c/clip_image001_2.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-5502538582493603836</id><published>2007-12-10T17:24:00.000Z</published><updated>2007-12-10T17:27:40.767Z</updated><title type='text'>Basta! 2008 Spring Edition</title><content type='html'>Schon zum 2. Mal werde ich auf der BASTA! sprechen.&lt;br /&gt;&lt;br /&gt;Meine Session(s)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Reflection in Action&lt;/h4&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Allein dafür lohnt es sich auf die BASTA! zukommen.&lt;br /&gt;&lt;br /&gt;Benny&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Software &amp; Support Verlag: BASTA! Speakerbutton --&gt;&lt;br /&gt;&lt;object width="160" height="160"&gt;&lt;param name="movie" value="http://www.entwickler.com/banner/extern/buttons/basta_speakerbutton.swf"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.entwickler.com/banner/extern/buttons/basta_speakerbutton.swf" type="application/x-shockwave-flash" wmode="transparent" width="160" height="160"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;!-- END Software &amp; Support Verlag: BASTA! Speakerbutton --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-5502538582493603836?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/5502538582493603836/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=5502538582493603836' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/5502538582493603836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/5502538582493603836'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/12/basta-2008-spring-edition.html' title='Basta! 2008 Spring Edition'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-4616217068411501113</id><published>2007-12-07T09:39:00.000Z</published><updated>2007-12-07T09:46:24.325Z</updated><title type='text'>PDC2008 announced!</title><content type='html'>Nachdem die PDC2007 ausgefallen ist, weil "zu wenig Neues" und die TechEd2007 Europe tatsächlich wenig Neues zu bieten hatte, findet sie nun statt:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;die PDC2008 in Los Angeles!&lt;/h3&gt;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-gb/events/bb288534.aspx"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vermutliche Themen:&lt;br /&gt;- .NET Framework 4.0&lt;br /&gt;- Volta (MSIL Recompiler)&lt;br /&gt;- Software + Services&lt;br /&gt;- WPF Composite Smart Clients&lt;br /&gt;- (hoffentlich neue (WPF Controls bzw. Features))&lt;br /&gt;- Silverlight 2.0 und DLR&lt;br /&gt;&lt;br /&gt;Urlaub ist schon geplant!&lt;br /&gt;&lt;br /&gt;Benny&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-4616217068411501113?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/4616217068411501113/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=4616217068411501113' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/4616217068411501113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/4616217068411501113'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/12/pdc2008-announced.html' title='PDC2008 announced!'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-8953581660448724398</id><published>2007-10-30T07:39:00.000Z</published><updated>2007-10-30T08:29:30.911Z</updated><title type='text'>WPF Composite Clients formally known as  Acropolis</title><content type='html'>Das war es also mit "Acropolis". Dem Produkt das eigentlich CAB (Composite UI Application Block) ersetzen sollte...&lt;br /&gt;&lt;br /&gt;Hier die offizielle Bekanntmachung:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/acropolis/rss.xml"&gt;Acropolis Team Blog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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!&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Hier ein Kommentar dazu aus der CAB Comunity.&lt;br /&gt;&lt;a href="http://neverindoubtnet.blogspot.com/feeds/posts/default?alt=rss"&gt;&lt;br /&gt;Requiem for Acropolis; Fanfare for CAB + &lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aber es gibt schon wieder ein Neues Projekt: WPF Composite Clients&lt;br /&gt;&lt;br /&gt;Diesmal wieder unter der Leitung der Patterns &amp; 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.&lt;br /&gt;&lt;br /&gt;Glen Block bescheibt in seinem Blog das neue Projekt.&lt;br /&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2007/10/26/wpf-composite-client-guidance-it-s-coming.aspx"&gt; Glenn Block&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;WPF bietet außerdem eine komplette andere "experience". Es wird daher &lt;strong&gt;keinen &lt;/strong&gt;Migrationspfad von WinForms geben. (So wie dies noch in Acropolis vorgesehen war). &lt;br /&gt;&lt;br /&gt;Wie herausklang wird es weiter Verbesserungen an WinForms geben! WinForms geht also noch nicht in Rente.&lt;br /&gt;&lt;br /&gt;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!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-8953581660448724398?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/8953581660448724398/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=8953581660448724398' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8953581660448724398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8953581660448724398'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/10/wpf-composite-clients-formally-known-as.html' title='WPF Composite Clients formally known as  Acropolis'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-1593211998754870559</id><published>2007-10-10T12:25:00.000+01:00</published><updated>2007-10-10T12:40:14.774+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>CSV Dateien verarbeiten mit LINQ</title><content type='html'>Mein erster (langer) Artikel in der dotnetpro (&lt;a href="http://www.dotnetpro.de/"&gt;http://www.dotnetpro.de/&lt;/a&gt;) ist erschienen!&lt;br /&gt;&lt;br /&gt;Ich zeige, dass man mit LINQ nicht nur Datenbanken ansprechen kann, sondern ganz simple auch CSV Dateien einlesen, filtern und ausgeben kann. Mit LINQ und C# 3.0 ist das eine Sache von 3 Zeilen Code.&lt;br /&gt;&lt;br /&gt;Auf die Idee bin ich durch den Contest der dotnetpro gekommen. Die Aufgabenstellung war CSV Daten zu verarbeiten. Es war abzusehen, dass die jeder mit einer Datenbank angehen würde. Der eine verwendet SQLServer, der andere MySQL. Besonders beliebt bei dem Contest war aber SQLLight.&lt;br /&gt;&lt;br /&gt;Und der der Gewinner ist....&lt;br /&gt;&lt;br /&gt;Gewonnen habe ich dann, mit meiner Lösung nicht. Und das obwohl ich &lt;strong&gt;25% schneller&lt;/strong&gt; war als die Siegerlösung!!!&lt;br /&gt;(Ja Mama! Es waren wieder einmal die Flüchtigkeitsfehler)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-1593211998754870559?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/1593211998754870559/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=1593211998754870559' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1593211998754870559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1593211998754870559'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/10/csv-dateien-verarbeiten-mit-linq.html' title='CSV Dateien verarbeiten mit LINQ'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-3846054066395930708</id><published>2007-09-22T16:14:00.000+01:00</published><updated>2007-09-22T16:31:09.779+01:00</updated><title type='text'>Neulich auf der BASTA</title><content type='html'>Hallo,&lt;br /&gt;&lt;br /&gt;da bin ich also Zurück vom Abenteuer BASTA. Ich kann nur sagen ich hab's überlebt!&lt;br /&gt;&lt;br /&gt;Die Keynote sollte eigentlich Dirk Primps halten. Das hat er aber irgendwie verpennt!&lt;br /&gt;Er wurde natürlich von den anden Speakern ständig daran aufgezogen.&lt;br /&gt;&lt;br /&gt;Das Essen beim Speakerdinner war nicht nach dem Geschmack der Meisten. So gab es z.B. Schafskäse an Raffaello. Das Essen auf der Konferenz war tiefkühlfraß und schlimmer als bei McDonalds. Kein Wunder, dass einige Teilnehmer und auch Speaker so ihre Probleme hatten. Holger S. hat seine Session mit Durchfall gehalten, Neno stand aber bereit um für Ihn einzuspringen.&lt;br /&gt;&lt;br /&gt;Christian Groß hat sich bei seinem Workshop, das Handy eines Teilnehmers geschnappt und sich damit auf den Boden geworfen! Er wollte das Thema Security etwas verdeutlichen.&lt;br /&gt;&lt;br /&gt;Der Oberhammer war Oliver Sturm. Hat er doch die 10 coolsten Features in C# 3.0 gezeigt. Er hat sich extra einen Timer programmiert und die Features auf die Sekunde vorgeführt. Man hat er die Leute weggeblasen. Er von Dingen geredet die die Leute noch in C# 5.0 kappieren werden.&lt;br /&gt;&lt;br /&gt;Feucht fröhlich ging es beim Abschlussessen weiter:&lt;br /&gt;Jörg N.: "Jetzt geht schon wieder die Diskussion los, was besser ist C# oder VB&lt;br /&gt;Jörg N.: "Ich bin einfach nur müde"&lt;br /&gt;Benny G.: "VB ist eine Lebenseinstellung"&lt;br /&gt;Daniel F.: "VB ist eine Krankheit"&lt;br /&gt;Oliver S.: "VB ist eine Lebenseinstellung -&lt;br /&gt;                   so wie Arbeitslosigkeit!" &lt;br /&gt;&lt;br /&gt;In diesem Sinne, bis zur nächsten BASTA!&lt;br /&gt;&lt;br /&gt;Benjamin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-3846054066395930708?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/3846054066395930708/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=3846054066395930708' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/3846054066395930708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/3846054066395930708'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/09/neulich-auf-der-basta.html' title='Neulich auf der BASTA'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-8047599374232455406</id><published>2007-09-08T20:08:00.000+01:00</published><updated>2007-10-10T12:43:25.900+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio'/><title type='text'>Der Name "InitializeComponent" wurde nicht deklariert</title><content type='html'>Hallo WPF Freunde!&lt;br /&gt;&lt;br /&gt;In letzter Zeit verwende ich immer mehr WPF in meinen Anwendungen. Ganz auf WinForms möchte ich aber nicht versichten. Aus Gewohnheit nehme ich für einen neues VisualStudio Projekt die Projektvorlage "WinForms Anwendung". Wenn ich nun versuche ein WPF-UserControl zu meinem Projekt hinzufüge erscheint beim Kompilieren diese Fehlermeldung:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Der Name "InitializeComponent" wurde nicht deklariert&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Mir kamen sofort einige Fragen in den Sinn:&lt;br /&gt;-Habe ich .NET 3.0 richtig installiert?&lt;br /&gt;- Habe ich die .NET 3.0 Extensions für VisualStuido richtig installiert?&lt;br /&gt;- Ist meine XAML Datei in Ordnung?&lt;br /&gt;- Macht ExpressionBlend die Probleme (damit designe ich die UserControls)?&lt;br /&gt;&lt;br /&gt;Die Lösung ist dann doch relativ einfach.&lt;br /&gt;Man muss die Projektdatei *.proj öffnen und dem BuildSystem von VisualStuido MSBuild mitteilen wie es XAML und Code-Behind Dateien zu kompilieren hat.&lt;br /&gt;&lt;br /&gt;Diese Zeile muss man einfügen:&lt;br /&gt;&lt;br /&gt; &amp;ltimport project="$(MSBuildBinPath)\Microsoft.WinFX.targets"&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;Klar, dass die normale .NET 2.0 WinForms Anwendung Projektvorlage noch nichts von XAML und WPF gehört hat und dementsprechend die Dateien nicht richtig kompilieren kann.&lt;br /&gt;&lt;br /&gt;Benjamin Gopp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-8047599374232455406?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/8047599374232455406/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=8047599374232455406' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8047599374232455406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8047599374232455406'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/09/der-name-initializecomponent-wurde.html' title='Der Name &quot;InitializeComponent&quot; wurde nicht deklariert'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-4059596206900481635</id><published>2007-08-05T09:18:00.000+01:00</published><updated>2007-08-05T09:26:10.946+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>LINQ wird missverstanden!</title><content type='html'>In der Ausgabe 9 des dotnet magazins ( &lt;a href="http://www.dotnet-magazin.de/"&gt;http://www.dotnet-magazin.de&lt;/a&gt; ) sind in der OpenStage Kolumne meine Gedanken zu LINQ abgedruckt. Nachdem der Artikel nun erschienen wird er auch hier "abgeblogged".&lt;br /&gt;&lt;br /&gt;Mittlerweile habe ich schon dutzende Artikel und Vorträge zu LINQ gehört. Und immer wieder sehe am Inhalt der Vorträge und den Reaktionen, dass LINQ missverstanden wird. Auch die Innovatoren von LINQ tragen nicht gerade zur Klarheit bei. Ein typisches (schlechtes) LINQ-Beispiel ist:&lt;br /&gt;From c in Customer Where c.City == “London“ Select c&lt;br /&gt;Dieses Beispiel suggeriert, dass man es hier mit SQL zu tun hat. Zugegeben etwas verdrehtes SQL, das From steht vorne und das Select hinten, aber es sieht nach SQL aus. Die Assoziation die dabei unweigerlich beim Programmierer entsteht ist Folgende: Linq … SQL … Datenbank;  Ah! Linq ist für Datenbanken bestimmt. Die ganze Power von LINQ verpufft in diesem Moment, wo LINQ mit SQL gleich gesetzt wird und auf die Verwendung von Datenbanken reduziert wird.&lt;br /&gt;Liege ich mit meiner Einschätzung so falsch? Ein Blick in das LINQ MSDN-Forum zeigt, dass über 90% der Fragen auf die Verwendung von LINQ in Verbindung mit Datenbanken abzielen. Da wird von LINQ sogar als O/R Mapper gesprochen.&lt;br /&gt;Auch die LINQ Queryoperatoren tragen nicht gerade dazu bei, dass man sich von SQL unterscheiden will. From, Select, Where - diese kennen wir alle von SQL. Was LINQ gerade auszeichnet, ist aber dass man alle Datenquellen befragen kann, also auch Objekte und XML etc.. Was vorher nur auf Datenbanken beschränkt gewesen ist, ist nun für andere Datenquellen möglich. Das ist das Revolutionäre an LINQ! Ein einheitliches Konzept um Daten abzufragen!&lt;br /&gt;Natürlich muss auch ein einheitliches API für LINQ gefunden werden. Es kann schlecht sein, dass man um Datenbanken abzufragen eine andere Syntax verwenden muss, als für XML oder Objekte. Das hatten wir nämlich bisher:  SQL für Datenbanken, XPath für XML und diverse Methoden für Arrays. Damit soll nun Schluss sein. Warum gerade aber LINQ so nah an SQL angelehnt ist, kann ich nicht verstehen. Vielleicht will man damit LINQ schneller etablieren. Langfristig gesehen wird man sich damit aber Probleme einhandeln. Wir können erwarten, dass mit der Zeit LINQ Implementationen für exotischere Datenquellen, auftauchen werden. Dann mag eine SQLnahe Syntax nicht mehr passend sein! Und dann sind wir bei dem Punkt angelangt, was LINQ eigentlich vermeiden wollte, nämlich fester Bestandteil einer Programmiersprache zu werden. Denn Programmiersprachen leben länger als APIs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-4059596206900481635?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/4059596206900481635/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=4059596206900481635' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/4059596206900481635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/4059596206900481635'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/08/linq-wird-missverstanden.html' title='LINQ wird missverstanden!'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-1660431528409536597</id><published>2007-07-28T20:53:00.000+01:00</published><updated>2007-07-28T21:24:37.783+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Basic'/><category scheme='http://www.blogger.com/atom/ns#' term='Orcas'/><title type='text'>My Extensions in VS2008</title><content type='html'>Nach einem Tag downloaden und Installation, habe ich nun endlich die Beta2 von Visual Studio 2008 "Orcas" auf meinem Rechner.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aufgefallen ist mir der neue Projekttab "My Extensions"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_c4ehIbstBAc/RquhK0k-TjI/AAAAAAAAAAs/EBY5T8QuKqc/s1600-h/MyExtensions.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5092341010956963378" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_c4ehIbstBAc/RquhK0k-TjI/AAAAAAAAAAs/EBY5T8QuKqc/s400/MyExtensions.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sollte es damit einfacher möglich sein neue Erweiterungen für den My Namespace zu erstellen?&lt;br /&gt;&lt;br /&gt;Der Link "Learn more about customizung the My Namespace" war leider tot. Auch nachdem ich die 2Gig große VS2008MSDN runtergeladen und installiert hatte.&lt;br /&gt;&lt;br /&gt;Gefunden habe ich dann doch noch, wonach ich gesucht hatte. Und zwar die Quelldatei für die WPF My Extensions, die bereits in Orcas auszuwählen sind. Diese befindet sich unter dem Ordner "My Project" in dem Ordner "MyExtensions". Dort wird man dann auch in Zukunft eigene Extensions für den My Namespace ablegen können.&lt;br /&gt;&lt;br /&gt;Bleibt nach wie vor die Frage: Woher weiß VisualStudio, dass eine "My Extension" vorhanden ist? Ich habe weder eine Assembly noch ein Item-Template gefunden, dass die Vorlage für die "WPF My Extension" liefert. (Eine entsprechende Frage wie man denn diese My Extensions verwendet habe ich gleich nach der Entdeckung in das MSDN Forum gestellt. Mal gucken ob in nächster Zeit eine Anwort darauf zu finden ist.)&lt;br /&gt;&lt;br /&gt;Demnächst erscheint ein Artikel von mir im dotnet.magazin über das Erstellen eines eigenen My Namespaces. Der &lt;em&gt;My.Data&lt;/em&gt; Namespace bietet einfachen Zugriff auf eine im Vorhandene Datenbank. Der Artikel ist deswegen nur noch nicht fertig, weil das Deployment von My Extensions Probleme macht. Die Erweiterungen bestehen nämlich aus generiertem Code, der von den Projekteinstellungen abhängt, und kann deswegen nicht als Assembly verteilt werden. Es bleibt also nur noch ein Item-Template übrig für ein simples Deployment. Wenn man eine Vollintegration haben will, muss man wohl oder übel ein eigenes Add-In für Visual Studio schreiben. Das finde ich aber zu Aufwendig.&lt;br /&gt;&lt;br /&gt;Auf der Basta 2007 Spring hatt ich mit Jay Schmelzer (Principal Program Manager Visual Basic) meine My.Data Erweiterung vorgestellt und mit ihm darüber gesprochen, wie man eigene My Erweiterungen in Visual Studio integrieren kann. Er versprach dies für Orcas mit einzuplanen.&lt;br /&gt;&lt;br /&gt;Schade Jay, das war eigentlich nicht das, was ich mir vorgestellt hatte!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#If _MyType &lt;&gt; "Empty" Then&lt;br /&gt;Namespace My&lt;br /&gt;''' &lt;summary&gt;&lt;br /&gt;''' Module used to define the properties that are available in the My Namespace for WPF&lt;br /&gt;''' &lt;/summary&gt;&lt;br /&gt;''' &lt;remarks&gt;&lt;/remarks&gt;&lt;br /&gt;&lt;global.microsoft.visualbasic.hidemodulename()&gt; _&lt;br /&gt;Module MyWpfExtension&lt;br /&gt;Private m_Computer As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Devices.Computer)&lt;br /&gt;Private m_User As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.ApplicationServices.User)&lt;br /&gt;Private m_Windows As New ThreadSafeObjectProvider(Of MyWindows)&lt;br /&gt;Private m_Log As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Logging.Log)&lt;br /&gt;''' &lt;summary&gt;&lt;br /&gt;''' Returns the application object for the running application&lt;br /&gt;''' &lt;/summary&gt;&lt;br /&gt;Friend ReadOnly Property Application() As Global.System.Windows.Application&lt;br /&gt;Get&lt;br /&gt;Return Global.System.Windows.Application.Current&lt;br /&gt;End Get&lt;br /&gt;End Property&lt;br /&gt;''' &lt;summary&gt;&lt;br /&gt;''' Returns information about the host computer.&lt;br /&gt;''' &lt;/summary&gt;&lt;br /&gt;Friend ReadOnly Property Computer() As Global.Microsoft.VisualBasic.Devices.Computer&lt;br /&gt;Get&lt;br /&gt;Return m_Computer.GetInstance()&lt;br /&gt;End Get&lt;br /&gt;End Property&lt;br /&gt;''' &lt;summary&gt;&lt;br /&gt;''' Returns information for the current user. If you wish to run the application with the current&lt;br /&gt;''' Windows user credentials, call My.User.InitializeWithWindowsUser().&lt;br /&gt;''' &lt;/summary&gt;&lt;br /&gt;Friend ReadOnly Property User() As Global.Microsoft.VisualBasic.ApplicationServices.User&lt;br /&gt;Get&lt;br /&gt;Return m_User.GetInstance()&lt;br /&gt;End Get&lt;br /&gt;End Property&lt;br /&gt;''' &lt;summary&gt;&lt;br /&gt;''' Returns the application log. The listeners can be configured by the application's configuration file.&lt;br /&gt;''' &lt;/summary&gt;&lt;br /&gt;Friend ReadOnly Property Log() As Global.Microsoft.VisualBasic.Logging.Log&lt;br /&gt;Get&lt;br /&gt;Return m_Log.GetInstance()&lt;br /&gt;End Get&lt;br /&gt;End Property&lt;br /&gt;''' &lt;summary&gt;&lt;br /&gt;''' Returns the collection of Windows defined in the project.&lt;br /&gt;''' &lt;/summary&gt;&lt;br /&gt;Friend ReadOnly Property Windows() As MyWindows&lt;br /&gt;&lt;global.system.diagnostics.debuggerhidden()&gt; _&lt;br /&gt;Get&lt;br /&gt;Return m_Windows.GetInstance()&lt;br /&gt;End Get&lt;br /&gt;End Property&lt;br /&gt;&lt;global.system.componentmodel.editorbrowsableattribute(global.system.componentmodel.editorbrowsablestate.never)&gt; _&lt;br /&gt;&lt;global.microsoft.visualbasic.mygroupcollection("system.windows.window",&gt; _&lt;br /&gt;Friend NotInheritable Class MyWindows&lt;br /&gt;&lt;global.system.diagnostics.debuggerhidden()&gt; _&lt;br /&gt;Private Shared Function Create__Instance__(Of T As {New, Global.System.Windows.Window})(ByVal Instance As T) As T&lt;br /&gt;If Instance Is Nothing Then&lt;br /&gt;If m_WindowBeingCreated IsNot Nothing Then&lt;br /&gt;If m_WindowBeingCreated.ContainsKey(GetType(T)) = True Then&lt;br /&gt;Throw New Global.System.InvalidOperationException("The window cannot be accessed via My.Windows from the Window constructor.")&lt;br /&gt;End If&lt;br /&gt;Else&lt;br /&gt;m_WindowBeingCreated = New Global.System.Collections.Hashtable()&lt;br /&gt;End If&lt;br /&gt;m_WindowBeingCreated.Add(GetType(T), Nothing)&lt;br /&gt;Return New T()&lt;br /&gt;m_WindowBeingCreated.Remove(GetType(T))&lt;br /&gt;Else&lt;br /&gt;Return Instance&lt;br /&gt;End If&lt;br /&gt;End Function&lt;br /&gt;&lt;global.system.diagnostics.debuggerhidden()&gt; _&lt;br /&gt;Private Sub Dispose__Instance__(Of T As Global.System.Windows.Window)(ByRef instance As T)&lt;br /&gt;instance = Nothing&lt;br /&gt;End Sub&lt;br /&gt;&lt;global.system.diagnostics.debuggerhidden()&gt; _&lt;br /&gt;&lt;global.system.componentmodel.editorbrowsableattribute(global.system.componentmodel.editorbrowsablestate.never)&gt; _&lt;br /&gt;Public Sub New()&lt;br /&gt;MyBase.New()&lt;br /&gt;End Sub&lt;br /&gt;&lt;global.system.threadstatic()&gt; Private Shared m_WindowBeingCreated As Global.System.Collections.Hashtable&lt;br /&gt;&lt;global.system.componentmodel.editorbrowsable(global.system.componentmodel.editorbrowsablestate.never)&gt; Public Overrides Function Equals(ByVal o As Object) As Boolean&lt;br /&gt;Return MyBase.Equals(o)&lt;br /&gt;End Function&lt;br /&gt;&lt;global.system.componentmodel.editorbrowsable(global.system.componentmodel.editorbrowsablestate.never)&gt; Public Overrides Function GetHashCode() As Integer&lt;br /&gt;Return MyBase.GetHashCode&lt;br /&gt;End Function&lt;br /&gt;&lt;global.system.componentmodel.editorbrowsable(global.system.componentmodel.editorbrowsablestate.never)&gt; _&lt;br /&gt;Friend Overloads Function [GetType]() As Global.System.Type&lt;br /&gt;Return GetType(MyWindows)&lt;br /&gt;End Function&lt;br /&gt;&lt;global.system.componentmodel.editorbrowsable(global.system.componentmodel.editorbrowsablestate.never)&gt; Public Overrides Function ToString() As String&lt;br /&gt;Return MyBase.ToString&lt;br /&gt;End Function&lt;br /&gt;End Class&lt;br /&gt;End Module&lt;br /&gt;End Namespace&lt;br /&gt;#End If&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-1660431528409536597?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/1660431528409536597/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=1660431528409536597' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1660431528409536597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1660431528409536597'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/07/my-extensions-in-vs2008.html' title='My Extensions in VS2008'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_c4ehIbstBAc/RquhK0k-TjI/AAAAAAAAAAs/EBY5T8QuKqc/s72-c/MyExtensions.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-8105418996880789165</id><published>2007-07-16T12:47:00.000+01:00</published><updated>2007-07-16T12:59:44.261+01:00</updated><title type='text'>Wie kann ich Controls in einer Form zentrieren?</title><content type='html'>Ich habe eine sehr einfache Methode herausgefunden um ein beliebiges Steuerelement in einer Form zu zentrieren; also genau mittig anzuzeigen. Wenn die Form verschoben wird, soll natürlich auch die Position des Controls wieder an die neue Mitte verschoben werden.&lt;br /&gt;&lt;br /&gt;Meine Lösung erfordert keinen Code!&lt;br /&gt;&lt;br /&gt;Man nehme ein &lt;em&gt;TableLayoutPanel&lt;/em&gt; und stellt seine &lt;em&gt;Dock&lt;/em&gt; Eigenschaft auf &lt;em&gt;Dock.Fill&lt;/em&gt;. Nun füllt das Panel die ganze Form aus. Dann reduziert man das Panel auf genau 1 Zelle, d.h. &lt;em&gt;RowCount&lt;/em&gt; und &lt;em&gt;ColumnCount&lt;/em&gt; = 1. Auchtung eine Zelle kann immer nur 1 Control beinhalten. Wer daher mehere Elemente mittig anzeigen lassen will muss ein weiteres Panel verwenden in das er diese Elemente einfügt. Das Control wird nun auf &lt;em&gt;Anchor = Anchor.None&lt;/em&gt; gesetzt. Siehe da das Control befindet sich nun immer in der Mitte!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_c4ehIbstBAc/Rptb_CcVBoI/AAAAAAAAAAk/kzgdoADSE1g/s1600-h/Form1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5087761342590682754" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_c4ehIbstBAc/Rptb_CcVBoI/AAAAAAAAAAk/kzgdoADSE1g/s400/Form1.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-8105418996880789165?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/8105418996880789165/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=8105418996880789165' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8105418996880789165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8105418996880789165'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/07/wie-kann-ich-controls-in-einer-form.html' title='Wie kann ich Controls in einer Form zentrieren?'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_c4ehIbstBAc/Rptb_CcVBoI/AAAAAAAAAAk/kzgdoADSE1g/s72-c/Form1.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-2573384906251867651</id><published>2007-07-13T13:55:00.000+01:00</published><updated>2007-07-13T14:12:26.976+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Orcas'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>Achtung! .NET 3.5 Beta1 und .NET 3.5 June CTP inkompatibel!</title><content type='html'>Achtung bei dem Ausprobieren von Programmen, die unter Orcas erstellt worden sind. Orcas installiert standardmäßig das .NET Framework 3.5 Beta1 vom April 2007. Wer sich bereits die neue Juni CTP runtergeladen hat, wird Programme die LINQ verwenden nicht ausführen können. Es erscheint folgende Fehlermeldung:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Der Typ System.Linq.Func`2 in der Assembly System.Core, Version 2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561924e089 konnte nicht geladen werden.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;LINQ macht excessiven Gebrauch vom generischen Delegate &lt;em&gt;Func&lt;&gt;. &lt;/em&gt;Dieser wurde nun in einen anderen Namespace verfrachtet. Statt bisher im Namespace &lt;em&gt;System.Linq&lt;/em&gt; ist &lt;em&gt;Func&lt;&gt;&lt;/em&gt; im Namespace &lt;em&gt;System&lt;/em&gt; zu finden. Er ist somit überall verfügbar, ohne dass man einen bestimmten Namespace einbinden muss. Denn im Namespace System befinden sich alle Grundlegenden Datentypen.&lt;br /&gt;&lt;br /&gt;Hinzugekommen sind nun auch diverse Überladungen des Action-Delegate. Es ist nämlich bisher nicht möglich einen Delegate &lt;em&gt;Func&lt;t,void&gt;&lt;/em&gt; zu erstellen. Jedoch kann man einen normalen Delegate &lt;em&gt;delegate void Action&lt;t&gt;(T obj)&lt;/em&gt; erstellen.&lt;br /&gt;&lt;br /&gt;Hier nochmal die vorgefertigten Delegates in der Übersicht:&lt;br /&gt;&lt;br /&gt;TReturn Func&lt;treturn&gt;&lt;br /&gt;TReturn Func&lt;t1,treturn&gt;&lt;br /&gt;TReturn Func&lt;t1,t2,treturn&gt;&lt;br /&gt;TReturn Func&lt;t1,t2,t3treturn&gt;&lt;br /&gt;TReturn Func&lt;t1,t2,t3,t4,treturn&gt;&lt;br /&gt;&lt;br /&gt;void Action&lt;t1&gt;&lt;br /&gt;void Action&lt;t1,t2&gt;&lt;br /&gt;void Action&lt;t1,t2,t3&gt;&lt;br /&gt;void Action&lt;t1,t2,t3,t4,&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-2573384906251867651?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/2573384906251867651/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=2573384906251867651' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/2573384906251867651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/2573384906251867651'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/07/achtung-net-35-beta1-und-net-35-june.html' title='Achtung! .NET 3.5 Beta1 und .NET 3.5 June CTP inkompatibel!'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-8741177191277828064</id><published>2007-07-09T11:45:00.000+01:00</published><updated>2007-07-09T12:14:09.288+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>WPF: Wie erstelle ich einen autoskalierenden Text?</title><content type='html'>Es hat lange gebraucht bis ich mich an WPF (Windows Presentation Foundation) rangewagt habe. Ich erkenne aber immer mehr die Vorzüge von WPF. Z.B. erstelle ich gerade für eine Anwendung einen animierten Splash-Screen bzw. Intro. Das gibt natürlich wesentlich mehr her als ein statisches Bitmap auf dem das Anwendungslogo zu sehen ist. Ich brauche nicht zu erwähnen, dass dies mit GDI+ echt aufwändig wäre und lange nicht so gut aussehen würde wie mit WPF.&lt;br /&gt;&lt;br /&gt;Der Splash-Screen soll natürlich voll Vektrobasiert sein, d.h. alle Grafiken, Text und Animationen, sollen sich der Größe des Fensters anpassen. Doch wie schaffe ich es, dass die Schriftgröße eines Textes in einer TextBox automatisch skaliert wird? Ich habe lange gesucht, und keine passende "einfache" Einstellung gefunden, wie z.B. TextBox.Strech = Fill; Hieran sieht man, dass WPF noch nicht ganz ausgereift ist. Es sind zwar viele Grundelemente vorhanden, die man zu anderen komplexen Elementen zusammenstellen kann, aber das muss man halt selber machen. Zudem braucht man eine Menge Wissen über WPF, was man am Anfang natürlich nicht hat. Wenn man also eine DataGridView in WPF braucht, wird man nicht direkt rangehen können, um sich eine eigene DataGridView zu bauchen; auch wenn die dafür erforderlichen Grundelemente vorhanden sind. 1. Braucht man viel Efahrung mit WPF und 2. kostet es enorm viel Zeit.&lt;br /&gt;&lt;br /&gt;Aber zurück zu unserem skalierbaren Text.&lt;br /&gt;&lt;br /&gt;Wir benötigen zunächst das Tool &lt;em&gt;ExpressionBlend&lt;/em&gt;. Meine Lösung kann nicht programmiert werden, sondern benötigt ein Feature von &lt;em&gt;ExpressionBlen&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;1. Wir nehmen einen &lt;em&gt;&lt;span style="color:#000099;"&gt;TextBlock&lt;/span&gt;&lt;/em&gt;. (&lt;strong&gt;Achtung &lt;/strong&gt;keine normale &lt;em&gt;TextBox&lt;/em&gt;!)&lt;br /&gt;2. Wir schreiben einen Text in unseren TextBlock. Es können auch andere Elemente wie Elipsen, Controls etc. zwischen dem Text stehen. Das ist mit einem TextBlock möglich. Dann die Schriftart und andere Einstellungen setzen.&lt;br /&gt;3. Wir konvertiere nun den &lt;em&gt;&lt;span style="color:#000099;"&gt;TextBlock&lt;/span&gt;&lt;/em&gt; in einen &lt;em&gt;&lt;span style="color:#000099;"&gt;Path&lt;/span&gt;&lt;/em&gt;. &lt;em&gt;Menü-&gt;Objekt-&gt;Pfad-&gt;in Pfad konvertieren.&lt;/em&gt; Alle Elemente des TextBlock auch der Text wird in einen Pfad konvertiert. Dieser Pfad besteht aus relativen Punkten die Vektororientiert sind und somit voll skalierbar.&lt;br /&gt;4. Wir umgeben den Pfad mit einer &lt;em&gt;&lt;span style="color:#000099;"&gt;ViewBox&lt;/span&gt;&lt;/em&gt;. Diese ViewBox kann automatisch ihre Childelemente skalieren.&lt;br /&gt;5. Tada! Fertig ist unser automatisch skalierender Text&lt;br /&gt;&lt;br /&gt;Nachteil: wenn man den Text ändern will muss man die Schritte erneut durchführen ;-(&lt;br /&gt;&lt;br /&gt;Es wäre natürlich auch denkbar eine Skalierung in Abhängigkeit der Fenstergröße per Databinding zu ermöglichen. Hierzu müsste man aber entsprechende Berechnungen anstellen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-8741177191277828064?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/8741177191277828064/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=8741177191277828064' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8741177191277828064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/8741177191277828064'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/07/wpf-wie-erstelle-ich-einen.html' title='WPF: Wie erstelle ich einen autoskalierenden Text?'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1363207308265120314.post-1217727092149582666</id><published>2007-06-27T19:10:00.000+01:00</published><updated>2007-06-27T20:05:26.647+01:00</updated><title type='text'>Was gibt's Neues in VisualBasic 2008?</title><content type='html'>Ich probiere seit einiger Zeit die neue VisualStudio Version Orcas bzw. VS2008 in der Beta1 aus. Was mich natürlich besonders daran interessiert, sind die neuen VB Features. Nach langem Suchen musste ich feststellen, dass bestimmte Funktionen noch nicht in Orcas Beta 1 zu finden sind. Das betrifft z.B. Lambda Funktionen - also inline Funktionen. Während ich in C# eine lambda-funktion so schreiben kann x =&gt; x+1 (Eine Funktion mit dem Parameter x der x + 1 zurückgibt) sollte man in VB dies schreiben können Function(x) x+1. Anscheinend kann dies der Beta Compiler noch nicht. Was blieb mir anderes übrig als mit LINQ in C# weiter zu experimentieren. (Ich muss sagen, langsam gefällt mir C#.)&lt;br /&gt;&lt;br /&gt;Werden solche kleinen Probleme in der endgültigen Version von VB 2008 behoben sein?&lt;br /&gt;&lt;br /&gt;Ja, die gröbsten Sachen werden wohl in VB laufen, aber man wird keine großen Sprünge machen können. Es sieht so aus als würde C# 3.0 einen Produktivitätsgewinn gegenüber VB 9.0 haben. Was besonders ironisch ist C# wird dynamischer sein als VB. (Das wird aber mit VBx sicherlich wieder aufgeholt werden) Warum?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Keine Collection Initializer in VB!&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Während C# so ziemlich jeden Typ ableiten kann, kann dies VB anscheinend nicht.&lt;br /&gt;Im &lt;strong&gt;C#&lt;/strong&gt; kann ich einenen anonymen Typen definieren:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;var obj = new { Property1 = "Hallo", Property2 = 12345};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;strong&gt;VB&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Dim obj = New With { Property1 = "Hallo", Property2 = 12345}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Was ist wenn ich ein Array erstellen will?&lt;br /&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;var list = new[] {1,2,3};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;strong&gt;VB&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;Dim list = New Integer() {1,2,3}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Ärgerlich ist hier, dass ich bei VB den Datentyp des Arrays angeben muss. Warum kann dieser nicht abgeleitet werden wie bei C#?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mit C# kann man auch Auflistungen erstellen, die vom Compiler abgeleitet werden können.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;var list = new[] &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   new {Property1 = "hallo"};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   new {Property1 = "test"};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;Sowohl der Anonyme Typ als auch die Anonyme Collection können abgeleitet werden. Man kann also einen ObjektInitializier (also {Property=Value}) auch verschachteln und damit Collections bauen.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oakleafblog.blogspot.com/2007/06/will-visual-basic-90-have-collection.html"&gt;http://oakleafblog.blogspot.com/2007/06/will-visual-basic-90-have-collection.html&lt;/a&gt; sagt, dass auf mysteriöse Weise in den neusten HandsOnLabs zu VB 9 alle Verweise auf Collection Initializer verschwunden sind. Noch schlimmer: Keins der angeführten Beispiele soll funktionieren. Wie man also in Zukunft dieses C# Beispiel in VB umsetzten wird, ist also noch unklar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Was gibt es sonst Neues? &lt;/strong&gt;&lt;a href="http://www.panopticoncentral.net/archive/2007/06/27/21113.aspx"&gt;&lt;span style="font-size:78%;"&gt;http://www.panopticoncentral.net/archive/2007/06/27/21113.aspx&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Das &lt;span style="color:#000099;"&gt;InternalsVisibleToAttribute&lt;/span&gt; wird endlich vom VB Compiler erkannt. Damit ist es möglich, dass man die mit Friend gekennzeichneten Klassen und Member aus einer anderen Assembly aufrufen kann. Dies ist für UnitTests wichtig! Zwar konnte man bisher schon dieses Attribut in VB verwenden, aber die entsprechenden Friend Klassen wurden nicht angezeigt.&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000099;"&gt;Relaxed Delegates&lt;/span&gt;. Hat man z.B. einen Click EventHandler für einen Button und man möchte dieses Ereignis verarbeiten, musste man immer die entsprechende Signatur des EventHandler Delegates als Verarbeitungsmethode schreiben. In der Regel also Button1_click(sender as Object, e as EventArgs). Das war lästig, da weder sender noch e benutzt wurden (Es sei den EventArgs hatte wirklich wichtige Argumente). Es wird aber nicht das sog. &lt;em&gt;Currying&lt;/em&gt; unterstützt, d.h. dass man auch nur einen Parameter verwenden kann, statt alle Parameter wegzulassen.&lt;/li&gt;&lt;li&gt;VB Programme können auch &lt;span style="color:#333399;"&gt;ohne Microsoft.VisualBasic.dll&lt;/span&gt; kompiliert werden. Der VB Compiler hat bisher für bestimmte late-binding Funktionen von VB dieses Dll benötigt. &lt;/li&gt;&lt;li&gt;Es können Objektmember auf Interfaces aufgerufen werden. Es gibt zwar keine Beispiele hierzu, aber ich stell mir das als &lt;span style="color:#000099;"&gt;Extrem LateBinding&lt;/span&gt; vor. Beispiel:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;Interface ITest&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;   Sub CallFunktion&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;End Interface&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;Class Person Implements ITest&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;   Property Name&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;End Class&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;Dim p as ITest = New Person&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;p.Name&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ich könnte ein Objekt zu einem Interface casten und dann auf diesem Interface ein Member des Objekts aufrufen, obwohl die Variable ja jetzt ein Interface ist. (Wofür soll das gut sein???)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Es wird einen ? Operator wie in C# geben, um If Else Condition in Kurzform schreiben zu können. (Was für ein Blödsinn!)&lt;/li&gt;&lt;/ul&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Was wird nicht umgesetzt?&lt;/strong&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;Erlaubt es C#, dass in Labdas auch Statements wie -  Console.WriteLine(x) - möglich sind, werden in VB nur Expressions erlaubt sein - also x+1. Dadurch wird VB um echte Funktionalität für LINQ beschnitten. Auch einen yield Operator wird es in VB nicht geben. Dadurch wird VB Programmierern die Möglichkeit genommen, wirklich produktiv und kreativ mit LINQ zu arbeiten. (Shame on you Microsoft!)&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;Insgesamt bin ich schon sehr enttäusch von den neuen VB Features! Echt schwache Leistung Microsoft. Ich werde wohl für den Einsatz von LINQ C# einsetzten &lt;strong&gt;MÜSSEN&lt;/strong&gt;, obwohl ich lieber VB verwenden würde!&lt;br /&gt;&lt;em&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1363207308265120314-1217727092149582666?l=hiq-software.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hiq-software.blogspot.com/feeds/1217727092149582666/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1363207308265120314&amp;postID=1217727092149582666' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1217727092149582666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1363207308265120314/posts/default/1217727092149582666'/><link rel='alternate' type='text/html' href='http://hiq-software.blogspot.com/2007/06/was-gibts-neues-in-visualbasic-2008.html' title='Was gibt&apos;s Neues in VisualBasic 2008?'/><author><name>HiQ-Software</name><uri>http://www.blogger.com/profile/17952163358850374510</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02952279518349539740'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>