<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ref="http://purl.org/rss/1.0/modules/reference/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/">
	<channel rdf:about="http://blog.norberteder.com//rss.rdf">
		<title>Das Blog über .NET, C# und mehr - Norbert Eder - Living .NET</title>
		<link>http://blog.norberteder.com/index.php</link>
		<description><![CDATA[Copyright (c) 2008 by Norbert Eder]]></description>
		<image rdf:resource="http://blog.norberteder.com/interface/feed.png" />		<copyright>Copyright 2008, Norbert Eder</copyright>
		<managingEditor>csharp@gmx.at (Norbert Eder)</managingEditor>
		<language>de-DE</language>
		<generator>SPHPBLOG 0.4.5</generator>
		<items>
			<rdf:Seq>
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080701-193444" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080701-081512" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080630-211816" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080628-153245" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080624-224937" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080624-154943" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080623-082057" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080622-200212" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080620-085750" />
				<rdf:li resource="http://blog.norberteder.com/?entry=entry080618-182640" />
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080701-193444">
		<title>Sie wurden mit dem Microsoft MVP Award ausgezeichnet!</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080701-193444</link>
		<description><![CDATA[<i>Sehr geehrte(r) Norbert Eder,<br />Herzlichen Glückwunsch! Wir freuen uns, Ihnen den Microsoft® MVP Award 2008 verleihen zu können. Mit dem MVP Award danken wir Ihnen für Ihren Einsatz für die Community, mit dem Sie Tag für Tag dazu beitragen, das Leben der Menschen zu bereichern und die Branche erfolgreicher zu machen. Wir schätzen Ihren außerordentlich bedeutenden Beitrag in den technischen Communities zum Thema <b>Microsoft Client App Dev</b> im vergangenen Jahr hoch ein.</i><br /><br />Tja, was soll ich sagen. Ich fühle mich geehrt und bedanke mich natürlich bei allen, die mich immer wieder unterstützen, die die Nominierung möglich gemacht haben und sowieso und überhaupt bin ich auch für Weltfrieden.<br /><br />Mal sehen, ob die sich aufdrängende Frage auch noch irgendwie beantwortet wird ...<br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080701-193444</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Tue, 01 Jul 2008 17:34:44 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080701-081512">
		<title>Aktualisiere mich!</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080701-081512</link>
		<description><![CDATA[DAS dachten sich die Bereiche <a href="http://blog.norberteder.com/static.php?page=trickkiste" target="_blank" >Trickkiste</a> und <a href="http://blog.norberteder.com/static.php?page=WPF" target="_blank" >WPF</a>. Diesem Ruf folgte ich und fand auch spontan Möglichkeiten der Verbesserung.<br /><br />Die <b>Trickkiste</b> wurde um sämtliche WPF-Artikel erleichtert. Diese sind nunmehr zur Gänze im Bereich <b>WPF</b> zu finden. Eben dieser wurde zusätzlich um weitere Einträge ergänzt.<br /><br />Im Laufe des aktuellen Monats werden sich ein paar weitere Dinge hier ändern.<br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080701-081512</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Tue, 01 Jul 2008 06:15:12 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080630-211816">
		<title>Artikel: Steuerelemente für jeden Zweck</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080630-211816</link>
		<description><![CDATA[<img src="http://www.visualstudio1.de/images/visualstudio1-0408-200px.jpg" width=100 height=137 border=0 alt='' id="img_float_left"> In der aktuellen Ausgabe der <b>visual studio one</b> wurde mein Artikel <b>Steuerelemente für jeden Zweck</b> veröffentlicht.<br /><br /><i>Die Idee der Steuerelemente ist ja nicht neu. Relativ neu hingegen ist die Möglichkeit, grafische Elemente komplett von der eigentlichen Logik zu trennen – zumindest gilt dies für Microsoft-basierte Technologien.Mit der Windows Presentation Foundation wird den Entwicklern genau dies in die Hand gelegt. Sie als Entwickler und auch Ihr Kunde können davon profitieren. Dieser Artikel zeigt Ihnen, wie Sie dynamische WPF-Steuerelemente selber bauen können. </i><br /><br />Link: <a href="http://www.visualstudio1.de" target="_blank" >visual studio one</a><br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080630-211816</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Mon, 30 Jun 2008 19:18:16 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080628-153245">
		<title>Diablo III - Offizielle Website online</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080628-153245</link>
		<description><![CDATA[Unter <a href="http://eu.blizzard.com/diablo3/" target="_blank" >http://eu.blizzard.com/diablo3/</a> steht ab sofort die offizielle Website von Diablo III zur Verfügung. Als Spieler der alten Versionen freue ich mich natürlich besonders, dass es zu einer neuen Version inkl. neuer Grafikengine kommen wird.<br /><br />Mich wundert ja zusätzlich, dass daran bereits seit 4 Jahren entwickelt wurde und bis zur offiziellen Ankündigung ja kaum etwas davon zu hören war - ausser ein paar Gerüchten. <br /><br />Dann hoffe ich, dass das Teil bald verfügbar sein wird.<br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080628-153245</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Sat, 28 Jun 2008 13:32:45 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080624-224937">
		<title>UniformGrid - das einfache Grid</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080624-224937</link>
		<description><![CDATA[Im Namespace <b>System.Windows.Controls.Primitives</b> verbirgt sich ein Grid namens <b>UniformGrid</b>. Dabei handelt es sich um ein wirklich sehr einfaches Grid, welches (wie der Name schon sagt) im Endeffekt nicht mehr tut, als alle enthaltenen Elemente in gleicher Größe darzustellen. Dabei wandert jedes Kindelement in eine eigene Zelle.<br /><br />Sehen wir uns gleichein Beispiel an:<br />
<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">UniformGrid</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 1"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 2"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 3"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 4"</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">UniformGrid</span><span class="kwrd">&gt;</span></pre>
<br /><br />Definiert wird ein UniformGrid mit insgesamt vier Buttons als Kindelemente. Und so sieht&#039;s aus:<br /><br /><img src="http://blog.norberteder.com/images/misc_wpf_uniformgrid01.gif" width=300 height=300 border=0 alt=''><br /><br />Wird nun ein weiterer Button hinzugefügt, ändert sich das UniformGrid wie folgt:<br /><br /><img src="http://blog.norberteder.com/images/misc_wpf_uniformgrid02.gif" width=300 height=300 border=0 alt=''><br /><br />Wie also zu sehen ist, werden die notwendigen Spalten und Reihen automatisch berechnet. Diese können aber mit den Attributen <b>Columns</b> und <b>Rows</b> beeinflusst werden:<br />
<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">UniformGrid</span> <span class="attr">Columns</span><span class="kwrd">="2"</span> <span class="attr">Rows</span><span class="kwrd">="3"</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 1"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 2"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 3"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 4"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 5"</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">UniformGrid</span><span class="kwrd">&gt;</span></pre>
<br />Definiert sind zwei Spalten und drei Reihen. Hier das Ergebnis:<br /><br /><img src="http://blog.norberteder.com/images/misc_wpf_uniformgrid03.gif" width=300 height=300 border=0 alt=''><br /><br />Aber <b>aufgepasst</b>: angezeigt wird nur, was auch tatsächlich auf die vorhandene Fläche passt:<br />
<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">UniformGrid</span> <span class="attr">Columns</span><span class="kwrd">="2"</span> <span class="attr">Rows</span><span class="kwrd">="2"</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 1"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 2"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 3"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 4"</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">="Button 5"</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">UniformGrid</span><span class="kwrd">&gt;</span></pre>
<br />Definiert sind zwei Spalten und zwei Reihen, vorhanden sind jedoch fünf Elemente. Das wird daraus:<br /><br /><img src="http://blog.norberteder.com/images/misc_wpf_uniformgrid04.gif" width=490 height=300 border=0 alt=''><br /><br />Viel Spaß beim Probieren.<br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080624-224937</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Tue, 24 Jun 2008 20:49:37 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080624-154943">
		<title>Was hat Firefox 3 mit Nirvana zu tun?</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080624-154943</link>
		<description><![CDATA[Gemeint ist hier nicht <a href="http://de.wikipedia.org/wiki/Nirvana_(Band)" target="_blank" >Nirvana als Band</a>, sondern vielmehr <a href="http://de.wikipedia.org/wiki/Nirvana" target="_blank" >Nirwana</a> als Austritt aus dem Kreislauf des Leidens.<br /><br />Aber was hat das nun mit Firefox 3 zu tun? Grundsätzlich ja ein Browser, den ich dann doch des Öfteren benutze, da ich auf einem Rechner IE7 nicht installieren kann, da sonst ein bestimmtes Produkt nicht laufen würde und da hin und wieder Webgeschichten mit mehreren Browsern getestet werden müssen.<br /><br />Nun allerdings seit Firefox 3 bin ich mir nicht mehr so sicher, ob ich ihn auch wirklich weiterhin benutzen möchte. Ich tippe mal auf: &quot;Nein, ich will nicht&quot;. Warum? Weil sich Firefox 3 gerade bei Multimedia-Inhalten von seinem Leid selbständig erlöst und einfach alle Schotten dicht macht. Bumm, zack und weg. Ständig.<br /><br />Ab sofort kann sich das Teil im Nirwana vertschüssen, so oft es will. Da stört es mich nicht weiter. *Winke*<br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080624-154943</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Tue, 24 Jun 2008 13:49:43 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080623-082057">
		<title>Was ist Community?</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080623-082057</link>
		<description><![CDATA[Eine Community ist eigentlich nicht nur ein Blog bei dem sich einige Personen angemeldet haben. Eine Community ist nicht nur ein Forum mit zahlreichen Usern, die sich über unterschiedlichste Themen unterhalten. Eine Community ist wesentlich mehr.<br /><br />Eine Community zeichnet sich dadurch aus, dass<br />
<ul>
<li>sich Menschen gegenseitig bei Problemen helfen</li>
<li>gemeinsam Ideen umgesetzt werden</li>
<li>gemeinsam Wissen verteilt und somit die gemeinsame Community gestärkt wird</li>
<li>die einzelnen Community-Betreiber zusammen halten um gemeinsam stark zu werden</li>
<li>einzelne Community-Betreiber sich an Abgemachtes halten um wirklich <b>gemeinsam</b> für die Community da sein zu können</li>
<li>jeder die Möglichkeit besitzt seine Stärken auszuspielen</li>
</ul>
<br />Und natürlich könnte man noch weitere Punkte hinzufügen. Schade ist nur, dass sich einige absolut nicht daran halten und lieber ihren ganz persönlichen Weg beschreiten. Dagegen ist auch nichts einzusetzen.<br /><br />Traurig finde ich jedoch, dass es immer jemanden geben muss, der gegen <b>gemeinsam definierte Spielregeln verstößt</b> und das auch noch für gut befindet. Für mich ist Derartiges nicht mit dem Community-Gedanken zu vereinbaren. <br /><br />Anscheinend sind Regeln da, um gebrochen zu werden. Gestern Beschlossenes gilt heute nicht mehr ohne auch nur einen Laut von sich zu geben. Und das dort, wo eigentlich am gleichen Strang gezogen werden sollte.<br /><br />Das hat keinen Wert. Weder auf persönlicher Ebene, noch in Bezug auf die Community. Wenn es unbedingt so sein muss, make it so, aber <b>ohne mich</b>.<br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080623-082057</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Mon, 23 Jun 2008 06:20:57 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080622-200212">
		<title>WPF: Offene Fenster im Überblick behalten</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080622-200212</link>
		<description><![CDATA[Wir kennen es wohl alle: Das &quot;Window&quot;-Menü mit allen offenen Fenstern derselben Applikation. Vor allem in den Office-Produkten war dies immer wieder zu finden. Doch wie kann dies unter WPF implementiert werden? Dieser Artikel zeigt wie&#039;s geht. Und so kann das Endresultat aussehen (es ist zwar nicht hübsch, aber es funktioniert):<br /><br /><img src="http://blog.norberteder.com/images/misc_wpf_open_windows.jpg" width=307 height=307 border=0 alt=''><br /><br />Zu Beginn stellt sich natürlich dir Frage ob es da nicht schon etwas Fertiges gibt. Ja. Gibt es. Unter <b>Application.Current.Windows</b> findet sich die aktuelle Auflistung aller geöffneten Fenster. Einziger Nachteil: Diese stecken in einer eigenen <b>WindowCollection</b>, welche lediglich <b>ICollection</b> und <b>IEnumerable</b> implementiert. Damit jedoch Data Binding möglich ist, wäre eine <b>ObservableCollection</b> notwendig.<br /><br />Damit es uns Entwicklern nicht fad wird, müssen wir daher selbst in die Tasten klopfen und unser eigenes System entwickeln, wollen wir doch Data Binding verwenden!<br /><br />Zuerst benötigen wir eine simple Datenklasse, welche Informationen für uns hält und auch später wieder zugänglich macht:<br />
<pre class="csharpcode">
<span class="kwrd">public</span> <span class="kwrd">class</span> WindowInformation
{
    <span class="kwrd">private</span> Window _window; 

    <span class="kwrd">public</span> WindowInformation(Window window)
    {
        _window = window;
    }

    <span class="kwrd">public</span> Window Window
    {
        get { <span class="kwrd">return</span> _window; }
    }

    <span class="kwrd">public</span> <span class="kwrd">int</span> WindowHashCode 
    {
        get { <span class="kwrd">return</span> _window.GetHashCode(); }
    }

    <span class="kwrd">public</span> String Title
    {
        get { <span class="kwrd">return</span> _window.Title; }
    }

    <span class="kwrd">public</span> ImageSource Icon
    {
        get { <span class="kwrd">return</span> _window.Icon; }
    }
}</pre>
<br />Die Datenklasse fungiert in diesem Fall lediglich als Wrapper-Klasse, könnte aber ohne großen Aufwand um weitere Informationen angereichert werden.<br /><br />Damit nun Data Binding verwendet werden kann, benötigen wir eine - wie schon angesprochen - ObserableCollection:<br />
<pre class="csharpcode">
<span class="kwrd">public</span> <span class="kwrd">class</span> WindowInformationCollection : 
    ObservableCollection&lt;WindowInformation&gt;
{
}</pre>
<br />Nun wird eine <b>Manager-Klasse</b> benötigt, welche die Liste der geöffneten Fenster hält und zusätzliche Funktionen wie Entfernen eines Fensters oder das Zurückgeben eines speziellen Fensters zur Verfügung stellt. Dieser Manager wurde mit dem Singleton-Pattern umgesetzt, damit sichergestellt ist, dass nur eine Instanz davon pro gestarteter Anwendungsinstanz vorhanden ist.<br />
<pre class="csharpcode">
<span class="kwrd">public</span> <span class="kwrd">class</span> WindowManager
{
    <span class="kwrd">private</span> <span class="kwrd">static</span> WindowManager _manager;

    <span class="kwrd">private</span> WindowInformationCollection _openWindows = 
        <span class="kwrd">new</span> WindowInformationCollection();

    <span class="kwrd">private</span> WindowManager() { }

    <span class="kwrd">public</span> <span class="kwrd">static</span> WindowManager GetInstance
    {
        get
        {
            <span class="kwrd">if</span> (_manager == <span class="kwrd">null</span>)
                _manager = <span class="kwrd">new</span> WindowManager();
            <span class="kwrd">return</span> _manager;
        }
    }

    <span class="kwrd">public</span> WindowInformationCollection OpenWindows
    {
        get { <span class="kwrd">return</span> _openWindows; }
    }

    <span class="kwrd">public</span> Window GetOpenWindow(<span class="kwrd">int</span> hashCode)
    {
        <span class="kwrd">foreach</span> (WindowInformation wi <span class="kwrd">in</span> _openWindows)
        {
            <span class="kwrd">if</span> (wi.WindowHashCode == hashCode)
            {
                <span class="kwrd">return</span> wi.Window;
            }
        }
        <span class="kwrd">return</span> <span class="kwrd">null</span>;
    }

    <span class="kwrd">public</span> <span class="kwrd">bool</span> RemoveOpenWindow(<span class="kwrd">int</span> hashCode)
    {
        WindowInformation windowToRemove = <span class="kwrd">null</span>;
        <span class="kwrd">foreach</span> (WindowInformation wi <span class="kwrd">in</span> _openWindows)
        {
            <span class="kwrd">if</span> (wi.WindowHashCode == hashCode)
            {
                windowToRemove = wi;
                <span class="kwrd">break</span>;
            }
        }
        <span class="kwrd">if</span> (windowToRemove != <span class="kwrd">null</span>)
        {
            _openWindows.Remove(windowToRemove);
            <span class="kwrd">return</span> <span class="kwrd">true</span>;
        }
        <span class="kwrd">return</span> <span class="kwrd">false</span>;
    }
}</pre>
<br />Zu guter Letzt wird noch ein Handler implementiert, der schlussendlich in das <b>Window</b>-Element des XAMLs eingebunden werden kann und somit ein Fenster in das System einbindet:<br />
<pre class="csharpcode">
<span class="kwrd">public</span> <span class="kwrd">class</span> WindowInformationHandler
{
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">readonly</span> DependencyProperty 
        IsHandledProperty =
    DependencyProperty.RegisterAttached(<span class="str">"IsHandled"</span>, 
        <span class="kwrd">typeof</span>(<span class="kwrd">bool</span>), <span class="kwrd">typeof</span>(WindowInformationHandler),
        <span class="kwrd">new</span> FrameworkPropertyMetadata((<span class="kwrd">bool</span>)<span class="kwrd">false</span>,
            <span class="kwrd">new</span> PropertyChangedCallback(OnIsHandledChanged)));

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> OnIsHandledChanged(
        DependencyObject dObj, 
        DependencyPropertyChangedEventArgs e)
    {
        Window openWindow = dObj <span class="kwrd">as</span> Window;
        <span class="kwrd">if</span> (openWindow != <span class="kwrd">null</span>)
        {
            openWindow.Loaded += 
                <span class="kwrd">new</span> RoutedEventHandler(WindowLoaded);
            openWindow.Closed += 
                <span class="kwrd">new</span> EventHandler(WindowClosed);
        }
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">bool</span> GetIsManaged(DependencyObject dObj)
    {
        <span class="kwrd">return</span> (<span class="kwrd">bool</span>)dObj.GetValue(IsHandledProperty);
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> SetIsManaged(
        DependencyObject dObj, 
        <span class="kwrd">bool</span> <span class="kwrd">value</span>)
    {
        dObj.SetValue(IsHandledProperty, <span class="kwrd">value</span>);
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> WindowClosed(
        <span class="kwrd">object</span> sender, EventArgs e)
    {
        Window closedWindow = sender <span class="kwrd">as</span> Window;
        <span class="kwrd">if</span> (closedWindow != <span class="kwrd">null</span>)
        {
            WindowManager.GetInstance.RemoveOpenWindow(
                closedWindow.GetHashCode()
                );
            openWindow.Loaded -= 
                <span class="kwrd">new</span> RoutedEventHandler(WindowLoaded);
            openWindow.Closed -= 
                <span class="kwrd">new</span> EventHandler(WindowClosed);
        }
    }

    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> WindowLoaded(
        <span class="kwrd">object</span> sender, RoutedEventArgs e)
    {
        Window openWindow = sender <span class="kwrd">as</span> Window;
        <span class="kwrd">if</span> (openWindow != <span class="kwrd">null</span>)
        {
            WindowInformation winInfo = 
                <span class="kwrd">new</span> WindowInformation(openWindow);
            WindowManager.GetInstance.OpenWindows.Add(winInfo);
        }
    }
}</pre>
<br />Wird die Eigenschaft <b>IsHandled</b> auf <b>true</b> gesetzt, werden zwei Events (Loaded und Closed) registriert. Auf diese wird in weiterer Folge reagiert, um das Fenster nach erfolgtem Laden in die Liste der geöffneten Fenster aufzunehmen bzw. davon auch wieder zu entfernen.<br /><br />In XAML wird dies folgendermaßen in das Window-Element eingebunden:<br />
<pre class="csharpcode">
local:WindowInformationHandler.IsManaged="true"</pre>
<br />Damit ist dieses System fertig und kann angewandt werden. <br /><br />Das XAML-Markup für oben gezeigten Screenshot sieht so aus:<br />
<Window.Resources>
    <DataTemplate x:Key="WindowTemplate">
        <MenuItem Header="{Binding Title}" 
                  Icon="{Binding WindowIcon}" 
                  Click="ShowWindow"/>
    </DataTemplate>
</Window.Resources>

<Grid>
    <Menu>
        <MenuItem Header="File">
            <MenuItem Header="New Window ..." 
                      Click="NewWindow"/>
        </MenuItem>
        <MenuItem Header="Edit"/>
        <MenuItem x:Name="mnuWindows" 
                  Header="Windows" 
                  ItemTemplate="{StaticResource WindowTemplate}"/>
    </Menu>
</Grid>
<br />Und hier noch der Inhalt aus dem Code Behind:<br />
<pre class="csharpcode">
<span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> MainWindow : Window
{
    <span class="kwrd">public</span> MainWindow()
    {
        InitializeComponent();
        mnuWindows.ItemsSource = 
            WindowManager.GetInstance.OpenWindows;
    }

    <span class="kwrd">private</span> <span class="kwrd">void</span> NewWindow(<span class="kwrd">object</span> sender, 
        RoutedEventArgs e)
    {
        MainWindow window = <span class="kwrd">new</span> MainWindow();
        window.Title = String.Format(<span class="str">"Open Window {0}"</span>, 
            Application.Current.Windows.Count);
        window.Show();
    }

    <span class="kwrd">private</span> <span class="kwrd">void</span> ShowWindow(<span class="kwrd">object</span> sender, 
        RoutedEventArgs e)
    {
        MenuItem mi = sender <span class="kwrd">as</span> MenuItem;
        <span class="kwrd">if</span> (mi != <span class="kwrd">null</span>)
        {
            WindowInformation wi = mi.DataContext 
                <span class="kwrd">as</span> WindowInformation;
            <span class="kwrd">if</span> (wi != <span class="kwrd">null</span>)
            {
                wi.Window.Focus();
            }
        }
    }
}</pre>
<br />Voilá!]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080622-200212</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Sun, 22 Jun 2008 18:02:12 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080620-085750">
		<title>Konvertierung von C# nach VB.NET und wieder zurück</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080620-085750</link>
		<description><![CDATA[Viele können mit C#-Code oder VB.NET-Code nichts anfangen und möchten daher den Sourcecode, den sie als Beispiel erhalten haben gerne konvertieren.<br /><br />Dafür gibt es zahlreiche Wege (beispielsweise den .NET Reflector). Am einfachsten ist die Verwendung einer Weblösung. Hier zwei Links die sich dafür gut eignen:<br /><br /><a href="http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx" target="_blank" >Convert C# to VB.NET</a><br /><a href="http://labs.developerfusion.co.uk/convert/vb-to-csharp.aspx" target="_blank" >Convert VB.NET to C#</a><br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080620-085750</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Fri, 20 Jun 2008 06:57:50 GMT</pubDate>
	</item>
	<item rdf:about="http://blog.norberteder.com/?entry=entry080618-182640">
		<title>WPF: Layout-System und Performance</title>
		<link>http://blog.norberteder.com/index.php?entry=entry080618-182640</link>
		<description><![CDATA[Müssen viele Elemente erstellt und dargestellt werden, kann die Performance schon mal sehr schnell in den Keller gehen. Dabei müssen die darzustellenden Elemente keineswegs komplex sein. Vielmehr reichen oft kleine Fallen, die vermieden werden wollen. <br /><br />Oftmals führt das Verwenden eines <b>falschen Panels</b> zu einem Performance-Problem. Meist ist es so, dass genau das Panel verwendet wird, welches die gewünschte Aufgabe mit dem geringsten Aufwand (für uns als Entwickler) erfüllt. So wird also beispielsweise ein StackPanel verwendet, sollen Elemente untereinander platziert werden - und zwar in der Reihenfolge, wie sie hinzugefügt wurden. Werden ein paar wenige Elemente hinzugefügt, ist keine Auswirkung zu spüren. Sind es hunderte oder gar tausende, dann wird dieser Vorgang spürbar langsamer. <br /><br />Hierfür verantwortlich ist die unterschiedliche Funktionalität der Panels. Während ein Canvas relativ <i>dumm</i> ist und Elemente basierend auf einer Positionsangabe platziert, ist diese Logik in einem StackPanel oder einem DockPanel wesentlich komplexer.<br /><br /><h2>Layout System</h2><br />Vom Layout-System werden pro Kindelement zwei Schritte durchgeführt:<br />
<ul>
<li>Measure</li>
<li>Arrange</li>
</ul>
<br />Jedes dieser Kindelemente besitzt seine eigene Implementierung von Measure und Arrange, damit die an das Element gestellten Anforderungen bezüglich des Layout-Verhaltens erfüllt werden können.<br /><br /><b>Ablauf Layouting</b><br />
<ul>
<li>Ein Kindelement (UIElement) beginnt den Layoutprozess durch das Erfassen der Basiseigenschaften</li>
<li>Dann werden die Eigenschaften bezüglich Höhe, Breite, Randstärke ausgewertet</li>
<li>Ausführung von Panel-spezifischer Logik (siehe Orientation-Eigenschaft des StackPanels)</li>
<li>Der Inhalt wird ausgerichtet bzw. positioniert, nachdem die Größe etc. aller Kindelemente bemessen wurde.</li>
<li>Die Liste der Kindelemente wird am Bildschirm ausgegeben
</ul>
 <br /><br /><b>Wann wird es haarig?</b><br /><br />Beim Eintreten bestimmter Aktionen, wird der gesamte Layout-Prozess erneut durchlaufen. Folgende Aktionen sind dafür maßgeblich:<br />
<ul>
<li>Hinzufügen eines neuen Kindelementes</li>
<li>Ausführung der Methode <b>UpdateLayout</b> eines Kindelementes</li>
<li>Zuweisung von <b>LayoutTransform</b> eines Kindelementes</li>
<li>Bei Änderung einer Dependency Property mit Auswirkung auf Measure und Arrange (gesetzt über die Metadaten)</li>
</ul>
<br /><br /><h2>Fazit</h2><br />Durch das Wissen wie das Layout-System funktioniert und wann es erneut durchlaufen werden muss, lässt sich feststellen, in welchen Fällen worauf verzichtet werden sollte. So kann es beispielsweise effizienter sein, eine ListBox anstatt eines StackPanels zu verwenden (durch das Definieren von Templates kann das auch schön aussehen), oder vielleicht doch einen Canvas. <br /><br />Ist man sich nicht sicher, ob die geplante Variante die beste Performance bietet, bietet sich auch an, vor der konkreten Implementierung dann eventuell doch eine kleine Beispielanwendung zu schreiben. Auch eingesetzte Profiler sind hilfreich.<br /><br />Siehe auch: <a href="http://blog.norberteder.com/index.php?entry=entry080308-193544" target="_blank" >WPF: Performance messen und verbessern</a><br />]]></description>
		<guid isPermaLink="true">http://blog.norberteder.com/?entry=entry080618-182640</guid>
		<author>csharp@gmx.at</author>
		<pubDate>Wed, 18 Jun 2008 16:26:40 GMT</pubDate>
	</item>
</rdf:RDF>
