Windows Phone 7 Theme-Resources Cheat-Sheet
31.05.2011 22:03:00
|
Gordon Breuer

Instead of using hardcoded values for your font sizes, margins, and so on in your Windows Phone application, there are a lot of predefined resources already available you can just use.
Not only makes it your developer / designer life easier but it guarantees a consistent layout through all WP7-Apps, as long as you follow the others principle of the Metro design-language.
Of course you could lookup all those available resource-keys in the msdn. But after creating a few apps I was tired of opening my browser and calling my bookmark to the specific page. There are quite a few of the so called “cheat sheets” available for developing / designing applications for Windows Phone 7, but nothing yet for those resources. I have an education as a “Designer of digital and print media, specializing in non-print media operations” so I typeset such a Quick Reference Sheet with Adobe InDesign CS4.
You can find a print-ready (300 dpi) PDF here:
WP7_Theme_Resources_Quick_Reference_Sheet.pdf (191 KB)
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.

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

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.

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
(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
In 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:

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.

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



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.

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++:
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 15: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
. 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.

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.



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
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 |
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
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
Wie 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:

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:

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.

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.



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.

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.

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

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

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

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!".

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

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.

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



Mit Schritt 6 ist die Installation der Umbraco Seite fertig.

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.
 |
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.

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
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

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.

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:
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>
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:

Ü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.

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 |
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
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:

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:
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" />
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.
- IsRequired markiert ein Pflichtfeld, welches über RequiredImageAlignment positioniert werden kann.
- ShowEditTracker markiert Felder, dessen Wert vom Benutzer geändert wurden. Die Position kann über TrackerImageAlignment festgelegt werden.
- ShowElementTracker zeigt ein Symbol vor oder hinter dem aktuell fokussierten Element an. Die Position kann über TrackerImageAlignment festgelegt werden.
- AttachErrorTemplate verknüpft das Control mit einem Error Template, das im Fehlerfall angezeigt wird.
- AttachEditContextMenu verknüpft ein Eingabesteuerelement mit einem erweiterten Editor-Context-Menü.
- AttachEditorToolbar verknüpft ein Eingabesteuerelement mit einer Editor-Toolbar.
- CueBanner weist dem zugewiesenen Control ein Wasserzeichentext zu.
- AttachSmartTag weist dem zugewiesenen Control einen Smart Tag zu. Dessen Menü muss hierbei über die Eigenschaft SmartTagMenu zugewiesen werden.
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
 |
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.

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:

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!" />
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>
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
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
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
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 |
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
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
Stimmen zur dotnet Cologne 2011
10.05.2011 11:07:00
|
Stefan Lange
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

Lab wählen:

Lab starten:

kurz warten:

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

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.

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


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.

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.


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.

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.

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.

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.

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

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 gelesen”
. 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 UIAnnotationsWith 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:

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
Wenn 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.
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:
- 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).
- 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
Wie 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.
Respecto Colonius!
09.05.2011 11:27:00
|
Gordon Breuer

Was ein wenig nach einem Harry Potter-Zauberspruch klingt soll in Wahrheit meinen Rückblick auf die dotnet Cologne 2011 einleiten. Aber mit mysteriösen Titeln soll man ja angeblich Leser anlocken. ;-)
Ich kann mich noch an die DNC 2010 erinnern, damals hatte ich mich irgendwann im Laufe des ersten oder zweiten Tages registriert und den “Super-Early-Bird” Preis von nur 25 Euro ergattert. Dieses Jahr war der bereits nach ~10 Minuten nicht mehr verfügbar. Naja, “Early-Bird” ist auch nicht so teuer und selbst der normale Eintrittspreis ist verglichen mit dem Gebotenen fast noch geschenkt! Also nicht lange gefackelt, Ticket geholt und ungeduldig auf Mai warten.
8:20 Uhr, Registrierung

Ein wenig zu früh angekommen, es werden gerade letzte Vorbereitungen für die Registrierung in Haus 7 des Mediaparks Köln abgeschlossen. Aber ich bin nicht der einzige, der schon ungeduldig wartet, wie beruhigend! Laut offizieller Agenda müssen wir uns jetzt noch bis 9:45 Uhr die Zeit bis zum ersten Vortrag vertreiben. Aber da wird sich doch bestimmt etwas finden…
8:58 Uhr, Frühstück

Wieso hat mir eigentlich niemand gesagt, dass es im Haus 6 nebenan Frühstück gibt? Also schnell mal rüber marschiert und tatsächlich: Da sind also die ganzen anderen Teilnehmer geblieben! Und nicht nur die, sondern auch ein wirklich großzügiges Buffet, wie man auch auf dem Foto erkennen kann. Neben den unzähligen belegten Brötchen und frischem Obst gibt es überall verteilt auch genügend Kaffee, Tee und diverse Erfrischungsgetränke.
Mit Brötchen und einem heißen Tee bewaffnet bin ich jetzt auch bereit für das Wichtigste auf der dotnet Cologne: Gespräche mit den Teilnehmern! Einige erkenne ich tatsächlich noch vom letzten Jahr, viele Namen hat man zumindestens schon mal gehört bzw. gelesen. Ich wäre dafür, dass man gut sichtbar seinen Twitternamen und Blog-URL auf die Stirn malt, das würde die Zuordnung einiger Namen und Gesichter deutlich erleichtern. ;-)
9:45 Uhr, Begrüßung durch die Organisatoren

Im vergangenen Jahr hatte ich die Begrüßung, und damit den Hinweis auf das Gewinnspiel und andere nützliche Infos, verpasst. Der Raum war einfach zu klein für alle gewesen. Das war dieses Jahr deutlich besser: Es mussten zwar dennoch einige Teilnehmer an den Seiten stehen, aber es passten alle bequem rein. Während der Begrüßung wurde noch auf einen geänderten Vortrag hingewiesen, auf das Gewinnspiel im Stil einer Schnitzeljagd mit Stempelkarte und ein paar andere organisatorische Dinge.
10:15 Uhr, Windows Phone 7: Silverlight != Silverlight Past, Present & Future, mit Peter Nowak

Da freut man sich seit Wochen auf den Silverlight != Silverlight Vortrag, und dann diese herbe Enttäuschung: Ohne Vorankündigung hat Peter einfach sein Vortragsthema geändert und erzählt über die bisherige und aktuelle Entwicklung rund um das Microsoft Windows Phone 7. Außerdem gibt er auch einen kleinen Ausblick, was er sich für die Zukunft vorstellen könnte.
Eine “herbe Enttäuschung” war der Vortrag natürlich nicht! Wer schon mal einen Vortrag von Peter miterlebt hat weiss, dass diese immer locker, unterhaltsam und in jedem Fall informativ sind. Für ihn ein wenig ungewöhnlich war nur, dass der Vortrag ausschließlich aus Folien bestand. Kein Quellcode, keine Beispiele, … aber um ehrlich zu sein habe ich das auch nicht wirklich vermisst. Ob Peters Vorhersagen für die Zukunft von WP7 sich wohl bewahrheiten werden? Na, ich bin ja mal gespannt!
Nur nebenbei erwähnt: Verkaufsstart in Deutschland für das Windows Phone 7 war nicht Anfang November, wie in Peters Folien erwähnt (außer vielleicht bei der Telekom), sondern offiziell der 21. Oktober – an dem Tag habe ich auch mein HTC Trophy damals in einem Vodafone-Shop gekauft! 
Meine Wertung: 



Einen halben Stern Abzug gibt es für den unangekündigten Vortragswechsel und man hätte vielleicht noch ein paar Daten wie die Anzahl der Apps aktualisieren können, diese waren noch von März 2011. Aber ansonsten wie immer klasse!
11:45 Uhr, REST WARS: WCF WebHTTP vs. ASP.NET MVC, mit Daniel Fisher

Mit dem Thema REST habe ich mich in den letzten Wochen intensiver beschäftigen müssen aufgrund eines privaten Projektes. Gereizt hätte mich ansonsten auch noch der Vortrag von Stefan Lange zu Silverlight 5.
Daniel hat nach ein paar anschaulichen Beispielen (“SOAP ist wie ein schnittiger Sportwagen – den man aber nur im ersten Gang fährt.”) die Vorteile von REST erklärt, bsp. die Verwendung unterschiedlicher HTTP-Verben (GET, POST, PUT, DELETE, …) je nach Aufgabe, oder auch die unterschiedlichen Formate (JSON, XML, CSV, …) bei der Kommunikation. Alles klar, wie kann ich es also selber einsetzen?
Gezeigt wurde die Implementierung und Bereitstellung eigener REST-Services mittels der WCF, mit Hilfe von ASP.NET MVC und – ganz neu – mit Hilfe der erst kürzlich vorgestellten WebAPI von Microsoft, die sich noch in einer CTP befindet. Das Ganze wurde auch direkt anhand praktischer Codebeispiele gezeigt. Mit ein paar Zwischenfragen klärte Daniel praktisch “on-the-fly” ab, wie der Wissensstand der Teilnehmer war um auf einzelne Punkte etwas näher einzugehen und andere nur kurz anzuschneiden.
Meine Wertung: 



Der Vortrag war in der ersten Hälfte unterhaltsam und recht locker gestaltet, in der zweiten Hälfte ging es dann doch ziemlich ans Eingemachte. Daniel hat auch im Vorfeld schon gesagt, dass es eigentlich ein “Level 400”-Vortrag ist. Ich selber bin leider noch nicht so fit in Sachen WCF und gegen Ende war die Luft in dem kleinen, aber sehr gut besuchten, Raum einfach verbraucht. Alles in allem aber ein sehr guter Vortrag!
12:45 Uhr, Mittagspause

Gemurmel dröhnt drohend wie Trommelklang, gleich stürzt eine ganze Armee
die Treppe herauf und die Flure entlang: Dort steht das kalte Buffet.
Zunächst regiert noch die Hinterlist, doch bald schon brutale Gewalt:
Da spießt man, was aufzuspießen ist, die Faust um die Gabel geballt.
Mit feurigem Blick & mit Schaum vor dem Mund kämpft jeder für sich allein,
und schiebt sich in seinen gefräßigen Schlund, was immer hineinpaßt, hinein.
Bei der heißen Schlacht am kalten Buffet, da zählt der Mann noch als Mann.
Und Aug' in Auge, Aspik und Gelee, hier zeigt sich wer kämpfen kann, hurra!
So sang es einst Reinhard Mey, und so ähnlich kam es mir hier auch vor. Die Schlange schien jedenfalls endlos und als ich dann letztendlich an der Reihe war, gab es leider schon keinen Salat mehr. Aber die Suppe, Frikadellen und Käse/Trauben-Spieße waren auch lecker. Und außerdem bin ich ja nicht auf die dotnet Cologne gekommen um mir den Bauch voll zu schlagen!
Aufgrund des Späten Mittagessens habe ich dann die Lunch Sessions ausgelassen. Stattdessen gab es wieder ein paar interessante Gespräche während dem Essen. Und ich musste festellen, dass man meine Postkartenaktion noch immer nicht vergessen hat. Aber auch ansonsten wurde ich eigentlich recht häufig erkannt / angesprochen. Bei anderen Kollegen aus der Community kann ich das ja nachvollziehen, aber das man auch mich schon “erkennt” war eine interessante Erfahrung. Ich kann nur hoffen, dass es auch positive Assoziationen waren!
14:00 Uhr, ASP.NET MVC 3 erweiterte Techniken, mit Albert Weinert

Ich fand es erstaunlich das Albert zwischen den ganzen Vorbereitungen und Arbeiten rund um die dotnet Cologne die Zeit gefunden hat, einen eigenen Vortrag vorzubereiten und auch zu halten. Wenn man aber wie er so in einem Thema drin steckt, braucht man ja nur wenig Vorbereitung und kann viel aus dem Stehgreif machen.
Stellenweise hatte ich dann auch das Gefühl, dass der Vortrag nicht groß “geprobt” wurde, denn was alles an Themen abgedeckt werden sollte war schon eine Menge. Und obwohl einiges gekürzt und manches komplett übersprungen wurde, war die Stunde mehr als nur knapp bemessen. Nichtsdestotrotz war das gezeigte gut und anhand praktischer Beispiele erklärt.
Meine Wertung: 



Der Vortrag war inhaltlich klasse, aber es war einfach zuviel Material für zu wenig Zeit. Je später es wurde, desto mehr wirkte alles ein wenig zusammengestaucht und gehetzt. Daher auch der Stern Abzug. Nächstes Jahr könnte man vielleicht einfach Slots für XXL-Vorträge vorsehen, beispielsweise die Zeit der Lunch-Session noch dazu nehmen.
15:30 Uhr, MSDN unplugged – Tipps & Tricks für Entwickler – Schneller zum Ziel in wenigen Schritten, mit Kay Giza

Der MSDN unplugged-Vortrag von Kay war von mir extra als “light weight”-Vortrag eingeschoben worden. Die beiden Sessions davor hatten beide einiges an Quellcode gezeigt und auch recht viel Aufmerksamkeit abverlangt. Bei einer ähnlich schweren Kost wäre ich gedanklich vermutlich bald abgeschweift. Also entschloss ich mich für diesen non-Sourcecode Vortrag zum “entspannen”. Die Präsentationen von Kay sind eigentlich immer sehr unterhaltsam und beinahe schon interaktiv. Das konnte also nur gut werden!
Es mag völlig nebensächlich sein, subjektiv und überhaupt nicht zum Thema “Entwicklung” gehören, aber: Die Übergänge zwischen den Folien auf dieser riesigen Leinwand sahen einfach geil aus! :-) Ein paar Interna über den Aufbau und die Struktur der MSDN zu erfahren war auch mal ein interessantes Erlebnis. Ein paar Anregungen zur Verbesserungen von den Teilnehmern hat Kay sich auch sofort notiert. Wenn demnächst also die Code Clip-Videos mit einem “Download”-Link in der MSDN stehen: Das verdankt ihr dem Live-Feedback auf der dotnet Cologne! 
Selbst wenn man das Video “Einfach laufen lassen” zu Visual Studio 2010 schon kennt: Es ist immer wieder lustig anzusehen und auf der großen, kinoartigen Leinwand sowieso! Was ich jetzt allerdings nicht auf Anhieb gefunden habe war das englischsprachige Video, das Kay ganz am Ende seines Vortrags gezeigt hat. Wer hierzu einen Link weiss, bitte unbedingt mal melden! :-)
Meine Wertung: 



Ausnahmsweise mal etwas leichtere Kost, die aber auf sehr unterhaltsame Weise präsentiert wurde. Da man als .NET-Entwickler eigentlich immer wieder mal auf die Informationen der MSDN zugreifen muss, waren die gezeigten Tipps auch von durchaus praktischer Bedeutung. Mir fällt auf Anhieb nichts negatives ein, daher fünf Sterne von mir!
17:00 Uhr, Rich-Internet Apps & Mobile Anwendungen mit HTML5, JavaScript, Sencha ExtJS / Touch und Windows Azure, mit Tim Fischer

Als letzten Vortrag der dotnet Cologne habe ich mich für die Rich-Internet Apps von Tim Fischer entschieden. Den Ansatz, HTML nicht mit Javascript “anzureichern” sondern den kompletten HTML-Code durch Javascript zu erzeugen, war mir jetzt nicht wirklich als zeitgemäße Technik im Hinterkopf. Wenn man allerdings genauer darüber nachdenkt, bringt einem das doch ein paar interessante Vorteile. So kann man ohne sich mit dem genauen HTML- und CSS-Syntax auseinandersetzen zu müssen Anwendungen bereit stellen, deren Layout sehr stark an native Anwendungen erinnert. Auch das Problem, das verschiedene Browser unter Umständen Quellcode anders rendern, kann man mit entsprechenden Browserweichen direkt abfangen.
Tim Fischer hat während dieser letzten Vortragsstunde viele Beispiele mit dem Sencha ExtJS-Framework gezeigt und wie man mit dessen Hilfe sehr ansprechende (Web-)Anwendungen für mobile Endgeräte umsetzen kann. Das es sich dabei tatsächlich um Webseiten handelt merkt der Benutzer gar nicht. Das ganze war aber um so erstaunlicher, da hier ein Mitarbeiter von Microsoft über Techniken sprach, die tatsächlich mit aktuellen Microsoft-Produkten überhaupt nicht oder wenn nur eingeschränkt nutzbar sind: Das Windows Phone 7 beherrscht derzeit kein HTML5 sondern erst mit dem Mango-Update; auch der IE9 und selbst die aktuelle Preview des IE10 kommen noch nicht mit allen Aspekten des ExtJS-Frameworks klar, da dieses primär auf Webkit-Browser ausgerichtet ist.
Was eigentlich nur tangentiell mit dem Vortrag zu tun hatte, mich aber dennoch sehr ansprach, war der Einschub der T4-Templates von Visual Studio, und was man mit ihnen alles machen kann. Auf Grund dieses Vortrages werde ich mich demnächst auf jeden Fall noch intensiver mit T4 beschäftigen, eigentlich verwunderlich das bisher kaum einer Notiz von dieser Technik genommen hat!
Meine Wertung: 



Der Vortrag war sehr spannend und informativ, auch wenn er für die Entwicklung für das Windows Phone 7 noch keine Anwendung findet. Tim hat aber einen interessanten Weg aufgezeigt, wie man auch als reiner .NET- bzw. Webentwickler ansprechende Apps für iOS und Android erstellen kann. Lediglich für das leicht irreführende “Windows Azure” gibt es einen halben Punkt abzug: Außer der kurzen Erwähnung, dass die App-Daten auf einer Azure-DB gespeichert werden, gab es kaum eine weitere Erwähnung oder der Integrierung. Daher kam es mir im Nachhinein so vor, als wenn man den Microsoft Cloud-Dienst nur erwähnt hätte, damit wenigstens ein hauseigener Service mit dabei ist, wenn schon die eigene Desktop- und Mobile-Plattform derzeit nicht mit der Technik zurechtkommen.
dotnet Cologne 2011: Mein Gesamteindruck

Die Räumlichkeiten waren deutlich besser gewählt als noch im vergangenen Jahr, hier wurde die Kritik also ernst genommen und positiv umgesetzt. Auch die längeren Pausen zwischen den Tracks waren von der Länge her ideal! Man hatte genug Zeit sich ein wenig zu erholen und Kontakte zu knüpfen / pflegen.
Was ich von der organisatorischen Seite her durchaus verstehen kann, aber als Teilnehmer jetzt weniger optimal gelöst fand, war die “Stempelkarte” für die Teilnahme am Gewinnspiel. Natürlich kann ich es nachvollziehen, dass die Sponsoren irgendwie aktiv in Kontakt kommen wollen mit den Teilnehmern wenn sie schon Geld für die Konferenz ausgeben. Und um die Preise für die Teilnehmer zu halten ist man auch auf die Sponsoren angewiesen. Dennoch wäre ich mir etwas blöd vorgekommen mit dem Zettel zu einem Stand hinzugehen und um einen Stempel zu bitten – auch wenn mich der Service oder das Produkt des Anbieters ansich gar nicht weiter interessiert. Stattdessen habe ich mich mit den Anbietern etwas länger und ausführlicher unterhalten, die mich auch aktiv interessierten:
Zumindest mittel- bis langfristig gesehen haben da sowohl die Sponsoren als auch ich mehr von. Bei den anderen Sponsoren bin ich ebenfalls vorbei, aber entweder war außer einem Namensschild gar nichts zu sehen, oft nicht mal ein Mitarbeiter (bsp. Telerik) oder es waren alle Mitarbeiter im Gespräch wenn sie denn mal da waren (bsp. Intel). Da mir der Kontakt mit anderen Teilnehmern aber wichtiger war, bin ich natürlich nicht ständig um die Sponsoren-Tische drumherum gelaufen.
Schlußendlich habe ich aus genannten Gründen meine Stempelkarte nicht voll bekommen und so auch nicht am Gewinnspiel teilgenommen. Dafür aber gab es wieder eine offizielle DNC11-Tasse für das Abgeben des Bewertungsbogens am Schluss. Von den Farben her fand ich die letztes Jahr schöner, aber hey – Geschmack ist subjektiv, oder? Nur hätte ich statt dem QR-Code einen Microsoft-Tag verwendet. Das passt imho doch ein wenig besser zu .NET-Entwicklern ;-) Da fällt mir ein, ich muss mir noch eine QR-Reader-App für mein WP7 suchen um rauszufinden, was sich dahinter verbirgt…
Gesamtwertung: 



+
Es kommt immer auf das Gesamtpaket an und das Orga-Team rund um die dotnet Cologne hat es sich ja zur Aufgabe gemacht eine “Konferenz zu veranstalten, die man selber gerne besuchen würde”. Dieses Ziel ist ihnen auch dieses Jahr wieder vollends gelungen! Die Vorträge, die Organisation, die Lokation, die Teilnehmer und natürlich auch der wirklich unschlagbar niedrige Preis: Das alles zusammen ergibt eine wirklich großartige Konferenz, auf die ich gerne auch im kommenden Jahr wieder gehen werde! Deshalb ganz klar mein Resumé: Bravo! Super Leistung! Macht weiter so, es war großartig! Und der Zusatzstern ist extra noch für den Albert und seine Bemühungen, weil ich ihm den Stern bei seinem Vortrag leider abziehen musste. 
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 |
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
Vortragsfolien zu meinen Vorträgen auf der dotnet Cologne 2011
09.05.2011 00:49:42
|
Thomas Schissler
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
In 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"
PHP Un-/Serialize with C#
04.05.2011 12:46:00
|
Gordon Breuer

Did you ever had to use a web-service written in PHP that used the proprietary PHP functions to serialize data? Me neither, until a few days ago. It took me some time to find a library that can handle this data and unserialize it again. Granted, the serialization-format isn’t too complicated, but why should someone invest time into a problem already solved? And I was sure that I’m neither the first nor the only one facing this task.
The library in question is the Sharp Serialization Library on Sourceforge. The project was released on 2010-01-07 and is in beta. Also I am not quite sure if the supported types are a limitation of the library or if PHP doesn’t have more of them. It’s a few years ago since I last actively worked with this language. But the library covers all possible types for my duties, so I’m fine with it.
My only problem was: I need this library for a Windows Phone 7 project, but the used types “ArrayList” and “Hashtable” aren’t compatible with the Silverlight 3 Subset of the framework. So I rewrote the accordingly parts of the library with “List<>” and “Dictionary<>” and voíla, now I can use it within my WP7-project, too!
Here is the sourcecode of my changes for your convenience:
/*
* Serializer.cs
* This is the Serializer class for the PHPSerializationLibrary
*
* Copyright 2004 Conversive, Inc.
*
* Modified for WP7-Silverlight by Gordon Breuer
*
*/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
namespace Conversive.PHPSerializationLibrary {
/// <summary>
/// Serializer Class.
/// </summary>
public class PhpSerializer {
//types:
// N = null
// s = string
// i = int
// d = double
// a = array (hashtable)
private readonly NumberFormatInfo _nfi;
public Encoding StringEncoding = new UTF8Encoding();
public bool XmlSafe = true;
//This member tells the serializer wether or not to strip carriage returns from strings when serializing and adding them back in when deserializing
private int _pos; //for unserialize
private Dictionary<List<object>, bool> _seenArrayLists; //for serialize (to infinte prevent loops) lol
private Dictionary<Dictionary<object, object>, bool> _seenHashtables; //for serialize (to infinte prevent loops)
public PhpSerializer() {
_nfi = new NumberFormatInfo { NumberGroupSeparator = "", NumberDecimalSeparator = "." };
}
public string Serialize(object obj) {
_seenArrayLists = new Dictionary<List<object>, bool>();
_seenHashtables = new Dictionary<Dictionary<object, object>, bool>();
return serialize(obj, new StringBuilder()).ToString();
}
//Serialize(object obj)
private StringBuilder serialize(object obj, StringBuilder sb) {
if (obj == null) return sb.Append("N;");
if (obj is string) {
var str = (string)obj;
if (XmlSafe) {
str = str.Replace("\r\n", "\n"); //replace \r\n with \n
str = str.Replace("\r", "\n"); //replace \r not followed by \n with a single \n Should we do this?
}
return sb.Append("s:" + StringEncoding.GetByteCount(str) + ":\"" + str + "\";");
}
if (obj is bool) return sb.Append("b:" + (((bool)obj) ? "1" : "0") + ";");
if (obj is int) {
var i = (int)obj;
return sb.Append("i:" + i.ToString(_nfi) + ";");
}
if (obj is double) {
var d = (double)obj;
return sb.Append("d:" + d.ToString(_nfi) + ";");
}
if (obj is List<object>) {
if (_seenArrayLists.ContainsKey((List<object>)obj))
return sb.Append("N;"); //cycle detected
_seenArrayLists.Add((List<object>)obj, true);
var a = (List<object>)obj;
sb.Append("a:" + a.Count + ":{");
for (int i = 0; i < a.Count; i++) {
serialize(i, sb);
serialize(a[i], sb);
}
sb.Append("}");
return sb;
}
if (obj is Dictionary<object, object>) {
if (_seenHashtables.ContainsKey((Dictionary<object, object>)obj))
return sb.Append("N;");
_seenHashtables.Add((Dictionary<object, object>)obj, true);
var a = (Dictionary<object, object>)obj;
sb.Append("a:" + a.Count + ":{");
foreach (var entry in a) {
serialize(entry.Key, sb);
serialize(entry.Value, sb);
}
sb.Append("}");
return sb;
}
return sb;
}
public object Deserialize(string str) {
_pos = 0;
return deserialize(str);
}
private object deserialize(string str) {
if (str == null || str.Length <= _pos)
return new Object();
int start, end, length;
string stLen;
switch (str[_pos]) {
case 'N':
_pos += 2;
return null;
case 'b':
char chBool = str[_pos + 2];
_pos += 4;
return chBool == '1';
case 'i':
start = str.IndexOf(":", _pos) + 1;
end = str.IndexOf(";", start);
var stInt = str.Substring(start, end - start);
_pos += 3 + stInt.Length;
return Int32.Parse(stInt, _nfi);
case 'd':
start = str.IndexOf(":", _pos) + 1;
end = str.IndexOf(";", start);
var stDouble = str.Substring(start, end - start);
_pos += 3 + stDouble.Length;
return Double.Parse(stDouble, _nfi);
case 's':
start = str.IndexOf(":", _pos) + 1;
end = str.IndexOf(":", start);
stLen = str.Substring(start, end - start);
var bytelen = Int32.Parse(stLen);
length = bytelen;
if ((end + 2 + length) >= str.Length) length = str.Length - 2 - end;
var stRet = str.Substring(end + 2, length);
while (StringEncoding.GetByteCount(stRet) > bytelen) {
length--;
stRet = str.Substring(end + 2, length);
}
_pos += 6 + stLen.Length + length;
if (XmlSafe) stRet = stRet.Replace("\n", "\r\n");
return stRet;
case 'a':
start = str.IndexOf(":", _pos) + 1;
end = str.IndexOf(":", start);
stLen = str.Substring(start, end - start);
length = Int32.Parse(stLen);
var htRet = new Dictionary<object, object>(length);
var alRet = new List<object>(length);
_pos += 4 + stLen.Length; //a:Len:{
for (int i = 0; i < length; i++) {
var key = deserialize(str);
var val = deserialize(str);
if (alRet != null) {
if (key is int && (int)key == alRet.Count)
alRet.Add(val);
else
alRet = null;
}
htRet[key] = val;
}
_pos++;
if (_pos < str.Length && str[_pos] == ';')
_pos++;
return alRet != null ? (object)alRet : htRet;
default:
return "";
}
}
}
}
LightCore Bootstrapper für Caliburn.Micro
03.05.2011 23:59:00
|
Thorsten Hans
CaliburnMicro 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.
REST using the WCF Web API – POST it!
03.05.2011 23:37:00
|
Alexander Zeitler

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:
Hurry up for ShareCamp 2011
03.05.2011 07:18:06
|
Thorsten Hans
11 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
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

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.

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.

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.

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.