.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Mai 2011

dotnet Cologne 2011 – Auswertung der Feedbackbögen

31.05.2011 10:01:00 | Stefan Lange

Mehr als 2/3 der Teilnehmer haben Feedbackbögen abgegeben und diese sind nun ausgewertet. Hierzu ein kleiner Überblick.

Das Feedback der Teilnehmer ist überwiegend positiv und übertrifft unsere Erwartungen. Sowohl für die Location, die Auswahl der Sessions als auch die Organisation insgesamt gab es viel Lob. Darüber haben wir uns sehr gefreut.

Sehr positiv wurde das schnelle WLAN aufgenommen, das jederzeit ausreichend Bandbreite zur Verfügung stellte.

Nachdem wir diesmal die Pausen auf Basis des Feedbacks vom letzten Mal verlängert haben, kam nun mehrfach der Wunsch nach etwas kürzeren Pausen auf. Das wird wohl ein schwieriges Thema bleiben.

Verbesserungspotenzial wird bei der Website und der Organisation des Mittagessens gesehen.

Hier nun die Bewertung der Veranstaltung durch die Teilnehmer im Einzelnen. Die Zahl ist der Mittelwert von Schulnoten (1 bis 5) und die Zahl in Klammern die Varianz.

Räumlichkeiten: 1,7 (0,6)
Verpflegung: 1,9 (0,6)
Website: 2,1 (0,5)
Anmeldevorgang: 1,7 (0,3)
Sonstige Organisation: 1,6 (0,3)
Gesamteindruck: 1,6 (0,3)

Im Vergleich zum Vorjahr ist dies wieder eine leichte Steigerung von ca. 0,1 je Punkt.

Von denjenigen, die auf die Frage „Würden Sie an einer dotnet Cologne 2012 teilnehmen“ geantwortet haben (92% der abgegebenen Fragebögen), haben mehr als 99% mit „Ja“ gestimmt. Das ist ein super Ergebnis, mit dem wir mehr als zufrieden sind.

Auch bei der Bewertung der Vorträge gab es eine Steigerung im Vergleich zum Vorjahr. Hier das Ergebnis im Mittel über alle abgegebenen Bewertungen:

Kompetenz über alle Sprecher: 1,5 (0,5)
Qualität über alle Vorträge: 1,8 (0,8)

Die Sprecher bekommen ihre individuellen Auswertungen inkl. Kommentaren zugemailt als Gegenleistung für das zur Verfügung stellen ihrer Vortragsunterlagen.

Nochmals vielen Dank an alle, die zum Erfolg der diesjährigen dotnet Cologne beigetragen haben.

Danke Community! Bitte Deutsche Krebshilfe e. V.!

30.05.2011 09:22:39 | Gregor Biswanger

Vor fast zwei Monaten startete ich die Aktion “WPF 4 und Silverlight 4 gegen Krebs!”, bei der ich meine signierte DVD “WPF 4 und Silverlight 4” vom WPF-, Silverlight und Expression Blend-Team, für einen guten Zweck versteigerte. Völlig überrascht hat mich, dass zahlreiche E-Mails mit einer freiwilligen Spende bei mir persönlich eintrafen. Nicht nur das, sondern auch die Medien unterstützten diese Aktion sehr stark. Mit dem managen für die Spendenweitergabe war ich bis vor einigen Tagen noch beschäftigt.

image

Community News
(Thorsten Hans – SharePoint MVP bei der .NET User Group Frankfurt)

 

DKH_Logo

 

Für diesen starken Einsatz möchte ich mich nochmals bei der ganzen Community bedanken! Dank euch sind insgesamt 2.000 € an die Deutsche Krebshilfe e.V. eingegangen. Die DVD selbst wurde für 123 € von Peggy Reuter ersteigert.

image

Danke für die festen Spenden an:

Dr. Holger Schwichtenberg (.NET-Dozent und -Berater bei www.IT-Visions.de) 250 €
Microsoft Press Team (http://www.microsoft-press.de) 200 €
Michael Ferschl (Geschäftsführer von impuls Informationsmanagement GmbH) 200 €
Microsoft Deutschland GmbH (Developer Platform & Strategy Group ) 100 €
Microsoft Deutschland GmbH (Community Leader/Insider Program (CLIP)) 100 €
Microsoft Deutschland GmbH (MVP Awards Program) 100 €
.NET Day Franken (http://www.dotnet-day-franken.de) 100 €
Ruben Bonzanin (http://www.techniker-support.de) 100 €
Ralf Schoch (CoDeSo) 77,77 €
Andreas Weizel (http://www.awzhome.de) 70 €
Roland Schumacher (http://www.EdelsteinKreationen.ch) 66,66 €
Nico Franze (http://www.nfranze.de) 60 €
Florian Seffert (Flory IM | Your Windows Phone 7 Messenger) 50 €
Robert Walter (Softwareentwickler bei conplement AG) 50 €
Mathias Schiffer 50 €
Enrico Gebauer (http://silverlight-essentials.com/blog/) 50 €
Peggy Reuter (http://peggy-reuter.net) 50 €
Gregor Biswanger (Solution Architect bei impuls Informationsmanagement GmbH) 102,57 €
Sebastian Geertsen (Graf GmbH & Co. KG Ingolstadt) 50 €
(Anonym) 50 €

 

Interview mit Peggy Reuter

 

image
(Peggy Reuter – Interaction Designerin für WPF und Silverlight bei XAMLfab)

 

Gregor: „Hallo Peggy, du bist die glückliche Gewinnerin der Auktion mit der DVD „WPF 4 und Silverlight 4-Spezial Edition“. Dass du gewonnen hast, hatte mich sehr überrascht. Denn du warst bereits eine der ersten aus der Community die sich von selbst zu einer freien festen Spende zur Aktion gemeldet hatte. Gegen Ende hast du auch noch einen draufgelegt und die DVD abgestaubt. Wie ist es zu so einer starken Beteiligung deinerseits gekommen? Was hatte dich motiviert?“

Peggy: „Grundsätzlich finde ich die Aktion, nämlich Dein Engagement gegen Krebs gepaart mit einer Auktion bei Ebay, Deiner bestimmt sehr guten DVD und den sehr besonderen Autogrammen eine sehr gute Idee. Das .Net-Community-Engagement besteht oft aus reiner Fachsimpelei. Ich finde den Blick über den Tellerrand, eben dass das Leben aus mehr besteht als aus Bits and Bytes, auch im Rahmen seines Umfeldes hervorragend. Daher habe ich sofort reagiert mit einer Spende. Außerdem kann ich mir ja auch mal was sinnvolleres gönnen als nur Stöckelschuhe ;-)“

Gregor: „Und wieso dann noch zusätzlich die DVD?“

Peggy: „Warum ich mich gerade bemüht habe diese DVD zu bekommen? Hmm. Ich finde, ich habe der Technologie WPF und Silverlight viel zu verdanken. Der Switch vor einige Jahren und der Schritt in die darauf fokussierte Selbständigkeit später, war das Beste, was ich machen konnte. Mein Erfolg, mein Glück und meine Zufriedenheit hat viel damit zu tun. Zudem habe ich in der damit verbunden Community positivste Erfahrungen gemacht. Nun kann ich aber schlecht sagen „Danke, WPF“ oder „Spende an Silverlight“ oder sowas … Daher war es für mich ein Stück weit auch, etwas zurück zu geben.“

Gregor: „Vielen lieben Dank für deine Worte und deiner Hilfe zur Deutschen Krebshilfe e.V.! Respekt!“

Eine Einführung in die Windows Azure Startup Tasks

30.05.2011 08:57:00 | Sascha Dittmann

Azure LogoIn vielen Fällen decken die vorinstallierten Virtuellen Maschinen der Windows Azure Plattform alles ab, was das Entwicklerherz begehrt.
Doch was mache ich, wenn ich weitere Software in meiner Windows Azure Rolle benötige oder die Systemeinstellungen verändert werden müssen?
Hier kommen die Windows Azure Startup Tasks ins Spiel.

Dieser Blog Post gibt einen Überblick, welche Möglichkeiten die Windows Azure Startup Tasks bieten, um Problemstellungen, wie die oben genannten, zu lösen.

 

Wie funktionieren Windows Azure Startup Tasks

Mit Windows Azure Startup Tasks können Skripte bzw. Befehle, als Teil der Startroutine von Web- oder Worker-Rolle, ausgeführt werden.

Hierzu muss die ServiceDefinition.csdef angepasst werden:

<ServiceDefinition name="MyService"
   xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
   <WebRole name="WebRole1">
      <Startup>
         <Task commandLine="Startup.cmd"
               executionContext="elevated"
               taskType="simple" /> 
      </Startup> 
      <Sites>
         <Site name="Web">
            <Bindings>
               <Binding name="Endpoint1" endpointName="Endpoint1" />
            </Bindings>
         </Site>
       </Sites>
   </WebRole>
</ServiceDefinition>

 

  • Innerhalb des <Startup> Elements können eine oder mehrere <Task> Elements eingefügt werden.
    Mit der Reihenfolge der <Task> Elemente wird auch die Startreihenfolge der Startup Tasks festgelegt.
  • Der Wert des commandLine Attributes enthält den Namen des Programms oder Skriptes, welches ausgeführt werden soll (Relativer Pfad zum Stammverzeichnis der Applikation).
  • Der Wert des executionContext Attributs legt die Rechte des Startup Prozesses fest:
    • limited
      Das Startup Task wird mit den gleichen Rechten, wie die der Windows Azure Rolle, ausgeführt.
    • elevated
      Das Startup Task wird mit den Rechten eines Administrators ausgeführt.
      Das verwendete Benutzerkonto ist "NT AUTHORITY\SYSTEM".
  • Der Wert des taskType Attributes gibt die Art des Startup Prozesses an:
    • simple (Standardwert)
      Die Ausführung des Startvorganges wird erst fortgesetzt, wenn das Startup Task beendet wurde.
    • background 
      Die Ausführung des Startvorganges wird parallel mit dem Startup Task ausgeführt.
      Diese Startup Task Art ist unter anderem dafür geeignet, Hintergrundprozesse zu initiieren.
    • foreground
      Ähnlich dem Background Startup Task
      Im Gegensatz zum Background Startup Task, kann die Windows Azure Rolle so lange nicht neu gestartet werden, bis der Startup Task beendet ist.

Hinweis
Die Startup Skripte bzw. Befehle sollten so gestaltet sein, dass sie auch mehrmals hintereinander gestartet werden können, ohne unerwünschte Seiteneffekte aufzuweisen.

 

Lebenszyklus einer Windows Azure Rolle

Zum besseren Verständnis möchte ich den Lebenszyklus einer Windows Azure Rolle kurz skizieren:

Lebenszyklus einer Windows Azure Rolle

Nachdem die cspkg und cscfg Dateien in die Windows Azure Plattform hochgeladen wurden, sucht der Fabric Controller passenden Hosts für die Virtuellen Maschinen und erzeugt mehrere Differential VHD Dateien.
Mehr Informationen zu diesem Thema:
Inside Windows Azure, the Cloud Operating System with Mark Russinovich

Hinweis
Der Fabric Controller hat nichts mit der Windows Server AppFabric oder Windows Azure AppFabric zu tun, sondern ist die Basissoftware, die die Windows Azure Plattform steuert.

Sobald die VMs gestartet wurden, werden die Startup Tasks in der angegebenen Reihenfolge gestartet.

Die IISConfigurator.exe führt anschließend die Konfiguration der Internet Information Services (IIS) durch.
Hierzu werden die Einträge des <Sites> Elements, aus der ServiceDefinition.csdef, verwendet.

Außerdem werden die OnStart, Run und später OnStop Methoden, der von RoleEntryPoint abgeleiteten Klasse, ausgeführt.

 

Tips & Tricks

Anbei noch ein paar Tips & Tricks zu diesem Thema.

Erstellen von Startup Skripten in Visual Studio

Beim Erstellen der Skriptdateien mit Visual Studio, muss man sicher stellen, dass in den Eigenschaften die "Copy to Output Directory" Einstellung auf "Copy always" gesetzt ist.

Dateieigenschaften - Copy to Output Directory

Außerdem muss die Datei mit dem "Unicode (UTF-8 without signature) – Codepage 65001" Encoding gespeichert sein.

Visual Studio 2010 Menü - File - Save As...

Save Button Contextmenü - Save with Encoding...

Advanced Save Options

 

Remote Desktops Verbindung zum Debuggen nutzen

Um die Remote Desktop Verbindung zum Debuggen nutzen zu können, sollte man die Startup Tasks auf den taskType="Background" stellen. Somit steht RDP auch bei fehlgeschlagenen Startup Tasks zur Verfügung.

 

PowerShell Skripte

Die PowerShell ist standardmäßig bei den Windows Azure VMs vorinstalliert.
Allerdings erlaubt die ExecutionPolicy nicht, dass unsignierte Skripte ausgeführt werden können.

Je nach verwendeten Betriebssystem bzw. osFamily Einstellungen können folgende Befehle vor bzw. zum ausführen von PowerShell Skripten benutzt werden.

Windows Server 2008 SP1 bzw. osFamily="1"
reg add HKLM\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
/v ExecutionPolicy /d Unrestricted /f
Windows Server 2008 R2 bzw. osFamily="2"
powershell -ExecutionPolicy Unrestricted ./MeinSkript.ps1

Wenn einem nicht viel einfällt, muss man fragen

28.05.2011 18:29:51 | Albert Weinert

Wie der eine oder andere mitbekommen hat plane ich eine Veranstaltung rund um ASP.NET MVC. Nun suche ich einen Namen, jedoch nicht nur für die ASP.NET MVC Veranstaltung sondern für eine Reihe Veranstaltungen die unter diesem Konzept fahren.

.NET Open Space ist “belegt” für Wochenend-Veranstaltungen rund um .NET mit einem vielfältigen Themenspektrum. DevHouse ist primär Entwicklerbezogen und würde nicht so meine Vision passen, natürlich auch vergeben.

Meine Vision sind mehr oder weniger Regelmäßige Veranstaltungen zu einem Thema, mit einem kleinerem Teilnehmerkreis von 20-30 Personen, mit einer Dauer von 1-2 Tagen. Die Veranstaltungen an sich soll auch nicht viel Administrativen Aufwand für die Organisatoren machen, so dass sie gerne auch öfters stattfinden kann.

Was dort gemacht wird und wie es gemacht wird ist ziemlich offen, nur eins soll es nicht geben. Viele Vorträge und passive Teilnehmer. Jeder Teilnehmer soll sich einbringen und somit zum Wissens- und Erfahrungsaustausch beitragen.

Die Möglichen Themen sind vielfältig, es soll sich nicht nur um .NET drehen, sondern über alle aktuellen Themen die so um die Software anfallen.

Von Entwicklung, Architektur, Technologiebezogen, über Design bis zur User Experience. Alles soll dort einen Platz haben, jedoch mit dem zentralen Ziel bessere Software zu entwickeln.

Für dies alles such ich nun einen Namen, im Idealfall nicht vorbelastet sowie Verfügbarkeit entsprechender Domänen, Twitter-Adressen etc. Er soll sich gut mit Untertiteln kombinieren lassen um den Kern der jeweiligen Veranstaltung auszudrücken.

Bitte postet hier eure Vorschläge, ich habe auch ein paar Ideen, diese werde ich jedoch erst später einbringen um euch unbelastet in die Aufgabe gehen zu lassen.

Danach lasse ich abstimmen und es wird wohl auch was zu gewinnen geben, weiß nur noch nicht was.

Für die Veranstaltungen wird es dann eine Plattform geben die von den Veranstaltungen genutzt werden kann, aber nicht muss. Diese beinhaltet dann Anmeldung, Wartelisten, Wiki, Newsletter etc. Auch wird jeder eine entsprechende Veranstaltungen unter der Flagge durchführen können, das Konzept der Veranstaltung wird sich im laufe der “Jahre” dann auch sicher verbessern.

So, ich bitte um Ideen und Vorschläge.

Webcast : Preview Visual Studio vNext ALM

28.05.2011 14:16:00 | Christian Binder

Auf der TechEd wurden ja die nächste Visual Studio ALM Generation vorgestellt  und im Blog von Brian Keller gibt’s auch verschiedene Informationen zu dem Preview. Zusätzlich habe ich die wichtigsten Neuerungen in einem 30min Webcast zusammen gefasst. Der Cast wird in Kürze auch auf Ch9 und auf dem Webcastportal verfügbar sein.

image

Hier im Blog schon zum Download. Über Feedback freue ich mich natürlich.

Eindrücke: Die Advanced Developers Conference C++

27.05.2011 15:06:08 | Christian Binder

Seit langem wieder eine Konferenz für C++ Entwickler, die ADC C++. Ich war echt gespannt, ob man nach so langer Zeit die Community wieder auf eine Konferenz kommen wird und wurde nicht enttäuscht. Die Stimmung und der Ort (Chiemsee) waren echt super, da es auch ideale Bedingungen für das Networking neben den Vorträgen gab.  Abends gab es  dann eine kleine Bootfahrt, die in einer Q&A Session mit allen Sprechern endete. Dabei hatte ich den Eindruck, dass so eine Q/A Session absolut überfällig war. Nach der Bootfahrt ging die Diskussionen  weiter  bis  ca. 2:00 Nachts. Boris Jabes (Microsoft C++ Team) hatte mir am nächsten Morgen gesagt, dass er seit langem keine so gute Diskussion  mit der Community gehabt hätte. Michael Wong vom C++ Committee war auch dabei und hat über den Standard C++0x  gesprochen, der in seiner finalen Phase ist, und sehr wahrscheinlich den Namen C++ 11 haben wird.  Ich habe die Chance genutzt und mit Ihm ein kurzes Interview zu C++ 11 aufgenommen. Michael’s Passion für C++ muss man mal Live erlebt haben, er hat auch  auf seinem Blog einen Report geschrieben. Hier ein paar Bilder von der ADC C++:

clip_image001

clip_image002

clip_image003

clip_image004

Martin Richter (C++ MVP) war auch dabei, hier sind seine Eindrücke.

Ein großes Dankeschön möchte ich Bernd Marquardt aussprechen, der maßgeblich die Inhalte der Konferenz zusammengestellt hat und natürlich dem Sponsor Intel und dem ppedv Team, ohne die es die ADC C++ 11 nie gegeben hätte. Ich freue mich schon auf die ADC C++ 2012, da wird es dann einige neue spannende Themen rund um C++ geben.

Open XML ist schnell ! - Immer?

26.05.2011 16:03:15 | Jens Häupel

Ich habe in der Vergangenheit einige Artikel, Samples und WebCasts zum Thema Open XML bereitgestellt. Jetzt tauchte die Frage – oder vielmehr die Beobachtung – auf, dass das Einfügen von 50.000 Datensätzen á 10 Werten einige Stunden benötige. Dabei soll doch Open XML so schnell sein. Wie paßt das zusammen?

Es kommt natürlich auf den Source Code an Winking smile. Wie immer. Der in den Beispielen gezeigte Code war gedacht zum Einfügen einzelner Zellen in bestehende Tabellen. Dabei wurde Rücksicht auf viele Fälle genommen:

1. Die Zeile/Zelle existiert schon oder auch nicht
2. Es gibt vor der Zeile/Zelle oder danach weitere Zeilen/Zellen

Demensprechend verändert sich die Art und Weise Wie und vor allem Wo die Zelle bzw. Zeile eingefügt werden muss. Ich habe den Fall nachgestellt und mit dem gezeigten Beispiel 50.000 Datensätzen geschrieben. Das dauerte knapp 27 Minuten.

Danach habe ich den Code umgeschrieben. Wenn so viele Datensätzen nacheinander geschrieben werden, dann kann man davon ausgehen (oder zumindest sollte man diese Voraussetzung schaffen), dass diese Schreibvorgänge in einen leeren Bereich fallen, also erstens in der zu schreibenden Zeile noch nichts steht und es zweitens keine Zeilen nach diesem Bereich gibt, die Daten enthalten. Ein entsprechendes Template vorausgesetzt, kann jetzt ohne jegliche Prüfungen geschrieben werden. Und das spart richtig Zeit. Mit diesem Code:

SheetData sd = new SheetData();
ws.AppendChild(sd);
char c;
Row r = new Row();
for (uint i = 1; i < 50000; i++ )
{
  r.RowIndex = i;
  for (int si = 65; si < 75; si++)
  {
    c = Convert.ToChar(si);
    string cellRef = c.ToString() + i.ToString();

    r.AppendChild(CreateCellWithInlineString(cellRef, "Microsoft DPE Test"));
  }
  sd.AppendChild(r);
  r = new Row();
}
ws.Save(partWS);

habe ich die Zeit auf knapp 15 Sekunden gedrückt. Das sind gerade mal 0,9% der vorher benötigten Zeit.

Es kommt also immer darauf an, welchen Zweck der eingesetzte Code erfüllen soll und es lohnt sich, für verschiedene Einsatzgebiete angepaßte Voraussetzungen zu schaffen.

Visual Studio ALM Days 2011: vNext der Visual Studio ALM Platform live erleben

26.05.2011 11:32:00 | Christian Binder

Schon mal vormerken : Vom 23. bis 25. November finden in München die Microsoft Visual Studio ALM Days 2011 (ehemals TeamConf) statt. 

ALM Days 23-25 November 2011

Mit Top Keynotes von Sam Guckenheimer, Product Planner für Visual Studio,  Brian Harry, Microsoft Technical Fellow und „Vater“ von Team Foundation Server und Prof. Dr. Lambert Grosskopf Fachanwalt für Informationstechnologie (IT-Recht) sowie Urheber- und Medienrecht. Selbstverständlich werden auch lokale Top Sprecher wieder dabei sein.

imageimageimage

Klar im Fokus  ist natürlich die nächste  Generation der Visual Studio ALM Plattform und wie immer interessante Beiträge von TFS Anwendern für Anwender. Die Visual Studio ALM Days sind die ideale Gelegenheit sich zum Thema ALM auszutauschen. Aus meiner Sicht mehr als nur eine normale Konferenz.

Call-For-Papers und Frühbuchertickets bis 12. August

Ab sofort können Vorschläge für Vorträge bis zum 12. August eingereicht werden. Frühbucher erhalten bis zum 12. August bis zu 50 Prozent Rabatt auf den Ticketpreis.

Direkt zur Website der Visual Studio ALM Days 2011: www.teamconf.de

Chris

UI Automation : Hilfreiche Ressourcen zu CodedUI Tests

26.05.2011 09:17:30 | Christian Binder

Hier einige hilfreiche Links, die einige Fragen rund um CodedUI Test klären und den Einstieg erleichtern.

Coded UI – Diagnose von MSAA oder UIA Problemen in Anwendungen (Teil 1)

Coded UI – WPF Anwendungen für CodedUI vorbereiten (Teil 2)

Coded UI – WinForms Anwendungen für UITest vorbereiten (Teil 3)

Auch einen Blog, den man in diesem Kontext kennen sollte, ist Mathew Aniyan's Blog. Mathew ist Program Manager für Coded UI Test.

Content Index for Coded UI Test

Windows Phone: News zu Mango, neue Developer Tools und Video zu den Neuigkeiten

25.05.2011 16:01:52 | Kay Giza

Microsoft hat gestern in New York offiziell Mango vorgestellt, die nächste Version der Windows Phone-Plattform, die im Herbst auf den Markt kommen soll. Eine Aufzeichnung der Präsentation von Mango die Andy Lees und Kollegen gehalten haben, ist... [... mehr Informationen in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  Giza-Blog.de Facebook-Page | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

TT.UIA: Command Behavior

25.05.2011 07:28:00 | Jörg Neumann

Wie hier bereits beschrieben, eignen sich Behaviors sehr gut um Problemstellungen rund um MVVM zu lösen. Ein häufiges Problem in diesem Zusammenhang ist der Umgang mit Commands. Sie können lediglich Buttons (und bei WPF auch Menu Items) zugewiesen werden – alle anderen UI-Elemente verfügen nicht über eine Command-Eigenschaft. Zudem wird der Command immer nur über das Click-Event ausgelöst. Auch bezieht sich der Status eines Command stets auf die IsEnabled-Eigenschaft des jeweiligen Controls. All diese Limitationen versucht TT.UIA mit dem Command Behavior zu lösen.

Das Command Behavior

Die Klasse CommandBehavior leitet von TriggerAction<T> ab und kann somit auf beliebige Elemente und deren Events angewendet werden. Beispiel:
<Button>
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <behaviors:CommandBehavior
        Command="{Binding OkCommand}"
        PropertyName="Visiblity"
        CanExecutePropertyValue="Visible"
        CanNotExecutePropertyValue="Collapsed" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Button>

Hier wurde einem Button der CommandBehavior zugewiesen. Bei welchem Event das Command ausgeführt werden soll wurde hierbei über die EventName-Eigenschaft der Klasse EventTrigger angegeben.
Die Bindung zum Command kann daraufhin wie gewohnt über die Eigenschaften Command bzw. CommandParameter zugewiesen werden. Zusätzlich kann über die Eigenschaften PropertyName, CanExecutePropertyValue und ExecutePropertyValue angegeben werden, welche Eigenschaft des zugehörigen Elements auf welchen Wert gesetzt werden soll, wenn der Command aktiv bzw. inaktiv ist. Sollte für das Setzen des Eigenschaftenwertes eine Konvertierung erforderlich sein, kann über die Converter-Eigenschaft ein entsprechender Value Converter angegeben werden.
Darüber hinaus bietet CommandBehavior die Eigenschaft CommandAction. Dies ist ein shortcut für den Fall, dass sich der Status des Commands lediglich auf die Eigenschaft IsEnabled oder Visibility auswirken sollen. Hierbei muss CommandAction lediglich auf den Wert Hide oder Disable gesetzt werden. Hierbei kann die explizite Angabe über PropertyName, CanExecutePropertyValue und ExecutePropertyValue entfallen. Beispiel:
<Button>
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <behaviors:CommandBehavior
        Command="{Binding OkCommand}"
        CommandAction="Hide" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Button>

So, das war es erstmal mit meiner Blog-Serie zu TT.UIA. Als nächstes steht die Silverlight-Portierung an. Stay tuned!

Umbraco auf Windows Azure installieren

24.05.2011 13:26:00 | Sascha Dittmann

Umbraco LogoWie ich Christian Wendler, Vorstandsmitglied der Umbraco User Group Deutschland, versprochen hatte, wollte ich das Open-Source CMSUmbraco auch einmal auf der Windows Azure Plattform ausprobieren...

In diesem Blog Post berichte ich von meinen Erfahrungen, die ich, bei der Installation von Umbraco auf der Windows Azure Plattform, sammeln konnte.

 

Ein Überblick über die Installation

Für die Installation verwende ich den Windows Azure Accelerator für Umbraco, sowie das Umbraco CMS in der Version 4.7.0.

Der Windows Azure Accelerator für Umbraco dient hierbei als Host für eine oder mehrere Umbraco Sites:

Windows Azure Accelerator für Umbraco- Überblick

Genauer gesagt, ist der Windows Azure Accelerator für Umbraco eine Windows Azure Web Rolle.
Diese prüft in regelmäßigen Abständen nach Unterschieden zwischen den lokalen Umbraco Dateien und denen, die im "sites" Container eines Azure Blob Storage Accounts befinden (Dazu später mehr).
Falls Unterschiede bestehen, werden diese synchronisiert. Somit stellt jede Web Rollen Instanz sicher, dass sie immer den aktuellen Stand der Umbraco Dateien hat.
Falls nötig, werden auch weitere Sites hinzugefügt bzw. Sites entfernt.
Des weiteren nutzten die Umbraco Sites SQL Azure für die Umbraco und Session State Datenbanken.

 

Der Windows Azure Accelerator für Umbraco

Nach dem Download des Windows Azure Accelerator für Umbraco und dem entpacken der Dateien, kann die Installationsroutine mit dem StartHere.cmd Skript gestartet werden:

Windows Azure Accelerator für Umbraco - Stammverzeichnis

Das Windows Azure Projekt

Als Erstes wird man nach den Namen und Key des Windows Azure Storage Accounts gefragt.
Das Skript passt daraufhin die Service Configuration Datei des, im "code" Verzeichnis liegenden, Windows Azure Projektes an.

Windows Azure Accelerator für Umbraco - StartHere.cmd Skript (Teil 1)

Da das Starten der Web Rolle in der Windows Azure Plattform eine Weile dauern wird, sollte man das Projekt an dieser Stelle in Visual Studio öffnen und publizieren.

Hinweis
Das mitgelieferte Windows Azure Projekt ist so konfiguriert, dass zwei Instanzen vom Typ "Extra Small" gestartet werden. Wenn dies nicht gewünscht ist, sollte man die Web Rollen Konfiguration vorher anpassen.

 

Die Umbraco Datenbank für SQL Azure

Als Nächstes kann man über das Skript die Umbraco Datenbank in SQL Azure anlegen lassen.
Hierzu müssen der Server- und Datenbankname, sowie der Benutzer und das Passwort, eingegeben werden.

Windows Azure Accelerator für Umbraco - StartHere.cmd Skript (Teil 2)

Windows Azure Accelerator für Umbraco - StartHere.cmd Skript (Teil 3)

Windows Azure Accelerator für Umbraco - StartHere.cmd Skript (Teil 4)

 

Anpassen der Umbraco Web.Config und Erstellen der Session State Datenbank

Nachdem nun die SQL Azure Datenbank angelegt wurde, muss die Web.Config der Umbraco Seite angepasst werden.
Hierzu habe ich ein frisches Umbraco CMS heruntergeladen und entpackt.
Im nächsten Schritt des Skriptes wird man aufgefordert einen Pfad mit den Umbraco Dateien anzugeben.

Windows Azure Accelerator für Umbraco - StartHere.cmd Skript (Teil 5)

Hinweis
Hierbei sollte man den Slash am Ende der Pfadangaben nicht vergessen.

Anschließend muss noch ein Datenbankname für die Session State Datenbank vergeben werden.

Windows Azure Accelerator für Umbraco - StartHere.cmd Skript (Teil 6)

 

Hochladen der Umbraco Dateien

Zu guter Letzt fragt das Skript, ob man nun die Umbraco Dateien hochladen möchte.

Windows Azure Accelerator für Umbraco - StartHere.cmd Skript (Teil 7)

Wenn man dies mit einem "Y", bestätigt muss noch der Host Header angegeben werden.

Windows Azure Accelerator für Umbraco - StartHere.cmd Skript (Teil 8)

Daraufhin startet das mitgelieferte Deployment Tool.
Die Dialogfelder sind bereits mit den Werten aus dem Skript befüllt.

Windows Azure Accelerator für Umbraco - Deployment Tool

Ein Klick auf den Upload Button startet den Vorgang.

Bei dem Upload Vorgang wird jede Datei einzeln im Blob Storage angelegt.
Der Domain Name wird als Prefix für alle Azure Blobs verwendet.
Somit können die Dateien später den einzelnen Umbraco Sites zugeordnet werden.

Nach dem Upload kann das Deployment Tool geschlossen werden.

 

Einrichten der Umbraco Seite

Wenn die Windows Azure Rollen gestartet sind, kann man die neue Umbraco Installation unter der, im Skript verwendeten, URL erreichen.
Hierzu muss allerdings ein CNAME Eintrag im DNS Server angelegt oder (zu Testzwecken) die lokale hosts Datei angepasst werden.

Beim ersten Start der Umbraco Seite, müssen zuerst die wenigen Schritte der Umbraco Installation durchlaufen werden.

In Schritt 1 wird die Willkommensseite der Umbraco Installation angezeigt, die einen Überblick über die kommenden Schritte liefert.
Weiter zu Schritt 2 kommt man mit dem Klick auf "Let's get started!".

Umbraco Installation - Willkommensseite

In Schritt 2 müssen die Lizenzbedingungen gelesen und akzeptiert werden.

Umbraco Installation - Lizenzbedingungen

Der Schritt 3 wird übersprungen, da die Datenbankkonfiguration bereits durch das Windows Azure Accelerator Skript angelegt worden ist.

In Schritt 4 wird das Administratorkonto angelegt.

Umbraco Installation - Benutzerkonto

In Schritt 5 kann aus mehreren Starter Kits und Skins jeweils Eines ausgewählt werden.

Umbraco Installation - Auswahl Starter Kits

Umbraco Installation - Installation des Starter Kits

Umbraco Installation - Auswahl Skin

Mit Schritt 6 ist die Installation der Umbraco Seite fertig.

Umbraco Installation - Ende der Installation

 

Fazit

Mit dem Windows Azure Accelerator für Umbraco können schnell und einfach Umbraco Seite in der Windows Azure Plattform installiert und betrieben werden.

Einem kurzer Blick auf den Synchronisationsmechanismus lässt allerdings vermuten, dass möglicherweise sehr viele Transaktionen für den Azure Blob Storage generiert werden.

 


Download CodePlex Downloads:
Videos zu diesem Thema:

Ein ASP.NET MVC Camp (Arbeitstitel) in Köln

24.05.2011 12:14:49 | Albert Weinert

Ich habe da die Idee eines ASP.NET MVC Camps (Arbeitstitel). Ein Tag Rund um ASP.NET MVC und das ganze drum herum. Es soll eine recht kompakte Veranstaltung sein, vielleicht so 20-30 Teilnehmer. Auch keine Konferenz, sonden in einem OpenSpace Rahmen.

Freitag Abends bis Samstag Abend wird das ganze stattfinden. Am Freitag Abend wird gegessen, getrunken, geredet und der Samstag geplant. Samstags geht’s nun ans lernen, austauschen und verbessern .

Im Kern ist dies ein WebCamp. Es geht also nicht nur im ASP.NET MVC sondern um die komplette WebEntwicklung.

Folgende Themen kann ich mir vorstellen.

  • ASP.NET MVC
  • jQuery
  • JavaScripts
  • JavaScripts Frameworks
  • REST mal richtig
  • Was passiert auf anderen Plattform (Ruby, Python etc.)
  • Workshops
  • etc.

Was dran kommt ist OpenSpace typisch eine Sache der Teilnehmer.

Die Veranstaltung soll zum Selbstkostenpreis stattfinden, vielleicht findet sich ja auch noch ein Sponsor. Also möglichen Veranstaltungsort habe ich das Betahaus Köln im Auge

Nun gilt es generelles Interesse abzuklopfen und einen Termin zu finden. Das ganze soll im Augst stattfinden. Bitte stimmt ab wenn Ihr Interesse habt und an einem der möglichen Termine mitmachen wollt.

Wann soll das ASP.NET MVC Camp (Arbeitstitel) in Köln stattfinden?online survey

TT.UIA: Adorner Factory Behaviors

24.05.2011 07:57:00 | Jörg Neumann

Wie hier und hier bereits beschrieben, haben Expression Blend Behaviors ein paar Limitationen. Hierzu zählt zum Beispiel die Tatsache, dass sie nicht so flexibel wie Adorner sind. So können sie zum Beispiel nur das zugewiesene Element selbst manipulieren und keine zusätzlichen Elemente einfügen. Um diese Limitationen zu umgehen, bietet TT.UIA die Klasse AdornerFactoryBehavior.
Mit ihr kann ein beliebiger Adorner in Form eines Behaviors zugewiesen werden. Beispiel:
<TextBox>
  <i:Interaction.Behaviors>
    <behaviors:AdornerFactoryBehavior
AdornerTypeName="Thinktecture.UIAnnotations.ElementTrackerAdorner" />
  </i:Interaction.Behaviors>
</TextBox>

Dies hat den Vorteil, dass der Adorner sehr einfach mit Expression Blend zugewiesen werden kann.
AdornerFactoryBehaviorInBlend
Darüber hinaus ist es auch möglich, einen Adorner mehrfach dem gleichen Element zuzuweisen, was mit der Attached Property-Syntax nicht möglich ist.
Die meisten Adorner von TT.UIA verfügen jedoch über zusätzliche Eigenschaften, die nicht generisch über AdornerFactoryBehavior zugewiesen werden können. Daher bietet es sich an, eine entsprechende Ableitung zu erstellen. Ein Beispiel hierfür ist die Klasse CueBannerBehavior. Sie kapselt den CueBannerAdorner in dem sie von AdornerFactoryBehavior ableitet und die Eigenschaft CueBannerText bereitstellt.
public class CueBannerAdornerFactoryBehavior
: AdornerFactoryBehavior
{
  protected override Adorner CreateAdorner()
  {
    var adorner = new CueBannerAdorner(this.AssociatedObject);
    adorner.CueBanner = this.CueBannerText;
    return adorner;
  }
  public static readonly DependencyProperty
    CueBannerTextProperty = DependencyProperty.Register(
      "CueBannerText", typeof(string),
      typeof(CueBannerAdornerFactoryBehavior),
      new PropertyMetadata("", 
        OnCueBannerTextPropertyChanged));
  public string CueBannerText
  {
    get { return (string)GetValue(CueBannerTextProperty); }
    set { SetValue(CueBannerTextProperty, value); }
  }
  private static void OnCueBannerTextPropertyChanged(
    DependencyObject sender,
    DependencyPropertyChangedEventArgs e)
  {
    ((CueBannerAdornerFactoryBehavior)sender)
    .OnCueBannerTextChanged(sender, e);
  }
  private void OnCueBannerTextChanged(
    DependencyObject sender,
    DependencyPropertyChangedEventArgs e)
  {
    if (this.Adorner != null && e.NewValue != null)
      ((CueBannerAdorner)this.Adorner)
      .CueBanner = e.NewValue.ToString();
  }
}

Hier wurde zunächst die Methode CreateAdorner() der Basisklasse überschieben und hierin der CueBannerAdorner erstellt. Die Property CueBannerText muss nun lediglich an den Adorner durchgereicht werden.
Im nächsten Post geht es mal nicht um grafische Effekte, sondern den sinnvollen Einsatz von Behaviors in MVVM-Szenarien.

Einladung zum Treffen der .NET Usergroup Dresden am 16.06.2011

23.05.2011 18:23:00 | Martin Hey

Das Juni-Treffen der .NET Usergroup Dresden wird am 16.06.2011 stattfinden. Die Veranstaltung beginnt um 18:00 Uhr in den Räumen der Saxonia Systems AG.

Thematisch wird es dabei um zwei Themenblöcke gehen, die beide Mathias Raake bestreiten wird:

Zum einen werfen wir einen Blick auf PostSharp. Die Implementierung von INotifyPropertyChanged, Logging-Code, Exception-Handling oder auch Caching sind Funktionalitäten, die man in vielen Teilen der Anwendung immer wieder implementieren muss. Dabei haben diese Funktionen mit der eigentlichen Logik eurer Anwendung wenig zu tun. Die Aspektorientierte Programmierung (AOP) ermöglicht es euch, euren Code wieder auf das Wesentliche zu beschränken und "Infrastrukturfunktionen" in sogenannte Aspekte auszulagern. Euer Code wird kürzer, lesbarer und somit wartbarer, und die Aspekte können einfach wiederverwendet werden. Der Vortrag zeigt anhand von PostSharp und Microsoft Unity, wie ihr AOP in Ihren Anwendungen nutzen könnt.

Im Anschluss daran schauen wir uns gemeinsam NLocalize an.Wer bisher seine WPF-Anwendungen mit LocBaml lokalisiert hat, dem sei ein Blick auf dieses Tool empfohlen. Neovelop NLocalize unterstützt euch bei der Lokalisierung von WPF- und Silverlight Anwendungen. Als Visual Studio 2010 Plugin ermöglicht NLocalize die Lokalisierung direkt in Visual Studio. Für Übersetzer gibt es einen eigenen Client, der sich durch eine hohe Benutzerfreundlichkeit auszeichnet.

Wie immer, so wird es auch dieses Mal wieder im Anschluss die Möglichkeit geben, bei einem Bierchen zu netzwerken.

Einladung zum Treffen der .NET Usergroup Dresden am 16.06.2011

23.05.2011 18:23:00 | Martin Hey

Das Juni-Treffen der .NET Usergroup Dresden wird am 16.06.2011 stattfinden. Die Veranstaltung beginnt um 18:00 Uhr in den Räumen der Saxonia Systems AG.
 
Thematisch wird es dabei um zwei Themenblöcke gehen, die beide Mathias Raake bestreiten wird:
 
Zum einen werfen wir einen Blick auf PostSharp. Die Implementierung von INotifyPropertyChanged, Logging-Code, Exception-Handling oder auch Caching sind Funktionalitäten, die man in vielen Teilen der Anwendung immer wieder implementieren muss. Dabei haben diese Funktionen mit der eigentlichen Logik eurer Anwendung wenig zu tun. Die Aspektorientierte Programmierung (AOP) ermöglicht es euch, euren Code wieder auf das Wesentliche zu beschränken und "Infrastrukturfunktionen" in sogenannte Aspekte auszulagern. Euer Code wird kürzer, lesbarer und somit wartbarer, und die Aspekte können einfach wiederverwendet werden. Der Vortrag zeigt anhand von PostSharp und Microsoft Unity, wie ihr AOP in Ihren Anwendungen nutzen könnt.
 
Im Anschluss daran schauen wir uns gemeinsam NLocalize an.Wer bisher seine WPF-Anwendungen mit LocBaml lokalisiert hat, dem sei ein Blick auf dieses Tool empfohlen. Neovelop NLocalize unterstützt euch bei der Lokalisierung von WPF- und Silverlight Anwendungen. Als Visual Studio 2010 Plugin ermöglicht NLocalize die Lokalisierung direkt in Visual Studio. Für Übersetzer gibt es einen eigenen Client, der sich durch eine hohe Benutzerfreundlichkeit auszeichnet.
 
Wie immer, so wird es auch dieses Mal wieder im Anschluss die Möglichkeit geben, bei einem Bierchen zu netzwerken.

Falscher Redirect auf SharePoint-Formulare

23.05.2011 17:17:00 | Martin Hey

SharePoint-Listen bringen auch immer ihre eigenen Formulare mit, mit denen Listenelemente angeschaut (DispForm.aspx), editiert (EditForm.aspx) oder erzeugt (NewForm.aspx) werden können. Im Standardfall beinhalten diese Formulare ein ListFormWebPart, mit dessen Eigenschaft FormType definiert wird, welche Funktion das WebPart bereitstellen soll. Diese Formulare können auch an eigene Bedürfnisse angepasst werden, um weitere Funktionalitäten an dieser Stelle bereitzustellen.

Editiert man diese Formulare zu intensiv, so kann es sein, dass SharePoint verweigert, auf die Formulare zu verweisen. Das merkt man daran, dass im Kontextmenü die Menüpunkte "Element anzeigen" oder "Element bearbeiten" auf die Hauptseite der SiteCollection verweisen und nicht mehr die Listenformulare aufgerufen werden. Gut ist beraten, wer dann noch die Originalversion der Listenformulare vorliegen hat (oder zumindest eine Version, die noch funktioniert hat). Hat man dies nicht, so hat man in der Regel extrem viel Spaß dabei, die Seite wiederherzustellen, denn SharePoint verwendet intern jede Menge Guids, die auch hier dann benötigt werden.

Eine kleine Hilfestellung, was man bei der Wiederherstellung der Standardformulare beachten muss, gibt Ben in seinem Blog. Am wichtigsten hierbei: Guid der Liste, Guid des WebParts und FormType des ListFormWebParts.

Falscher Redirect auf SharePoint-Formulare

23.05.2011 17:17:00 | Martin Hey

SharePoint-Listen bringen auch immer ihre eigenen Formulare mit, mit denen Listenelemente angeschaut (DispForm.aspx), editiert (EditForm.aspx) oder erzeugt (NewForm.aspx) werden können. Im Standardfall beinhalten diese Formulare ein ListFormWebPart, mit dessen Eigenschaft FormType definiert wird, welche Funktion das WebPart bereitstellen soll. Diese Formulare können auch an eigene Bedürfnisse angepasst werden, um weitere Funktionalitäten an dieser Stelle bereitzustellen.

Editiert man diese Formulare zu intensiv, so kann es sein, dass SharePoint verweigert, auf die Formulare zu verweisen. Das merkt man daran, dass im Kontextmenü die Menüpunkte "Element anzeigen" oder "Element bearbeiten" auf die Hauptseite der SiteCollection verweisen und nicht mehr die Listenformulare aufgerufen werden. Gut ist beraten, wer dann noch die Originalversion der Listenformulare vorliegen hat (oder zumindest eine Version, die noch funktioniert hat). Hat man dies nicht, so hat man in der Regel extrem viel Spaß dabei, die Seite wiederherzustellen, denn SharePoint verwendet intern jede Menge Guids, die auch hier dann benötigt werden.

Eine kleine Hilfestellung, was man bei der Wiederherstellung der Standardformulare beachten muss, gibt Ben in seinem Blog. Am wichtigsten hierbei: Guid der Liste, Guid des WebParts und FormType des ListFormWebParts.

Windows Phone 7 Quickstart für Entwickler im Juni

23.05.2011 16:05:05 | Peter Kirchner

Auch im Juni bieten wir Ihnen wieder Trainings zum Windows Phone 7 an. Sollten Sie im Februar keine Gelegenheit gehabt haben, dann können Sie dies nun nachholen.

In diesem Tagesworkshop erfahren Sie alles Notwendige zur neuen Softwareplattform und den Werkzeugen von Windows Phone 7, um sofort mit der Entwicklung eigener Anwendungen beginnen zu können. Sie lernen, wie auf Basis bewährter Technologien wie .NET und Silverlight mit der populären Sprache C# und dem hochproduktiven Werkzeug Visual Studio 2010 Apps für den privaten und Businesseinsatz entstehen. Sie erfahren, wie Sie Ihre Software im Emulator oder auf Geräten testen und schließlich im Windows Phone Marketplace vertreiben können. Und Sie haben die Möglichkeit, von unserem erfahrenen Trainer Antworten auf Ihre Fragen zu erhalten. Diese Veranstaltung vermittelt die Inhalte durch Vorträge und Demos.

Folgende Themen werden wir Ihnen vorstellen:

  • Windows Phone 7 – Plattformüberblick
  • Grundlagen der WP7-Entwicklung mit Silverlight
  • Fortgeschrittene Silverlight-Themen
  • Datenspeicherung und -zugriff
  • Lebenszyklus einer Anwendung
  • Zugriff auf Sensoren & Nutzerdaten
  • Web Services & the Cloud
  • Softwarevertrieb

Preis: kostenlos
Referent: Karsten Samaschke

Datum, Veranstaltungsort und Anmeldung

Id des Listenelements im EditForm.aspx anzeigen

23.05.2011 15:50:00 | Martin Hey

Im Standard werden einige Felder nicht in EditForm.aspx oder DispForm.aspx angezeigt. Eines dieser Felder ist die ID des Listeneintrags. Auf eine SQL-Tabelle projiziert, handelt es sich dabei um den internen Identifier, der den Eintrag eindeutig identifiziert und automatisch inkrementiert wird.

Da diese Spalte von SharePoint automatisch verwaltet wird, ist es in vielen Anwendungsfällen auch durchaus gerechtfertigt, diese nicht anzuzeigen, um so auch nicht den Eindruck zu erwecken, dieses Feld könnte editiert werden. Nun gibt es aber auch Anwendungsfälle, da möchte man, dass ein solcher Identifier auch angezeigt wird, einfach weil man so schon eine laufende Nummer hat. Beispiel dafür ist ein Bugtracking oder auch ein Support-System, wie es das Help-Center-Template schon mitbringt.

Für das Problem, die ID des Listeneintrags anzuzeigen gibt es im Netz mehrere Lösungen. Meist läuft die Lösung darauf hinaus, mit JavaScript oder Codebehind den QueryString-Parameter ID aus der Url auszulesen. Eine weitere Möglichkeit, und wenn man die bestehenden Seiten mal etwas genauer betrachtet vermutlich die von den SharePoint-Entwicklern vorgesehene Lösung ist es, die Klasse ListItemProperty zu verwenden. Damit kann man, wie der Name schon vermuten lässt, auf die Eigenschaften des zugrundeliegenden ListItems zugreifen.
<SharePoint:ListItemProperty Property="ID" id="ID" runat="server"/>

Dieses Control findet man im SharePoint Designer in der Toolbox.

Noch ein kleiner Tipp am Rande: Ähnlich wie ListItemProperty gibt es auch noch ListProperty, mit dem man Eigenschaften der Liste anzeigen kann.

Id des Listenelements im EditForm.aspx anzeigen

23.05.2011 15:50:00 | Martin Hey

Im Standard werden einige Felder nicht in EditForm.aspx oder DispForm.aspx angezeigt. Eines dieser Felder ist die ID des Listeneintrags. Auf eine SQL-Tabelle projiziert, handelt es sich dabei um den internen Identifier, der den Eintrag eindeutig identifiziert und automatisch inkrementiert wird.
 
Da diese Spalte von SharePoint automatisch verwaltet wird, ist es in vielen Anwendungsfällen auch durchaus gerechtfertigt, diese nicht anzuzeigen, um so auch nicht den Eindruck zu erwecken, dieses Feld könnte editiert werden. Nun gibt es aber auch Anwendungsfälle, da möchte man, dass ein solcher Identifier auch angezeigt wird, einfach weil man so schon eine laufende Nummer hat. Beispiel dafür ist ein Bugtracking oder auch ein Support-System, wie es das Help-Center-Template schon mitbringt.
 
Für das Problem, die ID des Listeneintrags anzuzeigen gibt es im Netz mehrere Lösungen. Meist läuft die Lösung darauf hinaus, mit JavaScript oder Codebehind den QueryString-Parameter ID aus der Url auszulesen. Eine weitere Möglichkeit, und wenn man die bestehenden Seiten mal etwas genauer betrachtet vermutlich die von den SharePoint-Entwicklern vorgesehene Lösung ist es, die Klasse ListItemProperty zu verwenden. Damit kann man, wie der Name schon vermuten lässt, auf die Eigenschaften des zugrundeliegenden ListItems zugreifen.
 
<SharePoint:ListItemProperty Property="ID" id="ID" runat="server"/>
 
Dieses Control findet man im SharePoint Designer in der Toolbox.
 
Noch ein kleiner Tipp am Rande: Ähnlich wie ListItemProperty gibt es auch noch ListProperty, mit dem man Eigenschaften der Liste anzeigen kann.

TT.UIA: Behavior Factories

23.05.2011 08:17:00 | Jörg Neumann

Wie hier bereits beschrieben, haben Expression Blend Behaviors ein paar Limitationen. Hierzu zählt zum Beispiel die Tatsache, dass sie nicht per Style zugewiesen werden können. Um diese Limitation zu umgehen, bietet TT.UIA die Behavior Factories.

Die Klasse BehaviorFactory

Behaviors werden zwar auch über Attached Properties zugewiesen, können aber nicht über einen Style zugewiesen werden. Dies ist per Design so und führt bei jedem Versuch zu einer Exception. Behaviors lassen sich jedoch per Code zuweisen. Diese Möglichkeit nutzt die Klasse BehaviorFactory. Sie stellt die Attached Property BehaviorTypeName zu Verfügung, über die die Typbezeichnung des Behaviors angegeben werden kann. Der so angegebene Behavior-Typ wird daraufhin instanziiert und per Code an das entsprechende Element gebunden.
In folgendem Beispiel wird das Focus Behavior mit Hilfe von BehaviorFactory innerhalb eines Styles zugewiesen:
<Window>
<Window.Resources>
<Style TargetType="TextBox">
<Setter Property="behaviors:BehaviorFactory.BehaviorTypeName" Value="Thinktecture.UIAnnotations.Behaviors.FocusBehavior" />
</Style>
</Window.Resources>
...
</Window>

Da der Style implizit definiert wurde, werden daraufhin alle Textboxen des Fensters mit dem Behavior ausgestattet, ohne das diese explizit zugewiesen werden müssen.
In diesem Fall kann es jedoch vorkommen, das eine bestimmte Textbox des Fensters nicht mit dem Behavior ausgestattet werden soll. Hierfür bietet BehaviorFactory die Attached Property DetachBehaviorTypeName. Sie unterbindet für das zugehörige Element ist Zuweisung des über einen Style definierten Behaviors.
<TextBox
behaviors:BehaviorFactory.DetachBehaviorTypeName=
"Thinktecture.UIAnnotations.Behaviors.FocusBehavior" />

TriggerActionFactory und TargetedTriggerActionFactory

Wenn das betreffende Behavior nicht von Behavior<T>, sondern von TriggerAction<T> oder TargetedTriggerAction<T> ableitet, muss zusätzlich noch der Name des auslösenden Events, bzw. das Zielelement angegeben werden. Hierfür bietet TT.UIA die spezialisierten Klassen TriggerActionFactory und TargetedTriggerActionFactory.
Im nächsten Post geht es ebenfalls um Behaviors. Hier werde ich die Klasse AdornerFactoryBehavior vorstellen, die verwendet werden kann, um beliebige Adorner per Behavior zuzuweisen.

.NET Day Franken 2011

23.05.2011 02:33:41 | Rene Drescher-Hackel

Als ich 2005 nach Bayern kam, um hier meine Brötchen zu verdienen, da arbeitete Tom noch bei der conplement AG in Nürnberg und war sehr bemüht, die .NET Usergroup Franken, die seinerzeit von Damir Tomicic ins Leben gerufen wurde, mit mehr Leben zu füllen. Es gab Termine, da waren vielleicht gerade mal ein Hand voll Teilnehmer gekommen, gleichwohl die Themen nie uninteressant waren. Tom setzte alles daran, irgendwie monatlich, also regelmäßiger als bisher, ein Treffen für die Usergroup zu organisieren.

Silverlight 5: Better MVVM support

20.05.2011 14:10:00 | Patric Schouler

With Silverlight 5 you have the posibilty to define Custome Markup Extensions. For example you can define a new extension MethodInvoke which calls the named method in your datacontext in this way. Not longer event triggers or something else necessary.

more information about Silverlight 5 Beta features: Here

image

TT.UIA: Behaviors

20.05.2011 08:25:00 | Jörg Neumann

Wie hier bereits beschrieben, haben Expression Blend Behaviors gegenüber Attached Properties einige Vorteile. Hierzu zählt vor allem die Designer-Unterstützung in Blend. Ein weiterer Vorteil ist jedoch auch die Tatsache, dass Behaviors mit mehreren Elementen verbunden werden können.
Ein einfaches Beispiel:Ein Dialog enthält eine Textbox/Button-Kombination zur Auswahl einer Datei.
OpenFileBehavior
Klassischerweise würde man hier im Code-Behind den Dateidialog öffnen und die Auswahl in die daneben stehende Textbox übertragen. Da dies eine Funktionalität ist, die häufiger benötigt wird, bietet es sich an sie zu kapseln. Der Code-Behind-Ansatz ist jedoch auch in MVVM-Szenarien ein Problem. Das Öffnen des Dialogs möchte man jedoch auch nicht im ViewModel hinterlegen, da es sich um UI-Code handelt.

Das Open File Behavior

Mit einem Behavior lässt sich solch eine Funktionalität sehr komfortabel abbilden. TT.UIA bietet hierfür die Klasse OpenFileBehavior. Sie leitet von TargettetTriggerAction<T> ab und kann somit nicht nur ein Element (der Button im oberen Beispiel), sondern auch an ein Zielelement (die Textbox) gebunden werden.
...
<Button
  xmlns:i=
    "clr-namespace:System.Windows.Interactivity;
    assembly=System.Windows.Interactivity"
  xmlns:behaviors=
    "clr-namespace:Thinktecture.UIAnnotations.Behaviors;
     assembly=Thinktecture.UIAnnotations">

  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <behaviors:OpenFileBehavior
        TargetName="imageTextBox"
        DialogTitle="Select an image..."
        Filter="PNG Files|*.png" />
    </i:EventTrigger>
  </i:Interaction.Triggers>

</Button>

<TextBox x:Name="imageTextBox" />
...

Die Deklaration erfolgt hierbei über die Klasse System.Windows.Interactivity.Interaction, die Teil des Expression Blend SDKs ist.

Das Busy Behavior

Ein weiteres Problem in MVVM-Anwendungen ist der Umgang mit Cursorn und anderen Fortschrittsanzeigen. Denn das ViewModel sollte weder explizit einen Cursors setzen, noch ein entsprechendes UI-Element direkt steuern. In Silverlight löst man dies meist mit dem beliebten (wenn auch hässlichen) BusyIndicator, die per Data Binding an das ViewModel gebunden wird. Hierfür muss die Komponente jedoch zur Entwurfszeit in das Layout des jeweiligen Fensters so eingefügt werden, dass sie im Vordergrund steht. Dies verursacht bei nachträglichen Layout-Änderungen häufig Probleme. Zudem sollte die Bedienung des Fensters verhindert werden, sobald der BusyIndicator aktiv wird.
All diese Herausforderungen versucht die Klasse *BusyBehavior* zu lösen. Sie zeigt eine überdimensionale Eieruhr und legt dabei einen Overlay über das zugehörige Fenster um die Bedienung der Oberfläche durch den Benutzer zu verhindern. Das Busy Behavior kann mit einem beliebigen Element verknüpft werden. Es ermittelt zur Laufzeit das übergeordnete Fenster und fügt sich auf oberster Ebene in den visuellen Baum ein.
<i:Interaction.Behaviors>
  <behaviors:BusyBehavior
    IsBusy="{Binding IsBusy}" />
</i:Interaction.Behaviors>

Die Steuerung erfolgt über die Eigenschaft *IsBusy*, die zum Beispiel an eine entsprechende Eigenschaft des zugehörigen ViewModels gebunden werden kann. Das Ganze sieht dann zur Laufzeit in etwas so aus:
BusyBehavior

Das Dialog Button Behavior

Die Klasse DialogButtonBehavior steuert das Verhalten von Dialogschaltflächen. Klassischerweise hat ein Dialog einen Accept- und einen Cancel-Button, womit der Benutzer das Fenster mit Enter bestätigen, bzw. mit ESC abbrechen kann. Hierbei wird das Fenster geschlossen und die DialogResult-Eigenschaft entsprechend gesetzt. All dies fasst DialogButtonBehavior zusammen, wie das folgende Beispiel zeigt:
<Button>
  <i:Interaction.Behaviors>
    <behaviors:DialogButtonBehavior ButtonType="Ok" />
  </i:Interaction.Behaviors>
</Button>

Über die Eigenschaft ButtonType kann das entsprechende Verhalten definiert werden.

Das Focus Behavior

Die Klasse FocusBehavior markiert das fokussierte Eingabeelement mit einer beliebigen Hintergrundfarbe.
<TextBox>
  <i:Interaction.Behaviors>
    <behaviors:FocusBehavior HighlightBrush="Yellow" />
  </i:Interaction.Behaviors>
</TextBox>

FocusBehavior
So, das war’s erstmal mit den Behaviors von TT.UIA. Im nächsten Post gehe ich auf die Behavior Factories ein, mit denen einige Limitationen der Behaviors behoben werden können.

TT.UIA: Generic Adorner

19.05.2011 17:58:00 | Jörg Neumann

Wie hier bereits beschrieben, bringt TT.UIA eine Reihe fertiger Adorner mit. Unter ihnen ist auch der Generic Adorner, mit dem beliebige Elemente als Adorner definiert und mit anderen Elementen verknüpft werden können.
Die Klasse GenericAdorner dient als Platzhalter für beliebigen Content, der frei positioniert werden kann. Die Zuweisung erfolgt hingegen über die Klasse GenericAdorners, welche entsprechende Attached Properties für die Konfiguration bereitstellt.
Das folgende Beispiel demonstriert die Verwendung:
<Window ...>
  <Window.Resources>
    <ToolBar x:Key="adornerToolbar">
      <Button ToolTip="Cut" Command="Cut">
        <Image Source="/Images/Cut.png" Stretch="None" />
      </Button>
      <Button ToolTip="Copy" Command="Copy">
        <Image Source="/Images/Copy.png" Stretch="None" />
      </Button>
      <Button ToolTip="Paste" Command="Paste">
        <Image Source="/Images/Paste.png" Stretch="None" />
      </Button>
    </ToolBar>
  </Window.Resources>

  <TextBox
    am:GenericAdorners.AdornerElement="{StaticResource adornerToolbar}"
    am:GenericAdorners.VerticalAlignment="Top"
    am:GenericAdorners.HorizontalAlignment="Right"
    am:GenericAdorners.Placement="VerticalOuterHorizontalInner"
    am:GenericAdorners.Margin="0,0,0,0"
    am:GenericAdorners.Visible="True"
    am:GenericAdorners.VisibleOnFocus="True" />

</Window>

Hier wurde zunächst eine Toolbar im Resource Dictionary des Fensters definiert, welche als Adorner einer Textbox zugewiesen werden soll. Die Zuweisung erfolgt über die Attached Property GenericAdorners.AdornerElement. Für die Positionierung stehen die Properties HorizontalAlignment, VerticalAlignment und Placement zu Verfügung. Placement gibt hierbei an, ob sich die Position auf den inneren oder äußeren Rahmen des jeweiligen Controls beziehen soll. Die folgende Abbildung zeigt die möglichen Kombinationen:
GenericAdornerPlacement
Über die Eigenschaft VisibleOnFocus kann zusätzlich festgelegt werden, ob der Adorner dynamisch eingeblendet werden soll, wenn das zugehörige Element den Fokus erhält.
In den Beispielen zu TT.UIA ist eine kleine Demo enthalten, die den Einsatz von GenericAdorner zeigt.
GenericAdornerDemo
Das war’s erstmal mit den Adornern. Im nächsten Post geht es um die Behaviors in TT.UIA.

SEO-Konferenz: SEMSEO + PubCon 2011: 25 Prozent Rabatt fuer alle MSDN Online-Nutzer

19.05.2011 09:26:08 | Kay Giza

Am 27. Mai 2011 findet bereits zum fünften Mal die Fachkonferenz für Suchmaschinenoptimierung und Suchmaschinenmarketing in Hannover statt. Informieren Sie sich über aktuelle Trends, Strategien und Optimierungsmaßnahmen im Umgang mit den Suchmaschinen. Bing ermöglicht allen MSDN Online-Nutzern eine exklusive Ermäßigung von 25% auf den Eintritt… [... mehr Informationen in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  Giza-Blog.de Facebook-Page | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

TT.UIA: Data Annotation Support

18.05.2011 13:14:00 | Jörg Neumann

Wie ich hier bereits beschrieben habe, können die Adorner von TT.UIA sehr leicht per Style zugewiesen werden. Doch neben dieser existiert noch eine weitere Möglichkeit die Zuweisung zu automatisieren.
TT.UIA bietet mit Annotations.AttachDataAnnotations eine Attached Property, die auf Root-Ebene zugewiesen wird. Wird sie auf true gesetzt, werden alle Elemente des Fensters oder des User Controls durchlaufen und dessen Datenbindungen analysiert. TT.UIA prüft hierbei, ob die Datenquelle der jeweiligen Bindung über Data Annotations verfügt. Ist dem so, werden für bestimmte Annotations entsprechenden Adorner gesetzt. Hier ein einfaches Beispiel für eine annotierte Datenquelle:
using System.ComponentModel.DataAnnotations;
public class Person
{
  [Required]
  [Display(Prompt = "Enter the full name!")]
  public string Name { get; set; }
}

Hier wurde die Eigenschaft Name als Pflichtfeld markiert und ein entsprechender Prompt-Text hinterlegt.
Das Markup des Fensters könnte nun zum Beispiel wie folgt aussehen:
<Window uia:ApplyDataAnnotations="True">
  <TextBox Text="{Binding Person.Name}" />
</Window>

Das Ergebnis sähe hierbei wie folgt aus:
ApplyDataAnnotations
Für das Required-Attribut wurde der Required-Adorner und für den Prompt-Text der CueBanner-Adorner zugewiesen.
Darüber hinaus werden die folgenden Data Annotations von TT.UIA unterstützt:
  • EditableAttribute.AllowEdit
    Setzt die IsEnabled-Eigenschaft des zugehörigen Elements.
  • RequiredAttribute
    Verknüpft das zugehörige Element mit dem Required Adorner.
  • StringLengthAttribute.MaximumLength
    Setzt die MaxLength-Eigenschaft des zugehörigen Eingabesteuerelements (TextBox, ComboBox oder DatePicker).
  • DisplayFormatAttribute.DataFormatString
    Das Format wird dem Binding-Objekt des zugehörigen Elements zugewiesen.
  • DisplayFormatAttribute.NullDisplayText
    Verknüpft das zugehörige Element mit dem CueBanner Adorner.
Darüber hinaus bietet die Annotations-Klasse mit der Attached Property DescriptionDisplayControl die Möglichkeit, Beschreibungstexte die über DisplayAttribute.Description zugewiesen wurden, in einem beliebigen Control anzuzeigen. Beispiel:
Datenquelle:
using System.ComponentModel.DataAnnotations;
public class Person
{
  [Display(Description="The name of the person.")]
  [Required]
  [Display(Prompt = "Enter the full name!")]
  public string Name { get; set; }
}

Markup:
<Window uia:ApplyDataAnnotations="True"
  uia:Annotations.DescriptionDisplayControl="{Binding ElementName=descriptionLabel}"
  uia:Annotations.DescriptionDefaultText="Ready.">
  …
</Window>

Ergebnis:
DescriptionDisplayControl
Die Anzeige erfolgt hierbei beim Erhalt des Fokus. Welchen Text das Statuselement anzeigen soll, wenn kein gebundenes Element den Fokus hat, kann über die Eigenschaft Annotations.DescriptionDefaultText festgelegt werden.
Im nächsten Post geht es um den Generic Adorner, mit dem beliebige UI-Elemente als Adorner an andere Element “angehängt“ werden können.

TT.UIA: Adorner

17.05.2011 09:01:00 | Jörg Neumann

Nachdem ich im letzten Post die Funktionsweise von TT.UIA vorgestellt habe, soll es nun um die einzelnen Adorner und ihre Anwendung gehen. Doch bevor es losgeht, erkläre ich - zum besseren Verständig - das Prinzip der WPF Adorner noch einmal in ein paar Worten.

WPF Adorner

Bei Adornern handelt es sich um grafische Erweiterungen, die zur Laufzeit mit beliebigen Elementen des visuellen Baums verbunden werden können. Hierbei zeichnet der Adorner über die Oberfläche des zugehörigen Controls, bzw. erweitert dieses um zusätzliche Elemente. Adorner sind Teil von WPF und wurden ursprünglich für die Abbildung von Drag & Drop-Funktionalität entwickelt. Sie eignen sich jedoch auch gut für punktuelle Erweiterungen. So werden sie beispielsweise auch bei der Validierungsfunktionalität von WPF verwendet.

TT.UIA-Adorner

Für die Zuweisung von Adornern bietet TT.UIA die zentrale Klasse Annotations. Sie bietet eine Reihe von Attached Properties, die zur Erstellung von Konfiguration dienen. Beispiel:
<TextBox 
  uia:Annotations.ShowElementTracker="True"
  uia:Annotations.TrackerImageAlignment="Left" />

ElementTracker
Hier wurde der ElementTracker-Adorner zugewiesen und über die Eigenschaft TrackerImageAlignment positioniert.

Adorner per Style zuweisen

Die Zuweisung per Attached Property hat den Vorteil, dass kein zusätzlicher Code erforderlich ist und sich die Adorner auch per Style zuweisen lassen. Beispiel:
<Style TargetType="{x:Type TextBox}">
  <Setter Property="uia:Annotations.ShowElementTracker"
          Value="True" />
  <Setter Property="uia:Annotations.TrackerImageAlignment"
          Value="Left" />
</Style>

Hier wurde ein impliziter Style definiert, der automatisch allen Textboxen den ElementTracker-Adorner zuweist.

Die Adorner-Sammlung von TT.UIA

TT.UIA bietet eine Reihe vorgefertigter Adorner. Hier eine kurze Auflistung der entsprechenden Attached Properties mit Beschreibung:
  • HighlightOnFocus markiert das fokussierte Element mit einem weichen Rahmen.
    HighlightOnFocus
  • IsRequired markiert ein Pflichtfeld, welches über RequiredImageAlignment positioniert werden kann.
    Required
  • ShowEditTracker markiert Felder, dessen Wert vom Benutzer geändert wurden. Die Position kann über TrackerImageAlignment festgelegt werden.
    EditTracker
  • ShowElementTracker zeigt ein Symbol vor oder hinter dem aktuell fokussierten Element an. Die Position kann über TrackerImageAlignment festgelegt werden.
    ElementTracker
  • AttachErrorTemplate verknüpft das Control mit einem Error Template, das im Fehlerfall angezeigt wird.
    ErrorTemplate
  • AttachEditContextMenu verknüpft ein Eingabesteuerelement mit einem erweiterten Editor-Context-Menü.
    EditContextMenu
  • AttachEditorToolbar verknüpft ein Eingabesteuerelement mit einer Editor-Toolbar.
    EditorToolbar
  • CueBanner weist dem zugewiesenen Control ein Wasserzeichentext zu.
    CueBanner
  • AttachSmartTag weist dem zugewiesenen Control einen Smart Tag zu. Dessen Menü muss hierbei über die Eigenschaft SmartTagMenu zugewiesen werden.
    SmartTag
Eine detaillierte Beschreibung aller Adorner findet ihr in der Dokumentation von TT.UIA, die Implementierungsdetails werde ich in Kürze in der dotnetpro veröffentlichen.
Im nächsten Post geht es um die Möglichkeit Adorner automatisch per Data Annotations zuzuweisen.

Windows Azure Toolkit für Windows Phone 7 - Version 1.2 - veröffentlicht

17.05.2011 08:49:00 | Sascha Dittmann

Gestern, während der Keynote der TechEd North America, präsentierte Drew Robbins, wie man eine Applikation mit dem Windows Azure Toolkit für Windows Phone 7 (Version 1.2) baut.
Dieses Update steht auf CodePlex zum Download bereit und beinhaltet folgende Neuerungen:

  • Unterstützung für die Access Control Service 2.0, um Dienste wie z.B. Live ID, Facebook, Google, Yahoo! oder Active Directory Federation Services (ADFS) nutzen zu können
  • Unterstützung für die Apple Push Notification Services, bei Verwendung des Windows Azure Toolkits für iOS
  • Unterstützung der Windows Azure Storage Queues
  • Verbesserte Management Web Applikation
  • Refactoring und Vereinfachung des Quellcodes, sowie Bug Fixes

Des weiteren wurde die Demo Applikation "Cloud Ready Package for Devices" veröffentlicht:

  • Enthält eine Windows Azure Service Package (CSPKG) und Configuration (CSCFG) Datei
  • Kann einfach in der Windows Azure Plattform installiert werden
  • Enthält eine Schritt für Schritt Anleitung

Download Downloads:
Azure Team Blog Posts:

Visual Studio vNext : Application Lifecycle Management

16.05.2011 22:54:00 | Christian Binder

Endlich ist es soweit. Das erste Preview für die nächste Visual Studio Generation wurde heute auf der TechEd US von Jason Zanders  vorgestellt :-) Wer die Keynote verpasst hat, kann hier die ersten Neuerungen nachlesen.

image

Meine persönlichen Tops:

  • PowerPoint StoryBoard Assistant
  • C++ Unit Testing (endllich)  auch NUnit, Xunit Support
  • Team Navigator: Context Switching with My Work (sehr cool)
  • Intellitrace für Produktionssysteme
  • CodeReview Support
  • Code Clone (findet gleiche Codeblöcke, top um Copy Paste Coding zu finden und mal Aufzuräumen :-))
  • Agile Tools, wie Stakeholder Feedback und die neuen Dashboards

Brian Keller hat hierzu einen Speakflow aufgenommen, der einige Videos zu den verschiedenen Bereichen enhält:

image

Viel Spass

Jetzt anmelden: MSDN Live-Webcasts zum Anfassen - Die Windows Azure-Plattform

16.05.2011 17:39:48 | Peter Kirchner

Im Rahmen dieser neuen MSDN Live Webcast Serie bekommen Sie einen Testzugang zur Windows Azure-Plattform und können einzelne Anwendungen in Ihre eigene Windows Azure Test-Instanz bringen. Unsere Experten stellen dafür Cloud-Anwendungen bereit, diskutieren deren Architektur und stehen Ihnen natürlich auch für Fragen zur Verfügung. Abgerundet wird das Programm durch die Vorstellung der Neuigkeiten und der besten Web-Ressourcen zum Thema Windows Azure.

  • 19.05.2011 16:00 Uhr  - Cloud-Datenbanken und Storage in eigenen Anwendungen nutzen
  • 26.05.2011 16:00 Uhr  - .NET, PHP und Java Web-Anwendungen in die Cloud bringen
  • 09.06.2011 15:30 Uhr  - Mobile-Web Apps auf Windows Azure betreiben
  • 28.06.2011 15:30 Uhr  - In-house und Cloud-Systeme integrieren

Melden Sie sich jetzt an

TT.UIA: Einführung

16.05.2011 14:36:00 | Jörg Neumann

Die Idee hinter thinktecture UIAnnotations (TT.UIA) ist es, UI-Interaktionslogik zu kapseln und diese deklarativ an vorhandene Steuerelemente “anzuhängen”. Der Vorteil liegt hierbei in der flexiblen Anwendbarkeit. Wenn man zum Beispiel eine Textbox mit einem Wasserzeichentext (CueBanner) ausstatten will, gibt es mehrere Möglichkeiten.
  • Templating: Man erstellt ein Custom Template für die Textbox. Dies ist kein leichtes Unterfangen und ohne Code nur sehr schwer zu realisieren. Zudem muss das Template explizit oder implizit zugewiesen werden.
  • Vererbung: Hierbei wird eine Ableitung von Textbox erstellt und mit einem Custom Template verknüpft. Bei diesem Ansatz ist alles zwar schön gekapselt, jedoch funktioniert dies nur für Textboxen – Comboboxen, DatePicker und co. sind hiervon natürlich nicht betroffen. Daher müsste man den Vorgang für diese Controls wiederholen. Und wenn dann noch weitere Features implementiert werden sollen, ist man schnell dabei für die komplette Toolbox Ableitungen zu erstellen.
Noch schwieriger wird es, wenn die Erweiterungen nicht nur das Control selbst betreffen. Wenn zum Beispiel neben allen Input Controls, die an Pflichtfelder gebunden sind, ein entsprechendes Symbol erscheinen soll, müssten für alle Control-Typen Custom- oder User Controls erstellt werden.
Aus diesen (und vielen weiteren) Gründe liegt es nahe, die entsprechende Funktionalität mehr oder weniger Control-neutral abzubilden und diese dann im jeweiligen Fall an das gewünschte Control “anzuhängen”. Beispiel:
<TextBox uia:CueBanner="Enter your name!" />
CueBanner
In diesem Beispiel wird von TT.UIA ein WPF Adorner erzeugt, der direkt auf die Oberfläche des entsprechenden Controls zeichnet. Dies hat den Vorteil, dass keine Ableitung des Controls erforderlich ist. Zudem kann der Adorner auch außerhalb des Controls zeichnen, was eine leichte Kennzeichnung von Felder (Pflichtfeld, …) ermöglicht.
Für das “Anhängen” von UI-Funktionalität bietet TT.UIA zwei verschiedene Ansätze: Attached Properties und Expression Blend Behaviors. Beide Varianten haben Ihre Vor- und Nachteile.
  • Attached Properties bestechen durch ihre Einfachheit. Wie im oberen Beispiel dargestellt, können Sie sehr leicht an ein beliebiges Control angehängt werden. Doch der eigentliche Vorteil – gegenüber Behaviors – ist, dass sie auch per Style zugewiesen werden können.
  • Expression Blend Behaviors sind vor allem für Designer bzw. alle die vornehmlich in Expression Blend entwickeln interessant. Denn Blend bietet eine sehr gute Designer-Unterstützung für Behaviors. XAML-lastige Entwickler mögen sie wegen ihrer ausladenden Syntax hingegen eher weniger. Der wirkliche Vorteil gegenüber Attached Properties ist jedoch, dass man sie mit Events verknüpfen kann.
Hier ein Beispiel für die Deklaration eines TT.UIA-Behavior.
<TextBox>
  <i:Interaction.Behaviors>
    <behaviors:FocusBehavior HighlightBrush="Yellow" />
  </i:Interaction.Behaviors>
</TextBox>

FocusBehavior
Hier wird das FocusBehavior verwendet, welches das fokussierte Control in einer beliebigen Farbe einfärbt.
Im nächsten Post stelle ich die einzelnen Adorner und Behaviors von TT.UIA im Detail vor.

Windows Phone 7–the importance of ? for web service calls

15.05.2011 12:01:00 | Patric Schouler

In an older blog post I have mentioned that Windows Phone uses some magic caching mechanism if you call a web service with the same Uri. Because I have the problem now again with a REST-service in my new demo app, I will explain a possible workaround for this caching behaviour a little more in detail.

The problem

For example the call of the RESTfull service TopList 

http://localhost:57988/BornToMoveService.svc/TopList
will not invoked by your Windows Phone 7 client if you call this service a second time. The Windows Phone OS caches the service calls and will give you back the same results as after your first call. For example the event wc.DownloadStringCompleted of the WebClient class the same results as after your first call.
If you now will have the idea to destroy your instance of your WebRequest or WebClient class to force a non-caching behaviour – dont’t waste your time. The caching behaviour is still there.

The solution

The only way to get rid of this caching behaviour is to add a unique sign at your Uri. In this sample I use a Guid and put it after the normal REST-Url.

 
public void LoadData()
{
    ReadJsonDataAsync<TopListEntry>(BaseUrl + "TopList", list => this.TopList = list);
}
 
private static void ReadJsonDataAsync<T>(string url, Action<ObservableCollection<T>> resultAction)
{
    var wc = new WebClient();
    wc.DownloadStringCompleted += (s, e) => OnReadJsonDataCompleted(e.Result, resultAction);
 
    wc.DownloadStringAsync(new Uri(url+ "?id="+ Guid.NewGuid().ToString()));
}

Silverlight 5 goes to desktop application platform

15.05.2011 11:38:00 | Patric Schouler

With the new version Silverlight 5 (beta available) the sandbox of an Silverlight app will be nearly destroyed. If you run your Silverlight application in elevated trust mode as out-of-browser application you can access now to the whole local file system and using P/Invoke to call a Win32-Api function. This will give us as developers a total new scope for Silverlight applications. We can now concept Silverlight applications that have native access to local resources like scanners, 3rd party applications and the whole file system – I love this, because the necessity of using WPF nearly disappears.

Pete Brown give us a flavour of new Silverlight applications that uses several operating windows:

Silverlight 5: Working with Operating System Windows - Pete Brown's 10rem.net

Windows Phone 7– A taste of Mango for developers

15.05.2011 11:22:00 | Patric Schouler

The Mango update for Windows Phone 7 was announced at the Mix11 for end of 2011. But the capabilities of Mango are coming a little bit earlier to developers next month with the new Windows Phone tools.

Jese Liberty has now published a few code samples and decriptions for a few key features that will come with Mango.

SQL Server CE

Coming in Mango–Sql Server CE | Jesse Liberty

Access to Calendar and Contacts

Coming in Mango–Query the Contacts List | Jesse Liberty

Silverlight 4 as the new base brings

Coming in Mango–Implicit Styles | Jesse Liberty

Coming In Mango–ICommand | Jesse Liberty

Notifications - Reminders and Alarms

What’s Coming In Mango–Reminders | Jesse Liberty

Rückblick auf das mobilecamp Dresden

14.05.2011 17:06:00 | Martin Hey

Es ist zwar noch nicht vorbei, aber ich werde den Rest des Tages und auch morgen leider nicht mehr am mobilecamp Dresdenteilnehmen können. Trotzdem möchte ich über den heutigen Tag ein paar Worte verlieren.

Heute und morgen findet hier in Dresden in der Informatikfakultät das mobilecamp Dresden statt. Der Name ist Programm, handelt es sich hierbei doch um ein Barcamp mit der thematischen Ausrichtung auf die Entwicklung mobiler Anwendungen. Ich war nun schon auf verschiedenen Open Spaces, von daher ist mir das Konzept der Unkonferenz nicht ungeläufig; jedoch ist mir nach wie vor der Unterschied zwischen Barcamp und Open Space nicht klar, sind sie in der Praxis in meiner Erfahrung doch gleich. Aber das soll nicht Thema dieses Posts sein.

Inhaltlich geht es um mobile Entwicklung und damit ist auch schon gesetzt, wer sich hier hauptsächlich einfindet. Und im Grunde kann man anhand der Teilnehmer auch gut die Marktmacht der jeweiligen Marktteilnehmer beobachten. Hauptsächlich handelt es sich hierbei um Entwickler von Apps für iPhone und iPad, an zweiter Stelle kommt die Android-Fraktion und unter ferner liefen dann solche Leute wie ich, die auch den Microsoft Markt bedienen können.

So wundert es auch nicht, dass es inhaltlich mehrheitlich um Themen ging, die sich rund um iPhone oder Android-Entwicklung drehen. Aber auch für mich hat sich heute das ein oder andere Thema gefunden, bei dem ich gern mitdiskutiert habe: So habe ich mich bei folgenden Sessions eingebracht:

  • Chancen und Risiken von Kooperationsmarketing
  • Ausblicke auf die Zukunft mobiler Endgeräte
  • Möglichkeiten von CSS3 zur Optimierung von Webseiten auf mobile Endgeräte

Leider musste ich nach dem Mittagessen das Barcamp verlassen. Trotzdem waren die drei Sessions am Morgen eine Bereicherung und ich kann es jedem nur empfehlen, der mit der Entwicklung auf oder für mobile Endgeräte zu tun hat und diskutieren oder lernen möchte oder auch nur seinen Horizont etwas erweitern möchte.

Rückblick auf das mobilecamp Dresden

14.05.2011 17:06:00 | Martin Hey

Es ist zwar noch nicht vorbei, aber ich werde den Rest des Tages und auch morgen leider nicht mehr am mobilecamp Dresden teilnehmen können. Trotzdem möchte ich über den heutigen Tag ein paar Worte verlieren.

Heute und morgen findet hier in Dresden in der Informatikfakultät das mobilecamp Dresden statt. Der Name ist Programm, handelt es sich hierbei doch um ein Barcamp mit der thematischen Ausrichtung auf die Entwicklung mobiler Anwendungen. Ich war nun schon auf verschiedenen Open Spaces, von daher ist mir das Konzept der Unkonferenz nicht ungeläufig; jedoch ist mir nach wie vor der Unterschied zwischen Barcamp und Open Space nicht klar, sind sie in der Praxis in meiner Erfahrung doch gleich. Aber das soll nicht Thema dieses Posts sein.

Inhaltlich geht es um mobile Entwicklung und damit ist auch schon gesetzt, wer sich hier hauptsächlich einfindet. Und im Grunde kann man anhand der Teilnehmer auch gut die Marktmacht der jeweiligen Marktteilnehmer beobachten. Hauptsächlich handelt es sich hierbei um Entwickler von Apps für iPhone und iPad, an zweiter Stelle kommt die Android-Fraktion und unter ferner liefen dann solche Leute wie ich, die auch den Microsoft Markt bedienen können.

So wundert es auch nicht, dass es inhaltlich mehrheitlich um Themen ging, die sich rund um iPhone oder Android-Entwicklung drehen. Aber auch für mich hat sich heute das ein oder andere Thema gefunden, bei dem ich gern mitdiskutiert habe: So habe ich mich bei folgenden Sessions eingebracht:
  • Chancen und Risiken von Kooperationsmarketing
  • Ausblicke auf die Zukunft mobiler Endgeräte
  • Möglichkeiten von CSS3 zur Optimierung von Webseiten auf mobile Endgeräte
Leider musste ich nach dem Mittagessen das Barcamp verlassen. Trotzdem waren die drei Sessions am Morgen eine Bereicherung und ich kann es jedem nur empfehlen, der mit der Entwicklung auf oder für mobile Endgeräte zu tun hat und diskutieren oder lernen möchte oder auch nur seinen Horizont etwas erweitern möchte.

Rückblick auf die Dotnet Cologne 2011

14.05.2011 16:13:00 | Martin Hey

Inzwischen ist es gut eine Woche her, seit ich und viele andere aus der .NET-Community nach Köln gepilgert sind, um an der diesjährigen Dotnet Cologne teilzunehmen. Ich hatte im letzten Jahr das erste Mal das Vergnügen und fand diese Veranstaltung so gut, dass ich auch dieses Jahr unbedingt mit dabei sein wollte. Was mich besonders an dieser Konferenz begeistert ist einerseits, dass sie nicht so sehr kommerzialisiert ist, wie es andere Konferenzen sind und trotzdem den anderen Konferenzen inhaltlich in nichts nachstehen. Das liegt daran, dass der Grundgedanke dazu aus der .NET Community
geboren wurde - namentlich von den .NET Usergroups Köln und Bonn. Ich hoffe, dass das auch noch eine Weile so bleiben wird.

Nun aber zum eigentlichen Tag: Der diesjährige Veranstaltungsort im Media Park war leicht mit der S-Bahn zu erreichen und nach einer Registrierung konnte das Netzwerken bei einem kleinen Frühstück auch schon beginnen. Ich habe mich sehr gefreut, das ein oder andere bekannte Gesicht wiederzusehen und auch Leute mal persönlich kennenzuloernen, die ich bisher nur virtuell kannte. Ein Blick auf die Agenda zeigte, dass für den Tag nur 5 Sessions geplant waren mit großen Pausen von 30 Minuten und aufwärts. Was für mich auf den ersten Blick etwas schade war, weil da in Summe locker noch eine weitere Session Platz gehabt hätte, zeigte sich doch als sehr sinnvoll, denn so blieb gut Zeit für Sessions, die etwas überzogen bzw. auch für Gespräche untereinander.

Wie sah nun mein persönlicher Sessionplan aus? Den Beginn machte Ilker, der in 60 Minuten in Agile Architekturen eintauchte. Er zeigte anhand von zwei Architekturkonzepten, die für sich selbst in Anspruch nehmen, agil zu sein, ob diese die Kriterien von Agilität unterstützen. Ich denke, über das Thema hätte man gut und gerne noch eine Stunde länger philosophieren können, auch weil ein 10-Minuten-Überflug über eine Architektur nicht erlaubt, diese in Gänze zu erfassen und einzuschätzen. In diesem Zusammenhang fand ich auch schade, dass es dieses Mal keine Abendveranstaltung gab, ich hätte mich hier gern mit ihm noch länger drüber unterhalten.

Nach einer kurzen Pause ging es für mich dann weiter mit Daniel, der eine Session zum Thema REST gab. Ich habe mir erhofft, etwas genaueres über die Microsoft Web API zu erfahren - und meine Hoffnung wurde letzenendes auch erfüllt. Mit einer sehr unterhaltsamen Präsentation (so habe ich etwas über Forrest Gump und auch über Dory aus Finding Nemo gelernt), gab Daniel einen Überblick über den State of the art. Ich persönlich hätte diese Session nicht ganz auf Level 400 eingeordnet, aber dieses Empfinden kann sowohl an meinen bisherigen Erfahrungen als auch an der Art von Daniels Didaktik liegen - vielleicht eine Kombination aus beidem.

Nach einem gefährlichen Mittagessen, und der Lunch-Session ging es für mich dann zur LINQ-Session mit Bart de Smet. Thematisch ging es hier zunächst darum, LINQ beizubringen, schon zur Designzeit nur die möglichen Operatoren anzuzeigen. Dann ging es weiter mit Serialisierung von Expression Trees, einem Ausflug in die Reactive Extensions und einen Solver für Sudokus auf LINQ-Basis. Auch wenn es inhaltlich an der LINQ-Front nicht allzu viel Neues gibt, so hat es mich sehr gefreut, ihn mal live zu sehen und wer ihn coden sieht, der möchte gern im Anschluss alles mit LINQ machen.

Zum Schluss habe ich mir dann noch die Einführung in MEF von Rainer angeschaut. Auch wenn MEF letztenendes in der Anwendung recht simpel ist und ich mich im vorab gefragt habe, wie man da eine Stunde drüber reden kann, so hat er den Inhalt doch sehr unterhaltsam, enthusiastisch und mit vielen Beispielen rübergebracht. Falls jemand die Samples sucht, auf die er bei seiner Session verwiesen hat: diese sind in seinem englischsprachigen Blog verfügbar.

Zusammengefasst: Ich bin nach wie vor von dem Konzept der Community-Konferenzen überzeugt und ich hoffe, dass auch im kommenden Jahr die Dotnet Cologne eine Fortsetzung findet. Macht weiter so, ich wär gern wieder mit dabei.

Rückblick auf die Dotnet Cologne 2011

14.05.2011 16:13:00 | Martin Hey

Inzwischen ist es gut eine Woche her, seit ich und viele andere aus der .NET-Community nach Köln gepilgert sind, um an der diesjährigen Dotnet Cologne teilzunehmen. Ich hatte im letzten Jahr das erste Mal das Vergnügen und fand diese Veranstaltung so gut, dass ich auch dieses Jahr unbedingt mit dabei sein wollte. Was mich besonders an dieser Konferenz begeistert ist einerseits, dass sie nicht so sehr kommerzialisiert ist, wie es andere Konferenzen sind und trotzdem den anderen Konferenzen inhaltlich in nichts nachstehen. Das liegt daran, dass der Grundgedanke dazu aus der .NET Community geboren wurde - namentlich von den .NET Usergroups Köln und Bonn. Ich hoffe, dass das auch noch eine Weile so bleiben wird.

Nun aber zum eigentlichen Tag: Der diesjährige Veranstaltungsort im Media Park war leicht mit der S-Bahn zu erreichen und nach einer Registrierung konnte das Netzwerken bei einem kleinen Frühstück auch schon beginnen. Ich habe mich sehr gefreut, das ein oder andere bekannte Gesicht wiederzusehen und auch Leute mal persönlich kennenzuloernen, die ich bisher nur virtuell kannte. Ein Blick auf die Agenda zeigte, dass für den Tag nur 5 Sessions geplant waren mit großen Pausen von 30 Minuten und aufwärts. Was für mich auf den ersten Blick etwas schade war, weil da in Summe locker noch eine weitere Session Platz gehabt hätte, zeigte sich doch als sehr sinnvoll, denn so blieb gut Zeit für Sessions, die etwas überzogen bzw. auch für Gespräche untereinander.

Wie sah nun mein persönlicher Sessionplan aus? Den Beginn machte Ilker, der in 60 Minuten in Agile Architekturen eintauchte. Er zeigte anhand von zwei Architekturkonzepten, die für sich selbst in Anspruch nehmen, agil zu sein, ob diese die Kriterien von Agilität unterstützen. Ich denke, über das Thema hätte man gut und gerne noch eine Stunde länger philosophieren können, auch weil ein 10-Minuten-Überflug über eine Architektur nicht erlaubt, diese in Gänze zu erfassen und einzuschätzen. In diesem Zusammenhang fand ich auch schade, dass es dieses Mal keine Abendveranstaltung gab, ich hätte mich hier gern mit ihm noch länger drüber unterhalten.

Nach einer kurzen Pause ging es für mich dann weiter mit Daniel, der eine Session zum Thema REST gab. Ich habe mir erhofft, etwas genaueres über die Microsoft Web API zu erfahren - und meine Hoffnung wurde letzenendes auch erfüllt. Mit einer sehr unterhaltsamen Präsentation (so habe ich etwas über Forrest Gump und auch über Dory aus Finding Nemo gelernt), gab Daniel einen Überblick über den State of the art. Ich persönlich hätte diese Session nicht ganz auf Level 400 eingeordnet, aber dieses Empfinden kann sowohl an meinen bisherigen Erfahrungen als auch an der Art von Daniels Didaktik liegen - vielleicht eine Kombination aus beidem.

Nach einem gefährlichen Mittagessen, und der Lunch-Session ging es für mich dann zur LINQ-Session mit Bart de Smet. Thematisch ging es hier zunächst darum, LINQ beizubringen, schon zur Designzeit nur die möglichen Operatoren anzuzeigen. Dann ging es weiter mit Serialisierung von Expression Trees, einem Ausflug in die Reactive Extensions und einen Solver für Sudokus auf LINQ-Basis. Auch wenn es inhaltlich an der LINQ-Front nicht allzu viel Neues gibt, so hat es mich sehr gefreut, ihn mal live zu sehen und wer ihn coden sieht, der möchte gern im Anschluss alles mit LINQ machen.

Zum Schluss habe ich mir dann noch die Einführung in MEF von Rainer angeschaut. Auch wenn MEF letztenendes in der Anwendung recht simpel ist und ich mich im vorab gefragt habe, wie man da eine Stunde drüber reden kann, so hat er den Inhalt doch sehr unterhaltsam, enthusiastisch und mit vielen Beispielen rübergebracht. Falls jemand die Samples sucht, auf die er bei seiner Session verwiesen hat: diese sind in seinem englischsprachigen Blog verfügbar.

Zusammengefasst: Ich bin nach wie vor von dem Konzept der Community-Konferenzen überzeugt und ich hoffe, dass auch im kommenden Jahr die Dotnet Cologne eine Fortsetzung findet. Macht weiter so, ich wär gern wieder mit dabei.

.NET User Group Karlsruhe: Produce Cleaner Code with Aspect-Oriented Programming (AOP)

11.05.2011 12:39:00 | Alexander Zeitler

.NET Usergroup Karlsruhe Logo

Am 19.05.2011 um 18:00 Uhr findet das nächste Treffen der .NET Usergroup Karlsruhe (XING-Gruppe der .NET Usergroup Karlsruhe) statt.

Thema

Produce Cleaner Code with Aspect-Oriented Programming (AOP)

Details zum Thema

Rather than giving us a nice separation of concerns (assembly > namespace > class > method), there are times when OOP forces us to write crap – scattering, tangling and coupling our code.
Gael Fraiteur, SharpCrafters Founder and Principal Engineer, will speak about the problem with conventional programming, give a gentle introduction to AOP (.NET), show how it works, and why you should be using it to eliminate crap code from your life.

Über den Sprecher

Gael Fraiteur ist Gründer und Projektleiter von PostSharp, einem Framework für aspektorientierte Programmierung unter .NET. Er ist Microsoft Certified Solution Developer für .NET und spricht auf internationalen Konferenzen. Sie erreichen ihn über http://www.postsharp.org/forum.

Teilnahme

Bitte meldet Euch wieder via XING an, die Location ist wieder DJK-Ost:

DJK-Ost
Friedrichstaler Allee 52
76131 Karlsruhe

Anfahrt: http://www.djk-ost.de/anfahrt.htm

DotNetKicks-DE Image

ASP.NET MVC 3 Tools Update in 9 weiteren Sprachen verfügbar

11.05.2011 10:37:00 | Sascha Dittmann

Mitte April hatte ich von dem neuen ASP.NET MVC 3 Tools Update berichtet.
Diese Update war vorerst nur in Englisch verfügbar.
Seit gestern gibt es dieses Update in 9 weiteren Sprachen:

Weitere Informationen:

Windows Azure Gewinnspiel verlängert

11.05.2011 09:40:00 | Sascha Dittmann

Wie ich schon Ende März gepostet hatte, veranstaltet Microsoft Deutschland wieder einmal ein Gewinnspiel zum Thema Windows Azure unter dem Namen "Get in the cloud with Windows Azure".

Gestern habe ich eine Email vom Windows Azure-Team erhalten, in der die Verlängerung des Gewinnspiels, bis zum 17.06.2011, bekannt gegeben wurde.

Auszug aus der Email:
... dessen Laufzeit wir aufgrund des überaus großen Interesses bis zum 17. Juni 2011 verlängern.
Das bedeutet, dass Sie einen weiteren Monat Zeit haben, Freunden von unserem Gewinnspiel zu erzählen ...

Wer also bislang noch nicht mitgemacht hat, sollte dies zügig tun, da es mal wieder tolle Preise zu gewinnen gibt.

Link zum Gewinnspiel: Get in the cloud with Windows Azure

Mittlerweile gibt es auch Promotion Codes, die einen Testzugriff über 90 Tage gewähren.
Dazu einfach auf die Windows Azure Pass Seite gehen, Land auswählen und als Promotion Code COMMUNITY eingeben.

MSDN Solve: CodeClips ab sofort zum Download

10.05.2011 15:02:03 | Kay Giza

MSDN Solve - ab sofort haben wir die Möglichkeit geschaffen, mit einem einfachen Klick sich die über 500 Videos bzw. CodeClips herunterzuladen. Der Download ist natürlich kostenfrei und ohne Registrierung oder Ähnlichem möglich. Wie es genau funktioniert verrät dieser Blog-Post auf Giza-Blog.de... [... mehr]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  Giza-Blog.de Facebook-Page | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Mai Treffen der .NET UserGroup Saar–Produktiv–Produktiver–ReSharper

10.05.2011 12:28:47 | Thorsten Hans

Am 17.05.2011 findet ab 18:00 Uhr das Mai Treffen der .NET UserGroup Saar statt.

JetBrains ReSharper ist das wohl bekannteste VisualStudio AddIn dass es auf dem Markt gibt. Im Rahmen des Mai Treffens der .NET UserGroup Saar wird Thorsten Hans das AddIn vorstellen und zeigen, wie man die eigene Produktivität enorm erhöhen kann.
Sie sehen wie man schnell und einfach Refactorings macht, gekonnt in VisualStudio Solutions navigiert und die unterschiedlichen Features von ReSharper im täglichen Leben als Softwareentwickler einsetzen kann.

Im Anschluss an den Vortrag sind alle Teilnehmer bei Snacks und Drinks zu Networking und Erfahrungsaustausch eingeladen.

Sprecher:

Thorsten Hans (http://www.dotnet-rocks.de) arbeitet als Teamlead für .NET und SharePoint Development bei der DataOne GmbH in Saarbrücken. Dort beschäftigt er sich hauptsächlich mit dem Design und der Entwicklung von individuellen Lösungen auf Basis von SharePoint und der CLR. Des Weiteren beschäftigt er sich intensiv mit TFS, MSBuild und dynamischen Sprachen wie IronRuby. Er ist mehrfach als MCPD und MCTS zertifiziert. 2011 wurde er von Microsoft zum Most Valuable Professional (MVP) für SharePoint ernannt. Zusätzlich leitet und betreut Thorsten die .NET UserGroup Saar.

Location:

Data One GmbH
Nell-Breuning Allee 8
66115 Saarbrücken

 

DotNetKicks-DE Image

Stimmen zur dotnet Cologne 2011

10.05.2011 11:07:00 | Stefan Lange

Am 06.05.2011 fand im KOMED im MediaPark in Köln die dritte dotnet Cologne statt.

An dieser Stelle möchte ich zunächst noch einmal allen Sponsoren und Sprechern ganz herzlich danken – ohne Euch wäre die Veranstaltung nicht möglich gewesen!

Wie im letzten Jahr hier eine Liste mit Links und Zitaten im Überblick:

Roland Weigelt: Das war die dotnet Cologne 2011

Thomas Mentzel: dotnet Cologne 2011 Tagebuch

Kay Giza: dotnet Cologne 2011: Rueckblick und Folien meiner Session: MSDN unplugged

Ilker Cetinkaya: DotNet Cologne 2011

Oliver Ibelsäuser: Live-Berichterstattung von der Dotnet Cologne 2011 – Teil 1, Teil 2 und Teil 3

Björn Meyer: dotnet Cologne 2011 - Some impressions und dotnet Cologne 2011 wrap-up video - TX Text Control

Thomas Schissler: Vortragsfolien zu meinen Vorträgen auf der dotnet Cologne 2011

Peter Nowak: Dotnet Cologne 2011

Christina Hirth: dotnet-cologne: veni-vidi-vici!

Martin Hey: Rückblick auf die Dotnet Cologne 2011

Gordon Breuer: Respecto Colonius!

Monika Lischke: dotnet Cologne

 

Rainer Stropek schreibt in einer Mail:

… Sowohl als Speaker als auch als Sponsor war die Veranstaltung ein voller Erfolg. Ich konnte außergewöhnlich gute Gespräche unser Produkt betreffend führen, die sich bereits heute (einen Arbeitstag nach der Veranstaltung) in konkreten Anmeldezahlen zu time cockpit niederschlagen. Als Sprecher muss ich sagen, dass die Teilnehmer der dotnet Cologne sich durch überdurchschnittliches Wissen und Engagement auszeichnen – es macht einfach sehr großen Spaß, dabei zu sein!

 

Einfacher Einstieg in Visual Studio Test Professional 2010 mit Videos und virtuellen Labs ganz ohne Download

10.05.2011 10:17:05 | Christian Binder

Um sich mit Visual Studio Test Professional 2010 vertraut zu machen, gibt es nun neue “How Do I” Videos und eine VM mit Labs. Auf diese Weise kann man sehr schnell und einfach seine spezifischen Szenarien validieren. Wirklich gut ist, dass man die Hands-On-Labs live in einer online VM machen kann. Es ist also kein Download einer VM notwendig. Und so geht es:

http://www.microsoft.com/visualstudio/en-us/try/test-professional-2010-tour/dive-deeper

image

Lab wählen:

image

Lab starten:

image

kurz warten:

image

Und los geht’s, alles Remote und im Browser:

image

Chris

Schnell und einfach zum VPN via Windows Azure Connect

10.05.2011 09:54:00 | Sascha Dittmann

Wenn man im Internet nach VPN und Windows Azure Connect sucht, wird man schnell fündig.
Es wird immer wieder angepriesen, wie schnell und einfach man mit Windows Azure Connect ein VPN erstellen kann, sodass lokale Arbeitsstationen, lokale Server und Cloud-Server-Instanzen miteinander kommunizieren können.

Diesen - noch als CTP verfügbaren - Dienst, habe ich einmal ausprobiert und berichte in diesem Post von meinen Erfolgen und Rückschlägen.

Mein Versuchsaufbau

In meinen Tests verwende ich 3 Arbeitsstationen, 2 lokale Server und eine Web Rolle (2 Instanzen).
Die Kommunikation soll von den Arbeitsstationen zu den Servern, sowie zwischen den Servern, möglich sein. Eine Kommunikation zwischen den Arbeitsstationen soll nicht möglich sein.

Folgende Systeme kamen zum Einsatz:

  • Laptop mit Windows XP
  • Laptop mit Windows 7 64bit
  • Desktop mit Windows 7 64bit
  • Server mit Windows Server 2008 R2 64bit (Domaincontroller)
  • Server mit Windows Server 2008 64bit und SQL Server 2008 64bit Express

 

Installation der lokalen Endpunkte

Nachdem man sich beim Windows Azure Portal angemeldet hat, findet man unter den Modulen (links unten) den Menüpunkt Virtual Network.

Windows Azure Portal Module

Im Virtual Network Modul kann man dann u.a. den Link zum Installer für die Endpunkte in die Zwischenablage kopieren lassen.

Windows Azure Connect Menü

Windows Azure - Install Local Endpoint

Mit diesem Link installierte ich als erstes die Endpunkte auf den beiden lokalen Servern.
Das Ganze verlief schnell und ohne Probleme.
Nach kurzer Zeit erschien auch das Icon in der Notification Area, welches eine fehlerfreie Verbindung zu Windows Azure Connect meldete.

Die Installation beinhaltete einen lokalen Windows Dienst, einen zusätzlichen Netzwerkadapter und eine schlanke Benutzeroberfläche hinter dem Icon in der Notification Area.

Dann ging es an die Laptops ...

Die Installation auf Windows XP schlug, wie vermutet, fehl.

Windows Azure - Install Local Endpoint - Windows XP Fehlermeldung

Ein Blick in die Dokumentation bestätigte meine Vermutung. Die Verwendung von Windows Azure Connect ist erst ab Vista SP1 möglich. Allerdings ist die Fehlermeldung etwas irreführend.

Die Installation auf dem Laptop mit Windows 7 verlief auf der ersten Blick ohne Probleme.
Bei genauerem Hinsehen, bekam der lokale "Windows Azure Connect Endpoint" Dienst allerdings keine Verbindung.

  • Die mitgelieferte Diagnosesoftware konnte keine Fehler finden
  • Der Blick ins Log verzeichnete allerdings einen Zertifikatfehler
  • Die Suche im Internet verriet den Übeltäter:
    Windows Azure Connect verträgt sich nicht mit der Firewall der Symantec Endpoint Protection.
    Windows Azure Connect verwendet den Port 443.
    Dieser wird vom installierten Azure-Connect-Netzwerkadapter als Relay-Endpunkt von Innen nach Außen geöffnet.
    Das sollte doch den meisten Firewalls kein Problem darstellen, oder!?
    Nach ein paar Stunden erfolgloser Konfigurationsarbeit an der Symantec Firewall (auf Applikations- sowie auf Portebene) und einigen Frustpausen, habe ich die SEP deinstalliert und durch Alternativprodukte ersetzt.
    Somit konnte ich eine fehlerfreie Verbindung herstellen.

Mit diesem Wissen verlief die Installation auf dem Windows 7 Desktop ohne Probleme.

 

Installation einer Web Rolle

Als nächstes habe ich ein Windows Azure Projekt mit einer ASP.NET Web Forms erstellt.
Diese soll auf den lokalen SQL Server zugreifen und die dort erhaltenen Daten anzeigen.

Um die Web Rolle mit Windows Azure Connect zu verbinden, benötigt man einen Activation Token.
Dieser kann über das Windows Azure Portal im Modul Virtual Network in die Zwischenablage kopiert werden.

Windows Azure Connect Menü

Windows Azure Connect - Get Activation Token

Anschließend kann dieser Token in Windows Azure Projekten benutzt werden, um Rollen mit dem VPN zu verbinden. Hierzu konfiguriert man das Virtual Network Tab in den Rolleneinstellungen.

Windows Azure Connect - Visual Studio Settings

Anschließend habe das Projekt in der Windows Azure Plattform installiert und gestartet.

 

Konfiguration des Virtuellen Netzwerks

Um meine gewünschten Ziele (siehe "Mein Versuchsaufbau") umzusetzen, benötige ich zwei Endpunktgruppen.
Diese können über das Windows Azure Portal im Modul Virtual Network erstellt, geändert und gelöscht werden.

Windows Azure Connect Menü

Die erste Gruppe wird für die Arbeitsstationen benötigt.
Nach der Vergabe eines Gruppennamens, werden die beiden Arbeitsstationen mittels Add Button in die Liste der Connect From Endpunkte hinzugefügt, um sie zum Mitglied dieser Gruppe zu machen.
Da eine Kommunikation untereinander nicht erwünscht ist, wird die Interconnected Checkbox nicht angehakt.

Windows Azure Connect - Erstelle Gruppe - Arbeitsstationen

Die zweite Gruppe wird für die Server benötigt.
Nach der Vergabe eines Gruppennamens, werden die beiden Server mittels Add Button in die Liste der Connect From Endpunkte hinzugefügt, um sie zum Mitglied dieser Gruppe zu machen.
Im Bereich Connect To kann die neue Gruppe mit Azure Rollen und / oder anderen Endpunktgruppen verbunden werden. Hier werden die "Arbeitsstationen" Endpunktgruppe, sowie die "WebRole1" Azure Rolle, hinzugefügt.
Da eine Kommunikation untereinander erwünscht ist, wird die Interconnected Checkbox angehakt.

Windows Azure Connect - Erstelle Gruppe - Server

In der Gesamtübersicht sieht das Ganze dann wie folgt aus:

Windows Azure Connect - Übersicht Gruppen

 

Tests

Nachdem alles aufgesetzt war, startete ich mit einigen Tests außerhalb meines Netzwerks:

  • Mein erster Test war ein einfacher Ping vom frisch gestarteten Laptop zum Domaincontroller.
    Dieser schlug vorerst fehl...
    Ein Blick in die Anleitung ergab, dass der Aufbau der Verbindung zu Windows Azure Connect ca. 2-5 Minuten benötigt.
    Nach dieser Wartezeit konnte der Ping erfolgreich durchgeführt werden.
  • Auch eine RDP Verbindung vom Laptop zum Domaincontroller war ohne Probleme möglich.
  • Eine Verbindung vom Laptop zum Desktop war, wie gewünscht, nicht möglich.
  • Die Azure Serverinstanzen, der WebRole1, sollen eine Tabelle des lokalen SQL Servers anzeigen.
    Auch das funktionierte einwandfrei.

Zurück im eigenen Netzwerk, musste ich feststellen, dass die lokalen Server nicht mehr direkt angesprochen werden, sondern immer Windows Azure Connect verwendet wird. Deshalb habe ich den lokalen "Windows Azure Connect Endpoint" Dienst der Arbeitsstationen auf Manuell umgestellt und starte ihn nur bei Bedarf.

Ein weiteres Problem stellte ich in einem Netzwerk mit Proxy-Servern fest.
Hier mussten die Proxyeinstellungen für den LocalSystem Benutzer angepasst werden.
Dies kann über das Kommandozeilentool BITSAdmin durchgeführt werden:

bitsadmin /util /setieproxy localsystem MANUAL_PROXY proxysrv:8080 ";*.consoto.com"

 

Fazit

Auch wenn meine bisherigen Erfahrungen mit Windows Azure Connect nicht vollständig ohne Probleme verlaufen sind, bin ich mit diesem Windows Azure Plattform Dienst sehr zufrieden. Man darf auch nicht vergessen, dass es sich derzeit noch um eine CTP Version handelt. Ein VPN kann schnell und einfach aufgebaut werden und die Geschwindigkeit ist im annehmbaren Bereich.

Das war die dotnet Cologne 2011

09.05.2011 22:49:50 | Roland Weigelt

327 Teilnehmer, 20 Sprecher und 28 Sponsorenvertreter – und alle sehr zufrieden, mehr kann man sich als Veranstalter (das sind Albert Weinert, Stefan Lange, Melanie Eibl und ich) nicht wünschen.

Die dotnet Cologne 2011 war rundum ein großer Erfolg, das Feedback in Gesprächen nach der Konferenz und auch in Mails von Teilnehmern und Sponsoren war einhellig positiv.

Hier nun ein paar persönliche Eindrücke:

Die Location

Das Komed im Mediapark Köln mit seiner guten Erreichbarkeit, genügend Parkplätzen sowie moderner Ausstattung hat sich als gute Wahl herausgestellt. Die Zweiteilung hat anfangs hier und da Probleme bereitet und eine große Zahl Wegweiser verbraucht. Vielleicht haben auch noch ein paar gefehlt, aber im Endeffekt kamen die Teilnehmer gut zurecht.

Das sehr hilfsbereite und professionell arbeitende Komed-Personal, das die Veranstaltungstechnik jederzeit im Griff hatte, sorgte auch dafür dass mein persönlicher Stresslevel den Tag über deutlich geringer ausfiel und ich tatsächlich die Konferenz genießen konnte.

Die Vorträge

Bevor ich die Vorträge besuchen konnte, musste ich selbst noch meinen eigenen halten: “UI/UX für Entwickler und andere Nicht-Designer” kam auch in der – gegenüber der in User Group gehaltenen – gekürzten Version als Konferenzsession gut an. Dieser Auftritt war gleichzeitig die Generalprobe für die .NET DevCon nächsten Monat (Infos zu diesem und weiteren Terminen hier).

Als nächstes schaute ich bei Stefan Lange und seinem Vortrag zu Silverlight 5 vorbei. Unter anderem auch, weil Stefan beim Sprecheressen am Vorabend nebenbei meinte “Ich habe übrigens Deinen Blog-Eintrag zum Thema Live Coding gelesenWinking smile. Obwohl ich ja schon auf der MIX11 SL5-Vorträge gehört hatte, muss ich sagen dass der Vortrag wegen seiner guten Aufbereitung und Präsentation wirklich sehr interessant und eine gute Vertiefung war.

Nach der Mittagspause folgte der LINQ-Vortrag von Bart De Smet, der wohl alle von den Socken gehauen hat. Nicht wenige haben sich danach wohl spontan umentschieden, denn der anschließende Rx-Vortrag war brechend voll, obwohl er in der Teilnehmerbefragung vor der Konferenz zunächst auf nicht allzu großes Interesse gestoßen war. Ich selbst kam einen Tick zu spät (noch schnell einen Raumtausch in die Wege leiten) und fand nur noch einen Stehplatz – kein zu großes Opfer für einen tollen Vortrag.

Nach einem letzten Vortrag über TPL und PLINQ stand dann auch schon die Verlosung an, bei der sich so mancher Teilnehmer (und eine statistisch gesehen überproportional große Zahl von Teilnehmerinnen) über Gewinne freuen durften.

Und schon war die Konferenz vorbei, schneller als erwartet.

Mit einem Abendessen unter freiem Himmel im nahegelegenen Kandinsky und einem ausgedehnten und sehr netten Gespräch mit Bart De Smet (einfach nur super, der Mann) fand der Tag schließlich seinen Abschluss.

Die Organisation

Nach den dotnet Cologne Konferenzen in den Jahren 2009 und 2010 gab es von allen Seiten viel Lob. Gleichzeitig fragten wir nach ehrlichem und kritischen Feedback, das wir auf den anynomen Feedback-Bögen auch bekommen haben.

Das Feedback, zusammen mit unseren eigenen selbstkritischen Beobachtungen, führte zu einer Liste von Punkten, von denen wir dieses Jahr nahezu alle angehen konnten – zumindest innerhalb der uns zur Verfügung stehenden Möglichkeiten, denn bei einer Veranstaltung in dieser Größenordnung muss alles in ein knappes (und auch nicht immer leicht zu kalkulierendes) Geld- und Zeitbudget passen.

Danksagung

An dieser Stelle möchte ich mich ganz herzlich bedanken:

  • bei Stefan Lange, Albert Weinert und Melanie Eibl für die gute Zusammenarbeit. Die letzten vier Monate waren für alle Beteiligten nicht einfach, schließlich organisieren wir die Konferenz ja nicht hauptberuflich sondern haben tagsüber noch eine “kleine Nebenbeschäftigung”.
  • bei den Sprechern, die ohne Honorar (alleine gegen Erstattung der Reisekosten) aufgetreten sind.
  • bei allen Helfern vor Ort.
  • bei den Sponsoren, die mit ihrer finanziellen Unterstützung diesen Tag überhaupt erst möglich gemacht haben.
  • und bei allen Teilnehmern – schön dass ihr da wart!

Just Released: thinktecture UIAnnotations

09.05.2011 20:32:00 | Jörg Neumann

Nach mehr als einem Jahr bin ich nun endlich mit meinem UIAnnotations-Projekt fertig!
thinktecture UIAnnotations
With thinktecture UIAnnotations you can extend your UI with additional functionality via Adorners and Behaviors. All parts are assignable via markup, which is helpful in MVVM scenarios and promotes the developer/designer interaction.
With thinktecture UIAnnotations you can declarative attach visual Adorners and Expression Blend Behaviors to your user interfaces, including smart tags, editor toolbars and visual state markers for required fields, edit states and more. It also can automatically attach adorners to elements while reflecting the Data Annotations of the associated data sources. For a better MVVM support it offers a generic command behavior that is assignable to every event of a given element. thinktecture UIAnnotations is available for WPF and Silverlight (comming soon).
thinktecture UIAnnotations in brief:
  • 10+ useful adorners and 5+ Expression Blend Behaviors.
  • automatic assignment of adorners via Data Annotations.
  • a custom adorner model for silverlight (comming soon).
  • GenericAdorner allows to attach every element as an adorner.
  • AdornerBehaviorFactory that can be used to wrap every adorner as an Expression Blend Behavior.
  • BehaviorFactory allows the assignment of Expression Blend Behaviors via styles.
  • with Command Behavior you can map every control event to a command.
Und da ein Bild mehr sagt als tausend Worte:
Showcase
Die Details folgen in späteren Posts. Stay tuned!

Vorsicht bei der Benamung der Windows Azure Storage Accounts

09.05.2011 18:51:00 | Thorsten Hans

windowsAzureLogoWenn Ihr bei Windows Azure einen neuen Storage Account anlegt, solltet Ihr diesen nicht gleich der Subscription nennen. Zwar funktioniert es und man kann dann auch über das Webinterfaces neuen Packages deployen.

 

Allerdings funktioniert unter dieser Konstellation das Deployment von Azure Projekten aus Visual Studio heraus nicht mehr.

 

DotNetKicks-DE Image

Team Foundation Server – Microsoft is Hiring

09.05.2011 16:02:14 | Christian Binder

Microsoft Deutschland sucht aktuell für das Themengebiet Testing/TFS Leute mit Erfahrung, die Lust darauf haben in unserem Premier Services Delivery Team mitzuarbeiten.

Premier Services for Developers bei Microsoft berät und unterstützt Kunden professionell rund um alle Development Fragestellungen. Ziel ist es dabei  die Kunden-Softwarenentwicklung dabei zu unterstützen effizient, und mit hoher Qualität auf der Microsoft Plattform zu entwickeln. Das Thema Testing spielt dabei eine zentrale Rolle und der TFS als zughörige Plattform nimmt einen immer wichtigeren Stellenwert bei unseren Kunden ein, daher suchen wir  Unterstützung in diesem Umfeld.

Hier findet ihr die konkrete Stellenausschreibung: https://careers.microsoft.com/JobDetails.aspx?ss=&pg=1&so=&rw=6&jid=30956&jlang=EN

Sharepoint 2010 Custom Masterpage

09.05.2011 16:00:00 | Timo Rehl

Sharepoint 2010 bietet nun endlich ein recht sauberes Design an, was Layout und Inhalt angeht. So ist es möglich über die Masterpage ein grundlegendes Layout für Sharepoint Seiten zu hinterlegen. Wie das geht, das zeigt nun folgende Anleitung.

Schritt 1 - Duplizieren der vorhandenen Masterpage

Die Masterpage dupliziert man am Besten über den Sharepoint Designer. Hierzu ruft man mit einem entsprechendem Designer Benutzer über die Startseite ->"Site Actions"->Sharepoint Designer auf.

Danach wählt man die Einstellungsmöglichkeit "Master Pages" und bekommt 3 bereits vorhandene Masterpages angezeigt:

Für Shareppoint 2010 ist die Masterpage v4.master relevant (Ausnahme: wenn die Kompatibilitätsfunktion SP2007 genutzt werden soll, dann wäre das der default.master). Es empfiehlt sich die Masterpage zu duplizieren, um so wenig Einfluss auf den SP2010 Standard zu nehmen. Das Duplizieren erreicht man durch Markieren des Originals, dann durch Auswahl von Copy (über das Kontextmenü oder über die Ribbon Leiste "Clipboard") und anschließendem Paste (analog zu Copy auffindbar). Es wird eine Kopie erstellt, die nun noch umbenannt werden kann (Kommando Rename über das Kontextmenü oder über die Ribbon Leiste "Edit").

Wo werden nun die Dateien abgelegt? -> Prinzipiell ist es nicht wichtig, ich komme im "Schritt 3 - Einbinden der neuen Masterpage" darauf. Es gibt hier 2 Unterscheidungen. Die Templates, die genutzt werden, sobald ein neues Sharepoint Portal angelegt wird befinden sich unter Windows:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\GLOBAL (englisches Betriebssystem!). Die duplizierte Masterpage befindet sich in der Sharepoint Datenbank (nicht auf Festplatte!).

Schritt 2 - Editieren der neuen Masterpage

Anschließend ist es möglich die neue Masterpage durch Auswahl des Kommandos EditFile (Ribbon Leiste "Edit") oder EditFile in advanced mode (Kontextmenü) zu editieren. Der "advanced mode" bedeutet hier lediglich, dass Sharepoint Standardeinstellungen im HTML Header ebenfalls editierbar sind. Ohne "advanced mode" kann man diese Stellen nicht verändern. Mein Ziel war es jQuery fest in allen Seiten verfügbar zu machen. Hierfür bietet SP2010 eine Möglichkeit über SciptLink das JavaScript einzubinden. Die genauen Details zum Thema ScriptLink werde ich nun hier nicht erläutern, Ziel hier ist es eine modifizierte Masterpage zu erzeugen.

Schritt 3 - Einbinden der Masterpage in Sharepoint-Seiten

Für das Einbinden der duplizierten Masterpage (bei mir heißt diese Arbeitsbereich.master) gibt es 2 Möglichkeiten:
  1. Man wählt die Website-Masterpage aus. Wie das geht kann man z.B. hier nachlesen: Mirjams Blog - Deploying a custom master page (im letzten Teil des Eintrages).
  2. Man verändert die Seiten direkt
Den 2. Punkt möchte ich näher betrachten, da das etwas flexibler ist, als Punkt 1. Zum manuellen Verändern der Masterpage folgt man folgender Anleitung:
  • Den Sharepoint Designer für die Webseite öffnen (siehe oben)
  • Die Auswahl "All Files" auswählen


Hier gibt es nun diverse Verzeichnisse, die man sich in Ruhe einmal anschauen sollte. Hier eine Kurzbeschreibung der wichtigsten Verzeichnisse:
- Site Pages: Enthält alle Webseiten, die in aller Regel auch navigierbar sind
- Lists and Libraries: Das sind alle Listen und Bibliotheken. Hier sind ebenfalls ASPX Seiten zu finden (!), für die Anzeige und Bearbeitung der Listen im Portal.
- Subsites: Hier sind alle Unterwebseiten zu finden

Für alle gefundenen ASPX Dateien kann man einzeln die Masterpage verändern. Hierzu wählt man entsprechende ASPX Datei aus und editiert diese im "advanced mode" (Kontextmenü). Für mein Besipiel habe ich unter SitePages/Home.aspx verwendet (Die Standardstartseite des Portals). Dort befindet sich in der ersten Zeile für die Parametrisierung der Codebehind Assembly auch das Attribut MasterPageFile. Diesen Attributwert kann man nun ändern:



Wichtig: Der Wert ~masterurl/default.master ist stark verwirrend für ASP.NET Programmierer. Zunächst lässt das ~masterurl vermuten, dass das analog der VirtualServerRoot ~ wäre (siehe Rick Strahls Blog - Making Sense of ASP.NET Paths). Dem ist aber definitiv nicht so. Es sind nur 2 verschiedene Werte mit ~masterurl fest verdrahtet, und somit nur "default.master" und "custom.master" möglich. Siehe hierzu auch nähere Informationen aus der MSDN - Customizing Master Pages.

Es gibt aber einen einfachen Trick für den Sharepoint Designer, der wohl aus VisualStudio übernommen wurde. Hierzu einfach den gesamten Wert mit einem zufälligen Buchstaben überschreiben, dann ermöglicht der Designer eine Kontextmöglichkeit Pick URL:

Das kann man bequem doppelklcken und dann komfortabel aus einem Verzeichnis wählen. Unsere duplizierte Masterpage liegt dann unter _catalogs/masterpage/Arbeitsbereich.master. Der Designer macht dann hieraus die URL: ../_catalogs/masterpage/Arbeitsbereich.master. Also auch bereits relativ zu der eigentlichen Seite, das ist sehr komfortabel, wenn die Seiten (ASPX Dateien) auf unterschiedlichen Hierarchieebenen liegen. Jetzt die Änderung noch speichern, diese sind dann auch sofort aktiv und können ausprobiert werden.

Schritt 4 - Fazit

Das Duplizieren und das Modifizieren der Masterpage ermöglicht dem Sharepoint Entwickler die Gestaltung eines einheitlichen Designs. Weiterhin können auch Skripte und allgemeine Funktionen über die MAsterpage bereitgestellt werden (so wie bei mir die Einbindung von jQuery). Es führen sicherlich 1000 Wege nach Rom, für mich war dieser Weg nun eine Möglichkeit globale Funktionalität bereitzustellen. Außerdem lernt man hierbei auch etwas die Struktur von Sharepoint kennen.

MS VPC - Deaktivieren der Zeitsynchronisation

09.05.2011 15:52:00 | Timo Rehl

Es gibt eine versteckte Möglichkeit bei Microsoft VPC die Synchronisation der Uhrzeit zwischen der virtuellen Maschine und dem Host zu unterbinden. Hierzu muss lediglich an entsprechender Stelle in der *.vmc Datei ein Eintrag platziert werden:

<preferences> 
 <integration> 
  <microsoft> 
   <components> 
    <host_time_sync> 
     <enabled type="boolean">false</enabled> 
    </host_time_sync> 
   </components> 
  </microsoft> 
 </integration> 
</preferences>

Natürlich sollte darauf geachtet werden, dass keine vorhandenen Knoten überschrieben, sondern nur ergänzt werden.

Give it a trial: 90 Tage Windows Azure for free

09.05.2011 15:47:49 | Thorsten Hans

windowsAzureLogoWie Robert bereits in einem Post beschrieben hat, gibt es aktuell eine Aktion von Microsoft, die es erlaubt Windows Azure 90 Tage kostenlos zu testen.

Auf dieser Webseite einfach das Land auswählen und den Promotioncode “COMMUNITY” eingeben und schon kann es losgehen.

Für die Registrierung und den Zugriff auf Azure wird keine Kreditkarte benötigt.

 

Technorati Tags: ,
DotNetKicks-DE Image

Respecto Colonius!

09.05.2011 11:27:00 | Gordon Breuer

Am 6. Mai 2011 fand wieder DIE .NET Community-Konferenz "von Entwicklern, für Entwickler" in Köln statt. Das Erfolgsgeheimnis: Eine Handvoll Software-Entwickler setzen sich zusammen und organisieren eine Konferenz, die sie selbst gerne besuchen würden. Das heißt: Top-Sprecher in einer Top-Location, Versorgung mit Essen und Trinken den ganzen Tag über und das Ganze zu einem unschlagbaren Preis. Hier findet sich nun ein ausführlicher Erfahrungsbericht aus erster Hand!

Lese den vollständigen Artikel von Gordon Breuer auf anheledir.NET
Read the complete article by Gordon Breuer at anheledir.NET

dotnet Cologne 2011: Rueckblick und Folien meiner Session: MSDN unplugged

09.05.2011 11:11:05 | Kay Giza

Ich hatte am Freitag vergangener Woche die Gelegenheit, auf der Community-Konferenz dotnet Cologne 2011 zu sprechen – herzlichen Dank für die Möglichkeit an die Organisatoren. Das große Interesse und der tollen Dialog während meines Vortrags hat mich sehr positiv überrascht. Vielen Dank an die Besucher meiner Session. Ich möchte gerne zwei Fragen aufgreifen, die während des Vortrages aufkamen, eventuell haben Sie sich diese auch schon einmal gestellt... [...mehr Informationen und Download der Vortragsfolien auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  Giza-Blog.de Facebook-Page | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Vortragsfolien zu meinen Vorträgen auf der dotnet Cologne 2011

09.05.2011 00:49:42 | Thomas Schissler

image

Auf der dotnet Cologne war ich dieses Jahr mit 2 Vorträgen vertreten, einmal mit dem TFS 2010 Quickstart wo ich innerhalb des Vortrags in einer Stunde live einen TFS installiert, die Versionsverwaltung und den Build eingerichtet, Requirements und Test Cases angelegt, Testfälle spezifiziert und ausgeführt, Bugs angelegt und die Traceability demonstriert. Im zweiten Vortrag habe ich verschiedene Best Practices zu SCRUM vorgestellt und die Umsetzung mit TFS vorgestellt. Es war wieder eine tolle Konferenz, vielen Dank an das Orga-Team.

Wer sich nochmals die Folien anschauen mag, hier sind die Links zum Download. Wenn es nachträglich noch Fragen gibt, dann könnt ihreuch gerne per Mail an mich wenden.

Premiere des TechTalk Online - vielen Dank!

06.05.2011 11:24:43 | Peter Kirchner

205x160_TechTalkOnline_DEIn den letzten drei Wochen lief zum ersten Mal der TechTalk als Online-Ausgabe. Das Format wurde glücklicherweise gut angenommen und wir hatten interessante Gespräche im Live Chat – zumindest an den ersten beiden Terminen. ;-)

Der TechTalk Online fand am 19. April, am 28. April und am 5. Mai statt.
Wir danken allen Teilnehmern für das Interesse und die Diskussionen im Live Chat!

Die Vorträge werden in der zweiten Maihälfte zum freien Download veröffentlicht. Informationen dazu werden Sie auf der TechTalk Online-Seite finden. Registrierte Teilnehmer werden zusätzlich per E-Mail benachrichtigt.

Sie können weiterhin über die Agenda-Seite die Präsentationen und die Aufzeichnungen der Live-Chats herunterladen. Registrierte Teilnehmer können noch bis zum 15. Mai auf ihre virtuelle Konferenztasche zugreifen.

Was Sie in der virtuellen Konferenztasche finden:

  • Ein Azure Pass für satte 90 Tage! Normalerweise ist der Azure Pass auf 30 Tage begrenzt.
  • Buchdownload für "Windows 7 für Entwickler – Crashkurs"
  • Buchdownload für "Microsoft SQL Server 2008 - Überblick über Konfiguration, Administration, Programmierung"

LightCore Bootstrapper für Caliburn.Micro

03.05.2011 23:59:00 | Thorsten Hans

Caliburn-croppedCaliburnMicro ist ein kostenloses MVVM Framework, welches nach belieben mit diversen IOC Frameworks konfiguriert werden kann. Auch Peter Bucher’s LightCore lässt sich sehr einfach in die Caliburn.Micro Pipeline integrieren.
Zunächst muss man sowohl Caliburn.Micro als auch LightCore referenzieren. Hierzu kann man NuGet verwenden und die Referenzen mittels

Install-Package Caliburn.Micro

Install-Package LighCore

hinzufügen. Der korrekte Ansatzpunkt hierzu ist die Bootstrapper oder Bootstrapper<T> Klasse, von welcher einfach abgeleitet wird. Die Standard-MEF Implementierung des Bootstrappers wird hierbei durch die LightCore Variante ausgetauscht. Die Klasse Bootstrapper<T> stellt hierbei vier Methoden bereit, welche es zu implementieren gilt:

  • Configure
  • GetInstance
  • GetAllInstances
  • BuildUp

Die Configure Methode wird dazu verwendet den IOC zu konfigurieren und die gewünschten Einstellungen vorzunehmen. GetInstance und GetAllInstances werden dazu verwendet um eine bzw. beliebig viele Implementierungen eines Kontraktes beim IOC abzufragen. Letztlich gibt es noch die Methode BuildUp welche dazu verwendet wird existierende Objektinstanzen nach Properties zu durchsuchen, welche ebenfalls injiziert werden können.

Die eigentliche Implementierung der Klasse Bootstrapper<T> sieht demnach so aus

   1:  public class AppBootstrapper : Bootstrapper<IShell>
   2:  {
   3:       // LightCore ContainerBuilder
   4:       private IContainerBuilder builder;
   5:       // LightCore Container
   6:       private IContainer container;
   7:   
   8:       /// <summary>
   9:       ///   By default, we are configured to use MEF
  10:       /// </summary>
  11:       protected override void Configure()
  12:       {
  13:          // Configure
  14:          builder = new ContainerBuilder();
  15:          builder.Register<IWindowManager, WindowManager>();
  16:          builder.Register<IEventAggregator, EventAggregator>();
  17:          builder.Register<IShell, ShellViewModel>();
  18:         
  19:          // build LightCore Container
  20:          container = builder.Build();
  21:       }
  22:   
  23:       protected override object GetInstance(Type serviceType, string key)
  24:       {
  25:          // LightCore is able to resolve types by generics or by a type instance
  26:          if(serviceType!=null){ return container.Resolve(serviceType);} else {return null; }
  27:       }
  28:   
  29:       protected override IEnumerable<object> GetAllInstances(Type serviceType)
  30:       {
  31:           return container.ResolveAll(serviceType);
  32:       }
  33:   
  34:       protected override void BuildUp(object instance)
  35:       {
  36:          container.InjectProperties(instance);
  37:       }
  38:  }

That's it!

Mehr ist nicht benötigt um LightCore in Caliburn.Micro zu verwenden.

 

DotNetKicks-DE Image

REST using the WCF Web API – POST it!

03.05.2011 23:37:00 | Alexander Zeitler

REST

Postings published on this series so far:

When using RESTful services you certainly don’t want to GET data only but also insert them.

Using the semantics of HTTP this is done using the POST method.

The simplest implementation looks like this:

[WebInvoke(UriTemplate = "",Method = "POST")]
public HttpResponseMessage<Contact> Post(Contact contact) {
	contact = _contactRepository.Insert(contact);
	return new HttpResponseMessage<Contact>(contact);
}

Invoking this on http://localhost:2201/contacts using this request:

POST http://localhost:2201/contacts HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Accept: application/json
Host: localhost:2201
Content-Length: 23

{"Name":"Wade Wegner"}

We get the following response:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 03 May 2011 20:57:54 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 30
Cache-Control: private
Content-Type: application/json; charset=utf-8
Connection: Close

{"Id":4,"Name":"Wade Wegner"}

As we've learned in the previous post we should be stateful in our response so we add the HTTP status code 201 for “Created” when everything went fine:

[WebInvoke(UriTemplate = "",Method = "POST")]
public HttpResponseMessage<Contact> Post(Contact contact) {
	contact = _contactRepository.Insert(contact);
	HttpResponseMessage<Contact> response = new HttpResponseMessage<Contact>(contact);
	response.StatusCode = HttpStatusCode.Created;
	return response;
}

Stupidly, things work not always as excepted and a client of our service may send a Contact that is null. We should state on that with an appropriate response:

[WebInvoke(UriTemplate = "",Method = "POST")]
public HttpResponseMessage<Contact> Post(Contact contact) {
	if(null == contact) {
		return new HttpResponseMessage<Contact>(HttpStatusCode.BadRequest);
	}
	contact = _contactRepository.Insert(contact);
	HttpResponseMessage<Contact> response = new HttpResponseMessage<Contact>(contact);
	response.StatusCode = HttpStatusCode.Created;
	return response;
}

The response to our POSTed null contact:

HTTP/1.1 400 Bad Request
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 03 May 2011 21:14:14 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Length: 0
Connection: Close

But we're still not done on our way to a RESTful POST implementation: In a RESTful architecture it is a best practice to return the URI under which the newly created resource is available for further operations. In our example this would be http://localhost/contact/4:

[WebInvoke(UriTemplate = "", Method = "POST")]
public HttpResponseMessage<Contact> Post(Contact contact, HttpRequestMessage<Contact> request) {
	if (null == contact) {
		return new HttpResponseMessage<Contact>(HttpStatusCode.BadRequest);
	}
	contact = _contactRepository.Insert(contact);
	HttpResponseMessage<Contact> response = new HttpResponseMessage<Contact>(contact);
	response.StatusCode = HttpStatusCode.Created;

	var uriBuilder = new UriBuilder(request.RequestUri);
	uriBuilder.Path = string.Format("contact/{0}", contact.Id);
	response.Headers.Location = uriBuilder.Uri;
	return response;
}

When POSTing the contact now, we'll receive the following response containing the location of our new contact:

HTTP/1.1 201 Created
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 03 May 2011 21:28:42 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 30
Location: http://localhost:2201/contact/4
Cache-Control: private
Content-Type: application/json; charset=utf-8
Connection: Close

{"Id":4,"Name":"Wade Wegner"}

For now we've seen the most important facts about POSTing data in a RESTful scenario. There are some more options on POST to discover when we're playing around with PUT - but this is done in the next part of this series. Stay tuned!

Postings published on this series so far:

DotNetKicks-DE Image

Hurry up for ShareCamp 2011

03.05.2011 07:18:06 | Thorsten Hans

Logo_born2share201111 Tage vor dem ShareCamp 2011 sind noch wenige Plätze frei. Daher solltet Ihr euch jetzt noch beeilen. Die Vorbereitungen für die zweite Auflage der Unkonferenz zum Thema SharePoint laufen auf Hochtouren.

Am 14. und 15. Mai 2011 erfahrt Ihr alles über SharePoint 2010 in der deutschen Zentrale von Microsoft in Unterschleißheim. Die Teilnahme am ShareCamp ist wie auch letztes Jahr wieder kostenlos.

Im Rahmen eines BarCamps seit auch Ihr als Besucher gefragt, denn eine feste Agenda gibt es nicht. Sowohl Samstag als auch Sonntag morgen wird die Agenda von allen Teilnehmern gewählt! Jeder Teilnehmer kann eine Session halten. Dabei ist es irrelevant ob es ein klassischer Vortrag oder eine Diskussionsrunde, ein Projektbericht oder sonst etwas ist. Es sollte lediglich im SharePoint Kontext sein.

Also nichts wie anmelden unter http://www.sharecamp.de

 

Technorati Tags: ,,
DotNetKicks-DE Image

iPhone-Cover mit selbst gedruckten Motiven

02.05.2011 01:03:00 | Daniel Springwald

iPhone-Cover mit Motiv sind teuer - und wer will sich schon auf nur ein Motiv festlegen? ;o)

Eine Lösung kann ein selbst gemachtes Wechselmotiv sein:

Zunächst braucht man ein transparentes iPhone-Cover:

Jetzt die gewünschten Motive in passender Größe ausdrucken:

...und für das Cover in Form schneiden:

Schon ist das Wechselcover fertig - für wenige Cent pro Motivwechsel.

UI/UX-Grundlagen: Vortragstermine

01.05.2011 19:06:00 | Roland Weigelt

Mein Vortrag “UI/UX-Grundlagen für Entwickler und andere Nicht-Designer”, den ich letztes Jahr auf der See# Party in Kreuzlingen (Schweiz) sowie bei der netug-niederrhein und “zu Hause” bei Bonn-to-Code.Net gehalten habe, wird in den nächsten Monaten an den folgenden Terminen zu sehen sein:

Die Vorträge in Köln und Nürnberg dauern jeweils 60 Minuten. Bei den User Groups gibt es die “Maxi-Version”, deren Länge je nach Umfang der anschlie-ßenden Diskussion erfahrungsgemäß bei ca. 90-120 Minuten liegt.

Vorschau

Bei der diesjährigen See# Party am 20. August werde ich erstmalig meinen neuen UI-Vortrag “User Interface Patterns in Silverlight” halten. Wobei mit den “Patterns” nicht Architektur-Entwurfsmuster hinter der UI wie z.B. MVVM gemeint sind, sondern tatsächlich im wortwörtlichen Sinne Patterns im User Interface. Der Vortrag betrachtet z.B: einige scheinbar selbstverständliche Interaktionsmuster noch einmal etwas genauer. Konkrete Beispiele in Silverlight sorgen für eine gute Mischung von Theorie und Praxis.

Mein erster Kontakt mit NDepend

01.05.2011 18:03:57 | Klaus Bock

NDepend

Kurz vor Ostern erhielt ich von Patrick Smacchia, dem verantwortlichen Entwickler hinter NDepend, eine Anfrage, ob ich Interesse hätte mir NDepend einmal anzusehen. Die eingeholten Vorabinformationen aus der deutschen .NET-Gemeinde waren durchweg positiv und erzeugten eine gewisse Neugier. Warum also nicht eine eigene Meinung bilden?

Ich bekundete mein Interesse beim NDepend-Team und erhielt kurz darauf eine Lizenz. Der Download fällt mit 9,4 MB eher klein aus. Eine echte Installation wird nicht benötigt. Es müssen lediglich die Daten aus dem ZIP-Archiv in ein privates Verzeichnis entpackt werden. Das entpacken der Daten in den Programmeordner sollte wegen möglicher Probleme mit der Benutzerkontensteuerung (UAC) unterbleiben. Nach dem Entpacken muss, für die Integration von NDepend in Visual Studio, einmal die Anwendung NDepend.Install.VisualStudioAddin.exe ausgeführt werden. In einem Auswahldialog wird nach der verwendeten Visual Studio Version gefragt. Es kann zwischen voller Integration und einer, Light Integration genannten, teilweisen Integration gewählt werden. Die von NDepend verwendeten Shortcuts können auf Wunsch deaktiviert werden, falls Kollisionen mit bereits verwendeten Tastenkürzeln zu befürchten sind. Ab jetzt steht NDepend zur Codeanalyse in Visual Studio zur Verfügung.

Um NDepend mit einem Visual Studio Projekt zu verwenden, kann entweder eine neues NDepend-Projekt erzeugt und mit dem aktuellen Visual Studio-Projekt verknüpft, oder das aktuelle Visual Studio-Projekt mit einem bestehenden NDepend-Projekt verknüpft werden.
Auf der Seite der Einstellungen des NDepend-Projekts, ist der wichtigste Punkt die richtige Auswahl der zu verwendenden Framework-Version.

NDepend Einstellungen

Mit dieser Einstellung wir festgelegt, aus welchen Ordnern NDepend die referenzierten Assemblies des Framework lädt. Die weiteren Einstellungen, etwa zur Analyse und zum Aussehen des erzeugten Reports, sind selbsterklärend.

NDepend Kontextmenü

Nach der ersten Analyse des aktuellen Projekts, steht in der linken unteren Ecke in Visual Studio ein kleiner farbiger Kreis zur Verfügung, der den aktuellen Status der Analyse des Projekts anzeigt. Es werden die Ampelfarben Rot, Gelb und Grün, sowie Grau und Blau mit folgender Bedeutung verwendet:

Rot
- Eine oder mehrere der als kritisch eingestuften Regeln wurde verletzt
- Eine oder mehrere der aktivierten Regeln kompiliert nicht
- Eine oder mehrere der aktuellen Abfragen ist fehlerhaft.

Gelb
Eine oder mehrere der aktivierten Regeln wurde verletzt.

Grün
Es wurde keine der aktivierten Regeln verletzt.

Grau besagt, dass kein NDepend-Projekt zur Verfügung steht.

Blau wird angezeigt, während eine Analyse ausgeführt wird.

Beim Überfahren des Symbols mit der Maus wird ein Menü sichtbar. In diesem Menü können, unter anderem, die Einstellungen zur Ausführung der Analyse sowie zur Aktualisierung der Analyse in Visual Studio fein eingestellt werden.
Es kann auch eine Analyse des aktuellen Projekts direkt angestoßen werden.
Im oberen Bereich wird der aktuelle Status des Projekts in einer Zusammenfassung gezeigt.

Den Kern der Analyse bildet die in NDepend integrierte Code Query Language (CQL). Dies Abfragesprache erinnert stark an SQL und ist auch sehr ähnlich zu verwenden. Zum Bearbeiten bestehender Abfragen oder um neue Regeln zum aktuellen Projekt hinzuzufügen, steht ein integrierter Editor zur Verfügung. Mit diesem Konzept und dem integrierten Editor ist es sehr einfach, bestehende Regeln den aktuellen Anforderungen anzupassen oder neue Regeln zu erstellen.

Eine der Regeln besagt:
Felder welche auf die Bezeichnung Uri enden, sollten vom Typ System.Uri sein.
Es kann aber wie in folgendem Beispiel vorkommen, dass der Namensteil Uri verwendet wird aber dennoch der Typ Uri nicht verwendet werden kann. Zum Beispiel ein Feld vom Typ ConfigurationProperty mit dem Namen serviceUri würde diese Regel verletzen. Mit dem integrierten CQL-Editor wird einfach als optionales Kriterium
nicht vom Typ ConfigurationProperty
zur Abfrage hinzugefügt.

System.Uri-Regel

Die jeweiligen Änderungen oder Anpassungen des Regelwerks sind allerdings nur für das aktuelle Projekt gültig. Ich habe noch keinen Weg gefunden, um allgemeingültige Änderungen des Regelwerks vorzunehmen.

NDepend analysiert nicht den Quellcode, sondern den erzeugten IL-Code in den kompilierten Assemblies. Um die jeweiligen Stellen im Quellcode zeigen zu können, werden Debug-Assemblies mit der zugehörigen PDB-Datei benötigt. Eine Analyse von Assemblies mit Release-Status ist nicht vorgesehen.

Soweit zur Arbeits- und Funktionsweiße.
Als erstes Projekt zur Analyse mit NDepend habe ich mir eine kleine Anwendung ausgesucht, die als Modul in ASP.NET Anwendungen zum Einsatz kommt. Die Anwendung hat kein UI, wird ausschließlich über die web.config konfiguriert und von einem Http-Modul gestartet.
Der erste Report brachte eine Fülle von Informationen und jede Menge Warnungen zu Tage. Die für mich interessanteste Warnung betraf die Sichtbarkeit des verwendeten Http-Moduls, der enthaltenen Http-Handler und der Klasse der Einstellungen die von ConfigurationSection  abgeleitet ist. NDepend empfahl diese Klassen als internal zu deklarieren.
Und wie soll dann bitte die Webanwendung auf diese Typen zugreifen? Egal; das wollte ich wissen. Ich deklarierte also die betreffenden Klassen als internal, kompilierte das Projekt im Release-Status neu und startete eine Webanwendung in der ich das Modul verwendete. Zu meiner großen Überraschung funktionierte alles wie gewohnt. Mit dem positiven Nebeneffekt, dass ich keine öffentliche API mehr zur Verfügung stellte die auch so nie vorgesehen war. OK. Wieder etwas dazugelernt.

NDepend ist auch das erste, mir bekannte, Analyse-Tool welches auf die Unveränderbarkeit von Strukturen (immutable struct) achtet. Hier wird geprüft, ob auch wirklich alle Felder der Struktur als readonly deklariert sind. Dadurch wurde ich angehalten, mich mit der Implementierung von entsprechenden Replace-Methoden in solche unveränderliche Strukturen zu befassen.
Aber das ist ein anderes Thema.

Im Allgemeinen sind die Standard-Regeln bereits sehr restriktiv ausgelegt. Wenn sie befolgt und nicht umgangen werden, resultiert aus der konsequenten Anwendung ein deutlich wartbarerer Code.

NDepend kann natürlich noch deutlich mehr als ich hier in ein paar wenigen Zeilen schreiben kann. Ich werde nach und nach, wenn ich NDepend etwas besser kenne, auf die einzelnen Feature eingehen.

Fazit:

NDepend erscheint mir als ein hilfreiches Werkzeug, sehr gut geeignet zur täglichen Verwendung. Die Entwickler hinter NDepend leisten sehr gute Unterstützung bei eventuellen Problemen und helfen schnell und unkompliziert.
Bei meinen Recherchen vor der Verwendung von NDepend, sagte mit einer der Gefragten eine steile Lernkurve mit NDepend voraus. Dem kann ich mich nur anschließen.

Technorati-Tags: | | |

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum