Wer lesen kann ist klar im Vorteil. Hinter diesem Spruch steckt immer wieder etwas Wahrheit. Das hat sich auch heute mal wieder gezeigt.
Für das Prüfen vom Verhalten von Websites in den verschiedenen Versionen von Internet Explorer bietet Microsoft Virtual PC Images an. So weit so gut. Ein Problem ergibt sich dann, wenn der Kennwortschutz greift und der Rechner geperrt ist, denn dann muss man das Kennwort des Benutzers IETest kennen. Und wenn man Microsoft kennt, dann ist es meist irgend eine Mutation des Wortes "password" - aber auch da gibt es noch mehrere Möglichkeiten.
Manchmal ist es einfacher als gedacht denn die Lösung findet sich in der mit ausgelieferten readme.txt - aber wer liest schon die readme.txt. Daher hier der Tipp für alle Nicht-ReadMe-Leser. Das Kennwort der aktuell gültigen Images ist: P2ssw0rd

Nun ist es gut eine Woche her, seit die See# Party in Kreuzlingen stattgefunden hat - höchste Zeit für ein Review!
Location:
Das Sport- und Kulturzentrum Dreispitz in Kreuzlingen ist nur ein paar Gehminuten vom Bahnhof Kreuzlingen-Hafen entfernt, somit ideal erreichbar mit den öffentlichen Verkehrsmittel. Das Zentrum selber bot genügend Platz für Sessions, Essen, Eingangsbereich etc.
Sessions:
Die Sessions haben mich von der Keynote bis zur Verlosung überzeugt. Die Keynote von Golo Roden mit dem Thema "ALT.NET" bot einen idealen Einstieg für die weiteren Sessions, welche sich teilweise natürlich mit demselben Thema beschäftigten. Leider standen sehr interessante Vorträge in der Agenda, welche parallel gehalten wurden. Somit brauchte es vor jeder Session eine schwierige Entscheidung.
Organisation:
An der Organisation gab es aus meiner Sicht gar nichts zu bemängeln - die Agenda wurde eingehalten, jeder bekam etwas zu essen und man organisierte sogar fast haargenau für jede Person einen Preis bei der Verlosung am Schluss ;-)
Essen:
Kaffee, Gipfeli, Kuchen, Früchte ... und ich könnte noch weiter aufzählen. An den Snacks zwischendurch fehlte es absolut nicht, wobei mir auch das Mittagessen gut schmeckte.
Preis:
Man könnte auch den doppelten oder dreifachen Preis verlangen, das Preis- / Leistungsverhältnis würde immer noch stimmen - mehr gibt es dazu nicht zu sagen!
Fazit:
Microsoft könnte sich ruhig ein Stück vom Seesharppartykuchen abschneiden, im Vergleich zu den Tech Days 2010 war diese Veranstaltung um Welten besser. Mich würde es freuen, auch in Zukunft einen Kalendereintrag mit dem Namen "See# Party" erstellen zu können.
Langer Rede kurzer Sinn: Absolut empfehlenswert, weiter so!
Neulich wurde ich gefragt, ob das CCD-Wiki es ernst meine mit der Empfehlung, 6 Fachbücher pro Jahr zu lesen. Das sei doch wohl etwas viel verlangt. Hm… ist das wirklich viel, ja, zuviel verlangt von geplagten Softwareentwicklern? 6 Fachbücher lesen pro Jahr, also alle 2 Monate ein anderes. Oder wenn wir mal 400 Seiten pro Fachbuch annehmen, knapp 7 Seiten pro Tag lesen. Jahrein, jahraus… Das
Vor einem Monat stellte Robert die Sinnfrage bezüglich der Verwendung einer „3-Schichten-Architektur“, dem wohl gängigsten Modell für (kleine) Applikationen und Websites. Auch ich arbeite so. Seit wenigstens 5 Jahren, auch wenn ich damals die Klassen für den Datenzugriff noch nicht Repositories genannt habe.
Vor drei Wochen bin ich an den Punkt gekommen, an dem ich mit meinen Repositories und Linq to Sql als OR-Mapper in ein Dillema kam. Nehmen wir mal folgendes Szenario: es gibt einen Artikel, der von einem User veröffentlicht worden ist. Dieser Artikel kann von anderen Usern kommentiert werden. In Code ausgedrückt sähe das so aus:
1: public class Article
2: {
3: public int ID { get; set; }
4: public string Headline { get; set; }
5: public string Text { get; set; }
6: public User Author { get; set; }
7: public IEnumerable<Comment> Comments { get; set; }
8: }
9:
10: public class User
11: {
12: public int ID { get; set; }
13: public string Name { get; set;
14: }
15:
16: public class Comment
17: {
18: public int ID { get; set; }
19: public User Author { get; set; }
20: public string Text { get; set; }
21: }
Nun wird der Artikel in unterschiedlichen Formen verwendet. Bei einer Auflistung aller Artikel beispielsweise interessiert als Information lediglich die Überschrift und eventuell noch der Name des Autors und die Anzahl der Kommentare. Nicht aber, wer die Autoren der einzelnen Kommentare sind. Was also tun?
Möglichkeit 1:
An Stelle der „echten“ Objekte werden nur die Foreign-Keys verwendet. Article und Comment enthalten also keine Eigenschaft „User Author“, sondern nur „int AuthorID“. Damit ist die Möglichkeit geschaffen die weiteren Informationen bei Bedarf zu holen, man spart sich aber den zeitintensiven Aufwand dies automatisch zu tun.
1: public interface IArticleRepository
2: {
3: Article GetArticleByID(int id);
4: IEnumerable<Article> GetAllArticles();
5: }
6:
7: public interface IUserRepository
8: {
9: User GetUserByID(int id);
10: }
11:
12: public interface ICommentRepository
13: {
14: IEnumerable<Comment> GetCommentsByArticle(int articleID);
15: }
Möglichkeit 2:
Man nutzt die Objekte wie oben dargestellt und lädt immer alle Informationen und mappt diese dann auch.
Möglichkeit 3:
Man nutzt „Lazy Loading“, ein Design Pattern, welches kurz gesagt dafür sorgt, dass die benötigten Informationen erst dann geladen werden, wenn sie auch benötigt werden. Bei der Auflistung aller Artikel würden die Autoren der Kommentare zu den Artikeln also nicht geladen, bei der Detaildarstellung des Artikels plus aller seiner Kommentare hingegen schon. Den Aufrufer muss das aber nicht interessieren, er nimmt sich, was er benötigt und was das API hergibt.
Bisher
Die Realität sah bei mir jahrelang so aus, wie in 1. beschrieben. Im Web muss man einfach noch mehr auf Performance achten, als anderswo. Doch das hat natürlich massive Implikationen auf das „Design“ der Anwendung, wenigstens auf die Art und Anzahl der Methoden des Repositories. Einfach weil man für jeden (Sonder-)Fall eigene Zugriffsmethoden braucht, insbesondere bei Collections.
Irgendwann kam mir dann die Erkenntnis, dass „richtige“ Objekte natürlich attraktiver sind und man sich so einen Haufen Methoden spart. Nur ist es ziemlich gefährlich und blödsinnig, beim Kommentar den User nur bei GetArticleByID() zu setzen, nicht aber bei GetAllArticles(). Das funktioniert höchstens so lange, wie man selbst damit arbeitet, und auch nur am Anfang. Nach 2 Monaten bemerkt man erst bei der nächsten NullReferenceException, dass der Autor nicht gesetzt ist. Und welche Implikationen hat es dann, wenn man ihn nun doch setzt? Also erweitert man das Repository um eine weitere Methode ...
Dass das keinen Sinn macht, war schnell klar. Also füllte ich einfach jedes Objekt, so dass es in jeder Situation verfügbar war. Die Performance-Implikationen wurden daraufhin sofort deutlich. Um beim Beispiel zu bleiben: Nehmen wir drei Artikel mit insgesamt 50 Kommentaren. Für die Darstellung dieser drei Artikel in der Übersicht wird nun 53 Mal IUserRepository. GetUserByID() aufgerufen – obwohl 50 Aufrufe davon völlig blödsinnig sind.
Dagegen hilft dann nur massives Caching – was aber nicht die Aufrufe reduziert und damit das Grundübel beseitigt, sondern lediglich den Effekt der einbrechenden Performance kaschiert.
Der neue Ansatz
Da ich nichts davon halte, die vom OR-Mapper generierten Objekte als mein „Model“ in der gesamten Anwendung zu verwenden, habe ich schon immer eigene POCOs verwendet, auf die dann gemappt wurde.
Früher schon mit dem SqlDataReader, in den letzten Jahren dann mit Linq to Sql. Dazu habe ich am Repository immer eine harte Grenze gezogen: das heißt ich habe immer List<> statt IEnumerable oder IQueryable geliefert, um zu verhindern, dass Datenzugriffe zu einem späteren Zeitpunkt ausgeführt werden und zu ungewünschten Seiteneffekten führen (wenn die Verbindung zur Datenbank z.B. wieder geschlossen ist). Das alles verhinderte auch den leichten Einsatz von Lazy Loading.
Also war es an der Zeit sich nach Alternativen umzusehen. Meine Wahl fiel dabei auf Fluent NHibernate und Linq to NHibernate. Das hat mich zwar viele Stunden und sicher einige graue Haare gekostet (insbesondere bei den Mapping-Tests), doch unterm Strich habe ich genau das erhalten, was ich haben wollte: Ich kann meine eigenen Objekte weiterverwenden und dabei zu 100% Lazy Loading nutzen.
Das hat natürlich enorme Auswirkungen auf das Design, da viele Methoden der vorhandenen Repositories wegfallen. Im Grunde benötige ich jetzt nur noch das:
1: public interface IArticleRepository
2: {
3: Article GetArticleByID(int id);
4: IEnumerable<Article> GetAllArticles();
5: }
Und wie ist das nun mit den Repositories?
Der Charme, der Repositories innewohnt, bassiert auf dem Gedanken, dass man die dahinter liegende Technologie für den Datenzugriff beliebig austauschen kann. Z.B. habe ich kürzlich eine zwei Jahre alte Komponente erweitert, bei der ich damals noch mit ADO.NET und Stored Procedures arbeitete [sic!]. Hier war es kein Problem neue Funktionen mit Linq to Sql im Repository zu erweitern.
Allerdings funktioniert das immer nur dann, wenn man keine massiven Feature-Unterschiede zwischen den Technologien hat, deren Vorteile man dann hinter den Mauern des Repositories verstecken muss. Ein Punkt, vor dem Ayende gewarnt hat, und der auch Anlass für Roberts Post gewesen ist. Und welcher nun erreicht ist.
Mit jeder Technologie, das wird hier deutlich, ändern sich sehr wahrscheinlich auch die Anforderungen an das Repository bzw. sein API. Wo ich mit Linq to Sql mangels Lazy Loading zwangsläufig andere bzw. mehr Methoden benötigte, reduziert sich das mit NHibernate ganz deutlich.
In diesem, zugegeben sehr reduzierten, Beispiel entfallen nun sogar IUserRepository und ICommentRepository komplett, da die hier bereitgestellten Methoden nicht mehr benötigt werden – das Mapping von NHibernate macht sie obsolet.
Was mich zur nächsten Frage bringt:
Kann man auf Repositories nicht gänzlich verzichten?
Der Hauptkritikpunkt aus der Praxis, die stupiden Aufrufweiterleitungen aus der Businessschicht, die auf den ersten Blick nur Redundanzen im Code erzeugen, bleibt ja bestehen. Und wenn die einfache Austauschbarkeit entfällt und das API der Repositories und damit auch deren Nutzung in den Business-Klassen bei einer Änderung sowieso mit hoher Wahrscheinlichkeit geändert werden müssen, dann kann man doch gleich darauf verzichten und wie von Ayende vorgeschlagen NHibernate direkt dort verwenden. Oder?
Ein Punkt bleibt: die Testbarkeit. Der zweite massive Vorteil der Repositories sind ihre lose Koppelung vom Rest der Anwendung, was auch bedeutet, dass sich die Business-Klassen sehr einfach testen lassen. Man mockt den Datenzugriff dort einfach weg und spart sich eine Menge Overhead.
Wie ist das nun mit NHibernate? Ich fasse mich kurz: ISession lässt sich natürlich mocken, da aber der Zugriff auf das mir lieb gewonnene Linq to NHibernate über eine Extension-Method funktioniert, ist es unmöglich den Datenzugriff ohne Verwendung einschlägiger kommerzieller Mocking-Tools zu faken.
Was bliebe wäre der Einsatz einer echten Datenbank, was aus den Unit- nicht nur Integrationstests machen würde sondern auch viel Performance und Zeit kostet. Zumal ich aus meinem steinigen Weg hin zu funktionierenden Mapping-Tests weiß, dass es einen massiven Unterschied macht, ob man nun eine In-Memory-SQLite-Datenbank oder eben eine „richtige“ SQL-Server-Datenbank verwendet (wenn man diese auch produktiv einsetzen möchte).
Fazit
Das Konzept von Fluent NHibernate und NHibernate überhaupt gefällt mir gut, nicht nur weil es mir die Möglichkeiten des Lazy Loadings geschenkt hat und den Code für den Datenzugriff massiv reduziert hat.
Ich werde es definitiv in der Praxis testen, ein größeres Projekt, an dem ich arbeite, ist bereits vollständig umgestellt.
Allerdings werde ich die Zugriffe weiterhin in Repositories kapseln, um meine Business-Klassen so einfach testbar zu halten, wie bisher auch. Zumindest so lang, bis mir jemand einen Weg zeigt, wie die Aufrufe zu mocken sind ;-).
| Kommentieren | © 2010 Thomas Bandt
Vor zwei Wochen bin ich über Norbert Eder auf das Buch "Ich bin dann mal offline" von Christoph Koch aufmerksam geworden. Der Autor ist zwar inzwischen wieder online, der von ihm durchgeführte und im Buch beschriebene Selbstversuch, bei dem er 40 Tage "abstinent", also ohne Internet und Handy lebte, ist aber dennoch eine Empfehlung wert. Und zwar für jeden, der diese Zeilen in seinem RSS-Reader liest oder auf den Beitrag über meinen Tweet gelangt ist, der gleich folgen wird ...
Das Buch will weder Wasser auf die Mühlen aller Internet- und Technik-Spektiker sein, noch ein Ratgeber für den richtigen Umgang mit den nun nicht mehr so neuen Medien. Es kommt vollkommen ohne Moralkeule aus. Vielmehr ist es ein locker geschriebener Erlebnisbericht darüber, wie es denn nun ist, wenn man sich plötzlich von seiner digitalen Außenwelt abkoppelt und nur noch per Post, Festnetztelefon oder persönlich zu erreichen ist. Das ist vor allem deshalb interessant, weil auch Koch zuvor auf allen Kanälen verfügbar war.
Er reflektiert dabei viele (Neben-)Effekte seines Selbstversuchs und gibt damit gleich mehrfach interessante Denkanstöße für den Leser. Muss man ständig auf allen Kanälen verfügbar sein und jede noch so banale Information sofort aufsaugen? Sich über jeden Furz seiner Facebook-Freunde benachrichtigen lassen? Ist es noch richtig, vor dem Einschlafen die letzten Tweets in der Timeline zu lesen? Muss man Leute aus Höflichkeit als Facebook-Freunde akzeptieren? Und überhaupt: welchen Wert haben digitale 'Freunde' überhaupt?
Viele der kleinen Geschichten könnten auch aus meinem Leben stammen, viele seiner Verhaltensweisen habe ich auch. Man nehme z.B. das ALT+TAB-Phänomen, bei dem ich, wenn ich gerade keine Lösung für ein Problem bei meiner Arbeit finde, einfach mal zum Twitter-Client, Outlook oder den Browser wechsle und gucke was es so Neues gibt. Der kleine Versuch Zertreuung zu finden, resultiert dann häufig in noch schlechterer Konzentration und noch schlechteren oder zumindest zeitlich verzögerten Ergebnissen. So geht es Koch auch, auch wenn die Arbeit bei ihm eine andere ist (ich programmiere, er schreibt - beides kreative Prozesse). Dabei habe ich schon selbst einmal beiläufig festgestellt, dass meine Kreativität steigt, wenn ich Outlook und Twitter einfach abschalte.
In Zukunft werde ich das nun häufiger tun, wie auch noch ein paar andere Sachen ändern, ohne gleich in den Wald zu ziehen und mich ganz von der Welt abzuschotten. Mein iPhone bekommt Schlafzimmerverbot, der Funkwecker ist bereits bestellt (so ein Ding besitze ich seit Jahren nicht mehr!). In zukünftigen Strandurlauben bleibt mein Telefon zu Hause (nur auf Städtetrips nehme ich es weiterhin mit, einfach weil es so praktisch ist).
Außerdem habe ich meinen Facebook-Account gelöscht. Zum zweiten Mal. Der erste Versuch ist an den Dämonen in meinem Kopf gescheitert. Vielleicht verpasse ich ja was? Und überhaupt: Facebook wird für das Geschäft immer wichtiger, da kann ich mich nicht einfach ausklinken. Alles Quatsch. Ich brauche Facebook nicht. Im Moment jedenfalls nicht. Also weg damit.
Fazit: das Buch ist eine Empfehlung für alle, die "ständig online" sind, weil es eine furchtbar gute Grundlage zur Reflektion des eigenen Handelns bietet und sich dabei noch locker flockig liest, ohne ein schlechtes Gewissen einreden zu wollen.
| Kommentieren | © 2010 Thomas Bandt
Die STL Implementierung wurde klar hinsichtlich “perfect forwarding” überarbeitet (Siehe C++0x). Allerdings sind dabei auch einige Sachen reingerutscht die dazu führen, dass sich mancher Code nicht mehr kompilieren lässt.
So führen die nachfolgenen Zeilen zu einem Compiler Fehler:
std::pair<void*,void*> p(0, NULL);
// fails with error C2440: 'initializing' : cannot convert from 'int' to 'void *'
Gleiches negatives Ergebnis erhält man, wenn man die folgenden Zeile kompiliert:
vector<void*> v;
v.insert(v.begin(),NULL);
Der Hintergrund wird hier in dieser Connect Meldung beleuchtet:
https://connect.microsoft.com/VisualStudio/feedback/details/520043/error-converting-from-null-to-a-pointer-type-in-std-pair?wa=wsignin1.0
Das Problem ist, das 0 (NULL) sich zwar brav in einen Zeiger umwandeln lässt. 0 (NULL) bleibt aber deshalb dennoch vom Typ her ein int ist wird nicht zu einem Zeiger. Die typensichere Implementierung in der STL führt nun dazu, dass 0 (NULL) nicht als void* akzeptiert wird.
Einzige Lösung und auch mein Rat:
Man verwendet nicht mehr 0 oder NULL, wenn ein NULL-Zeiger gemeint ist, sondern nullptr 
Wer Code kompatibel zu VC-2008 und früher halten muss, kann ja in seinen Headern den folgende Definition einführen:
#if _MSC_VER<1600
const int nullptr = 0;
#endif
Mehr zu perfect forwarding liest man hier:
http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm
http://thbecker.net/articles/rvalue_references/section_07.html
Wie auch aus dem Connect Artikel zu entnehmen ist kann man damit rechnen, dass sich in VC11 alles wieder etwas zurückentwickeln wird. D.h. std::pair und auch die insert Befehle der Container sollen wirde brav 0 aktzeptieren können, wenn Zeiger gemeint sind. Gleiches bekam ich auch über meine Kontakte zur Produktgruppe zu höhren. Aber was VC11 betrifft ist alles sowieso nur Zukunftsmusik und alles noch im dichten Nebel und was wirklich Realität wird muss man dann wohl erst mal sehen
Copyright © 2010 Martin Richter
Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.
(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)
Themenverwandte Beiträge:
In diesem Tipp geht es um die Verwaltung von String Ressourcen in .restext Dateien, welche beispielsweise bei der Lokalisierung Vorteile gegenüber üblichen .resx Dateien haben.
Zusammenfassung
Beim Verwalten von Texten als Ressourcen beispielsweise für die Lokalisierung werden üblicherweise .resx Dateien verwendet. Für Texte sind Dateien im .restext Format jedoch oft besser geeignet.
Beschreibung
Der Standardweg zum Verwalten von Ressourcen in .NET sind die XML-basierten .resx Dateien. Mit ihnen können Daten aller Art als sog. Embedded Resources in Assemblies eingebettet werden.
In .NET gibt es aber schon von Anfang an ein Format, mit dem man Text-Ressourcen sehr viel leichter erfassen und verwalten kann. Dabei handelt es sich um einfache Text-Dateien mit folgendem Aufbau:
; Kommentare beginnen mit ; oder #
; Texte werden als Name/Wertepaare aufgeschrieben
Bezeichner1 = Das ist ein Text.
Bezeichner2 = Das ist ein anderer Text.
Das ist schon alles, was man zum Aufbau dieser Dateien wissen muss. Bis einschließlich Visual Studio 2005 hatten diese Dateien einfach die Endung .txt und mussten mit dem SDK Tool resgen mehr oder weniger manuell in .resources Dateien konvertiert werden. Im Gegensatz dazu wurden .resx Dateien immer schon automatisch in .resources Dateien umgewandelt. Die .resources Dateien enthalten die Ressourcen in dem internen Format, wie sie in Assemblies eingebettet werden.
Seit Visual Studio 2008 kann man die Endung .restext anstatt .txt verwenden. Wenn man dann noch die Build Action auf Embedded Resource stellt, wird automatisch mit resgen eine entsprechende .resources Datei erzeugt und eingebettet.
Der Zugriff auf die Texte erfolgt wie bei .resx Dateien über die Klasse System.Resources.ResourceManager. Verschiedene Sprachen werden über den Dateinamen unterschieden. Beispielsweise enthält die Datei MyTextStrings.restext die neutrale bzw. default Sprache. Die Dateien MyTextStrings.de.restext und MyTextStrings.fr.restext enthalten die deutschen bzw. französischen Übersetzungen, die Datei MyTextStrings.de-CH.restext die schweizerischen Texte, die von denen aus MyTextStrings.de.restext abweichen usw. Der ResourceManager sucht abhängig von den UI-Einstellungen im laufenden Programm automatisch den richtigen Text heraus.
Der große Vorteil der .restext Dateien liegt in ihrem einfachen Format. Im Gegensatz zu dem für einfache Texte viel zu unübersichtlichen XML-Format der .resx Dateien kann man .restext Dateien ohne Weiteres einem Übersetzer geben. Dieser sieht sofort, was für ihn zu tun ist, wenn er die Datei in einem schlichten Texteditor öffnet. Als Einziges muss beachtet werden, dass die Datei im UTF-8 Format gespeichert werden muss, da resgen Unicode erwartet.
Die iqnite Konferenz hat sich zu einem wichtigen Instrument des Gedanken- und Ideenaustauschs innerhalb der Software Quality Community entwickelt. Unter anderem gibt es dort einen sehr interessanten Vortrag “Visual Studio 2010 Test Professional - Lücken zwischen Software Entwicklung und Testing schließen” der von Max Knor und Christian Tesch (SQS) vorgetragen wird. Übrigens, mehr zu dem Thema “Softwaretesten wie es sein sollte” finden Sie auf unserer Produktseite.
Agenda: Konferenzagenda
Wann: 13.10.2010
Wo: Wien, Studio 44
Konferenzwebseite: iqnite Konferenz
Kosten: 350 € (excl. MwSt)
Treffen Sie erfahrene Branchenkenner und ausgewiesene Experten, die derzeitige Standards und Trends in professioneller Umgebung vermitteln. Mit praxisnahen Strategien und fundiertem Wissen liefert iqnite Ihnen das Rüstzeug, um zum Erfolg Ihres Unternehmens beizutragen.
Die Konferenz bietet eine Kombination aus branchenübergreifenden Vorträgen, Keynotes, Workshops sowie eine Ausstellung. Alle Vorträge werden von Anwendern für Anwender präsentiert
Andreas Pollak
Product Marketing Manager Developer & Designer Tools

Mal ausnahmsweise kein Standard - so oder so ähnlich lässt sich beschreiben, was ich erreichen möchte. Ich möchte ein WPF-Fenster haben mit folgenden Eigenschaften:
- es soll eine fixe Innengröße haben - unabhängig von den Einstellungen für Rahmengrößen im Windows
- es soll einen 3D-Rahmen haben, der im Aero-Stil ist, wenn das Betriebssystem die Voraussetzungen dazu bietet
- es soll kein Menü und auch keine Systemschaltflächen haben
Das hört sich eigentlich gar nicht so schwer an, besonders wenn man sieht, dass die Standardeinstellungen für Fenster schon ziemlich nah am Ziel sind. Ein Fenster mit WindowStyle=None und ResizeMode=NoResize erfüllt die erste und die dritte Anforderung; ein Fenster mit WindowStyle=None und ResizeMode=CanResize erfüllt die zweite und dritte Anforderung. So könnte auch alle anderen Kombinationen durchgehen - alle sind nah dran, aber keine erfüllt alles.
Mein Ansatz ist nun, ausgehend von WindowStyle=None und ResizeMode=NoResize das Fenster so zu verändern, dass es eine Border bekommt. Dazu verwende ich die Funktion SetWindowLong aus der user32.dll und eine geschickte Kombination aus mehreren Window-Stlyes.
static void SetBorder(Window target)
{
const int GWL_STYLE = -16;
const int GWL_EXSTYLE = -20;
var newStyles = NativeMethods.WindowStyleFlags.WS_VISIBLE | NativeMethods.WindowStyleFlags.WS_BORDER | NativeMethods.WindowStyleFlags.WS_THICKFRAME;
var newExStyles = NativeMethods.ExtendedWindowStyleFlags.WS_EX_TOOLWINDOW | NativeMethods.ExtendedWindowStyleFlags.WS_EX_APPWINDOW;
var interopHelper = new WindowInteropHelper(target);
NativeMethods.SetWindowLong(interopHelper.Handle, GWL_STYLE, (int)newStyles);
NativeMethods.SetWindowLong(interopHelper.Handle, GWL_EXSTYLE, (int)newExStyles);
}
WS_BORDER und WS_THICKFRAME lassen um mein Fenster einen 3D-Rahmen erscheinen, WS_VISIBLE sorgt dafür, dass das Fenster nach dem Deaktivieren auch wieder aktiviert werden kann. Zusätzlich definiere ich noch den erweiterten Style WS_EX_TOOLWINDOW, der dafür sorgt, dass das Fenster nicht mehr auf das Snapping in Windows 7 reagiert. Ohne diese Einstellung kann mit Hilfe der Tastenkombination [Windows] + [Pfeil links] bzw. [Windows] + [Pfeil rechts] doch noch die Größe verändert werden. Diese Einstellung hat jedoch auch einen Nebeneffekt. Tool-Windows können nicht mehr mit [Alt] + [Tab] erreicht werden. Um das zu beheben setze ich zusätzlich den Style WS_EX_APPWINDOW.
Durch die Änderungen an der Border kann das Fenster nun aber mit Hilfe der Maus in der Größe verändert werden. Um das zu verhindern setze ich einen Hook auf das Fenster, der die Window-Message abfängt, die prüft, ob der Mauszeiger sich ändern soll, um die Resize-Pfeile anzuzeigen.
static void DisableResizing(Window target)
{
var interopHelper = new WindowInteropHelper(target);
var hwndSource = HwndSource.FromHwnd(interopHelper.Handle);
hwndSource.AddHook(WndProcResizeHook);
}
static IntPtr WndProcResizeHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == (int)NativeMethods.MouseInputNotifications.WM_NCHITTEST)
{
handled = true;
return (IntPtr)1;
}
return (IntPtr)0;
}
Durch das Hinzufügen der Border hat sich auch noch geändert, dass die Innengröße sich um die Rahmenbreite verkleinert hat. Da die Border manuell hinzugefügt wurde, kann die neue Größe recht einfach ermittelt werden, in dem die Werte aus SystemParameters.ResizeFrameHorizontalBorderHeight und SystemParameters.ResizeFrameVerticalBorderWidth ermittelt und zur Fenstergröße hinzuaddiert werden.
static Size GetWindowSizeByClientSize(Size size)
{
Thickness borderThickness = new Thickness(0, 0, 0, 0);
borderThickness.Top = borderThickness.Bottom = SystemParameters.ResizeFrameHorizontalBorderHeight;
borderThickness.Right = borderThickness.Left = SystemParameters.ResizeFrameVerticalBorderWidth;
double width = size.Width + borderThickness.Left + borderThickness.Right;
double height = size.Height + borderThickness.Top + borderThickness.Bottom;
return new Size(width, height);
}
Das Ergebnis sieht so aus wie es soll:

Ein fixes Fenster mit Aero-Rahmen, das kein Aero-Snap vollführt, per [Alt]+ [Tab] erreichbar ist, das kein Menü hat und dessen Innengröße definierbar ist.
Ich hoffe, dass es sich auch so verhält wie es soll, denn die Eingriffe per PInvoke sorgen dafür, dass das Fenster eine andere Kombination von Flags hat als es vom Betriebssystem vorgesehen ist. Bisher macht diese Lösung aber einen guten Eindruck.
Die MSDN
Hotline feiert Geburtstag: Seit genau drei Jahren sorgt
die kostenlose Telefon-Auskunft inzwischen
dafür, dass rund um MSDN und
andere Microsoft-Entwicklerthemen keine Frage offen bleibt. Hinter dem Service-Angebot
steht das Team des Microsoft Education
Support Center (ESC) in Karlsruhe. Die Fachleute dort
helfen Entwicklern nicht nur im direkten Telefongespräch oder per Messenger weiter
– Montag bis Freitag jeweils von 12 bis 18 Uhr – sondern regelmäßig auch in den MSDN-Foren und
im Rahmen spezieller Webcasts.
Herzlichen
Glückwunsch
This post is powered by www.Giza-Blog.de |
Visit: MSDN
Online | Follow MSDN Online
on Twitter | Follow Kay
Giza on Twitter
Daily News on MSDN: MSDN
Aktuell
© Copyright
2006-2010 Kay Giza. All rights reserved. Legal
Der XNA Creators Club Online hat eine “Educational Series” über die Entwicklung von Spielen für das Windows Phone 7 gestartet.
Diese besteht aus einer Reihe von Labs, Beispielen und Artikeln und wird über die nächsten Monate hinweg um immer speziellere Themen erweitert werden.
Details…
Vom 20. bis 23.09. findet die Basta 2010 in Mainz statt. Das AIT TeamSystemPro Team ist unter anderem mit Nico Orschel als technischer Ansprechpartner am Microsoft-Stand vertreten. Wenden Sie sich also bei Fragen rund um Microsoft Visual Studio und Team Foundation Server vertrauensvoll an uns.
Außerdem laden wir Sie ein, unseren Sessions rund um das Thema “Team Development” beizuwohnen:
TFS 2010 Power Workshop: von 0 auf 100 durchstarten
Neno Loje
20.09.2010 | 09:30 - 16:30 Uhr
Scrum und TFS: gemeinsam unschlagbar!
Neno Loje und Jens Korte SYNDATO GmbH
21.09.2010 | 20:45 - 22:00 Uhr
Requirements- und Projektmanagement (mit Scrum) im TFS 2010
Neno Loje
22.09.2010 | 10:15 - 11:30 Uhr
Test Case Management & Tools für Tester im TFS 2010
Neno Loje
22.09.2010 | 14:00 - 15:15 Uhr
Unternehmensweite Build-Prozesse mit Team Foundation Build 2010
Sven Hubert
22.09.2010 | 17:15 - 18:30 Uhr
Wir freuen uns auf Sie!
Mein
neues Handy- ein HTC Wildfire mit Android…
Für die Leute die mich kennen
ist es schon fast ein Wunder, dass mein Handy nicht mit Windows läuft. Mein gutes
altes Windows Mobile Handy hat Probleme mit der Tastatur gehabt und ich habe leider
kein Windows Phone Entwicklungshandy bekommen… Tja und da hat es mich gepackt – nach
dem Test von einem Motorola Milestone wollte ich mehr über dieses neue Betriebssystem
erfahren. Wie kann es sein, dass man 200.000 Geräte am Tag auf den Markt bringt und
diese Modelle nahezu ausverkauft sind? Also habe ich es einfach mal probiert. Mittlerweile
kann ich nach dem Test von 6 Wochen sehr gut sagen, was ich von dem Gerät halt. Es
bringt einfach nichts alles toll oder alles Mist nach 2 Tagen zu schreiben.
Die Hardware – günstig
und hochwertig
Tja, ich habe immer noch nicht
geschrieben, ob ich es nach 6 Wochen nun toll finde oder nicht… Kommen wir daher erst
einmal zu den Fakten. HTC liefert mit dem Wildfire ein sehr gut verarbeitetes Gerät
aus. Dieses Gerät ist mit rund 240€ extrem günstig und spielt im unteren Segment eine
wichtige Rolle im Android Segment. Man bekommt ein sehr kleines aber schon leistungsfähiges
Handy. Darüber gibt es natürlich noch die Desire und i9000 Handys. Aber wenn ich später
doch auf Windows Phone 7 wechseln sollte, war es nicht so teuer und schön klein ist
auch nen riesen Vorteil.
Die Software – einfacher
Einstieg und ein perfekter Touchscreen als Basis
Die Hardware ist sicher nicht
so wichtig. Viel mehr kommt es mir ja auf die inneren Werte von dem Gerät an. Während
man bei dem Motorola Handy noch viel konfigurieren musste, liefert HTC mit der Sense
Oberfläche schon deutlich mehr mit. Ich habe ein gut eingerichtetes Handy in der Hand,
mit dem man sich auch fix zu Recht findet. Die unterstützende Bildschirmtastatur arbeitet
mit einer kleinen Vibration als haptische Rückmeldung sehr gut. Vor allem das direkt
ansprechende Touch-Display ist extrem gut zu bedienen. Da wirkt das schrubben mit
dem Stift bei Windows Mobile schon sehr altertümlich! Auch das hineinfindet in das
Betriebssystem geht sehr gut von der Hand. Selbst die ersten Anwendungen sind mit
dem gut zu bedienenden Android Market fix installiert.
Die Synchronisation –
erste Ernüchterung es gibt aber auch Lösungen für die Probleme
Neben dem Telefon und den SMS
sind die Kontakte, Termine und Mails auf einem Smartphone unheimlich wichtig. Das
Android Handy bietet einen Exchange Client mit an. Dieser ist einfach einzurichten
und braucht sogar nicht mal das dämliche Zertifikat, was das Microsoft Windows Mobile
benötigt hat. Abruf der Mails, Termine und Kontakte funktioniert super. Selbst die
Kontaktfotos sind dort, wo man sie braucht :) Doch gibt es leider nur Platz für ein
Exchange Konto. Aber wer hat überhaupt schon einen Exchange Server herumstehen? Hotmail
oder Yahoo boten bis Anfang der Woche noch kein Active Sync für die Mails an. Der
Abruf über POP3 ist für Hotmail bisher das Maximum und leider nicht überzeugend. Mit
IMAP kommt man etwas weiter – aber der Wechsel von Yahoo zu Gmail war dann doch die
Wahl. Gmail funktioniert, wie nicht anders zu erwarten, super mit dem Android Handy.
Seit dieser Woche gibt es Hotmail mit Active Sync – da man aber keine 2 Konten mit
Exchange im Android registrieren kann, fällt der Test leider erst mal flach :( Somit
heißt es weiter: it5000 per Exchange Client und privat per Google… Neben den Mails
kommen aber noch Kontakte und Termine in die Betrachtung. Gmail kann keine Kontakte
synchronisieren und die Anbindung für die Termine im Outlook ist mittelmäßig. HTC
bietet aber eine ordentliche Sync Software für den PC. Leider funktioniert dies aber
nicht Kabellos, sondern nur per USB oder Bluetooth. Das ist schade, da man ja alles
per Internet am liebsten machen möchte… Somit ist dieser Punkt sehr komfortabel gelöst
– aber nur wenn man sich von der Konstellation her auf ein System einigen kann.
Weitere Apps – Surfen
leicht gemacht auf dem mini Bildschirm
Neben dem die Synchronisation
steht ging es an die Suche nach den weiteren Anwendungen. Der Browser ist wirklich
toll und wenn man Flash ausschaltet auch echt fix. Somit hat Steve Jobs doch recht,
wenn er sagt das Flash auf solchen mobilen Geräten nicht so der Bringer ist. Kommt
aber doch mal eine Seite, die Flash braucht zeigt das Handy im Gegensatz zum iPhone
dieses Applet doch sauber an. Silverlight ist leider noch nicht verfügbar, was ich
extrem schade finde – aber dazu später mehr. Der Browser hat eine extrem geniale Funktion.
Die Zoom Funktion… Mit dieser Funktion kann man sich den Text einfach mit den Fingern
so groß einstellen, wie man es zum Lesen braucht. Was aber der absolute Hammer ist,
ist dass der Browser erkennt, welchen Abschnitt man lesen mag. Hier wird der Umbruch
genau so gemacht, dass man sauber lesen kann. Hierfür gibt es eine Top-Bewertung des
mobilen Browsens… Genial, wie das selbst auf dem recht kleinen Display von meinem
Wildfire geht. Den Opera Mini Browser, den ich getestet habe war bedeutend schneller,
da die Seiten auf dem Server nochmals komprimiert werden. Auch eine geniale Technik.
Aber mit diesem Zoom vom Chrome Browser kann man einfach noch mehr Zeit sparen.
Karten und Navigation
– Tolle Lösungen, wie man es von Google erwartet
Die Google Maps Anwendung ist
extrem gut auf dem Android Handy gemacht. Sie bietet sehr gute Orientierungen und
super Tipps und Tricks rund um den Standort. Die Navigation ist auch möglich. Ohne
Street-View kommt sie aber noch nicht mit den Navigons dieser Welt mit. Kostenlos
ist die Anwendung aber und daher kann man auch hier nicht meckern. Vor allem die extrem
schnelle GPS Positionierung ist super. Während mein Navigon 1-2 Minuten für die Positionierung
braucht, ist bei dem Android Handy die Position schon nach 5-10 Sekunden verfügbar.
Selbst die Wegaufzeichnung ist mit Tracks gratis. Speziell die Suche um die aktuelle
Position mit den Bewertungen von Qype ist kaum zu schlagen. Weltklasse, was einem
da mit dem Handy zur Verfügung steht! Über den Market gibt es noch weitere Navigationslösungen
– aber auch mein altes Windows Mobile Handy bot solche Möglichkeiten. Hier ist jedoch
alles integrierter und flotter. Das Android Betriebssystem ist generell Lichtjahre
schneller als das Windows Mobile.
Weitere Anwendungen - Der
Market und der Akku
Über die Suche von dem Android
Market findet man schon einiges. Auch die Beschreibungen und Bewertungen sind gut.
Aber eine Eingrenzung auf Themen ist da schon schwieriger. Je nach Gerät werden auch
nicht alle Anwendungen angezeigt. Bei dem neuen Wildfire Handy waren anfangs nur rund
30% der Anwendungen freigeschaltet. Nach und nach würde ich jetzt sagen, dass rund
80% verfügbar sind. Der Rest ist entweder nicht für das Wildfire geeignet (Auflösung)
oder der Entwickler hat es wohl vergessen… Ich habe daher auf der Seite Androidpit.de
weiter nach Anwendungen gesucht. Über diese Seite kann man auch Anwendungen als APK
Downloaden. Diese kann man dann selbst auf dem Handy installieren ohne den Market
zu nutzen. Die meisten Anwendungen liefen auch mit der kleinen Auflösung des Wildfire
gut. Ich finde es einfach nur toll, wie einfach und fehlerfrei eine solche Installation
von sich geht. Ich habe quasi, ob freigegeben oder nicht, nie einen Fehler mit einer
Anwendung gehabt. Android ist hier perfekt und sehr ausgereift. Die Anwendungen selbst
sind jedoch nicht alle Top. Im schlimmsten Falle saugen Sie ohne Verwendung im Hintergrund
Strom vom Akku. Dieser war mit schlechter Konfiguration und ohne Taskmanager fix leer
(maximal 1 Tag). Nach einer Weile Übung mit dem Taskmanager und den richtigen Anwendungen
ist es nun aber wieder voll OK von der Leistung her (3 Tage bei mittlerer Nutzung
– 2 Tage bei intensiver Nutzung).
Was für Apps braucht man
noch?
Neben den oben schon genannten
Hauptanwendungen braucht man einen Barcodescanner. Hier ist Barcoo echt super. Es
dient als guter Preisvergleich, für Produktangaben bei Lebensmittel und bei Links,
die zum Beispiel auf der Androidpit Seite zu finden sind. Von der Banking Anwendung
über Gebrauchtwagen bis zum Railnavigatior gibt es echt gute Software in dem Market.
Viele Anwendungen sind komplett kostenfrei. Andere sind für wenig Geld zu haben. Wer
auf Androidpit sich mein Profil ansieht kann auch sehen, was ich sonst noch für Anwendungen
nutze und damit auch empfehle… Ich will mich jetzt nicht weiter mit Anwendungen aufhalten,
bin aber immer noch über das geniale Deployment über den Market begeistert.
Einstellungen – Nicht
so überfrachtet wie Linux und einfach erlernbar
Wenn man davon ausgeht, dass Unix
Android als Basis dient, würde man denken, dass es das gleiche Chaos wie Linux ist.
Das kann man aber nicht sagen. Es wird einem nur das angeboten, was man wirklich braucht.
Man kann am Android Handy nicht wirklich alles frei einstellen, wie man es bei Linux
könnte. Dafür stimmt die Oberfläche und die Bedienung, wie man es auch bei Google
erwarten würde. Somit ist das Android System sicher kein weiterer Linux Clone, der
schlecht zu bedienen ist. Dass man einen Filemanager erst noch installieren muss,
finde ich schon schade – aber auch hier gibt es Clients, die direkt Netzlaufwerke
mounten können. Dies konnte nicht mal Windows Mobile so einfach!
Programmierbarkeit – Es
ist kein Visual Studio und kein Hyper-V!
So, nun wollte ich auch mal testen,
wie man für das Android Handy programmieren kann. Das SDK heruntergeladen und installiert.
Hiermit kann man virtuelle Maschinen mit Android aufbauen. Leider ist das System aber
von der Bedienung nicht so gut. Man hätte hier von Google lieber etwas bestehendes,
wie Virtual Box nutzen sollen. Aber Google hat Streit mit Oracle und funktionieren
tut es auch so… Was mich total aufregt ist aber, dass der Market in diesen Maschinen
nicht verfügbar ist. Somit kann man nicht einfach mal testen… Nur wenn man Android
1.6 nimmt geht der Market. Man kann so APK Dateien selbst installieren – aber richtig
durchdacht ist der Verzicht auf den Market in der virtuellen Maschine nicht! Na gut,
jetzt kommt das erste Hallo Welt mit Eclipse. Auch dies ist mit der Anleitung als
Plugin möglich und auch machbar. Aber so Anwenderfreundlich ist die Installation auch
hier nicht. Und wo ist der GUI Designer? Hier darf man sich XML Dateien für die Oberfläche
generieren. Die Entwicklung ist für einen Visual Studio experten echt eine ernüchternde
Sache! Das Programmieren macht einfach keinen rechten Spaß. Wäre Silverlight schon
verfügbar, wäre alles im Lot. So kann man nur hoffen, dass sich hier etwas tut. Für
Microsoft stellt dies eine große Chance dar. Die Entwicklung für Windows Phone 7 ist
echt smart und wenn Silverlight für Android verfügbar ist, braucht man nur 1x zu Programmieren.
So kann übrigens auch Nokia Silverligt. Hier könnte Microsofts Rettung liegen. Denn
auch auf dem Tablet kann ich mir mittlerweile Android sehr gut vorstellen! Erfolgt
die Programmierung jedoch mit Silverlight haben auch die Entwickler etwas von dem
Trend und Microsoft setzt seine Produkte als Konkurrent gut ins Rennen…
Fazit – Geniales System
aber schlechte Anwendungsentwicklung
Ich kann nur als Fazit sagen,
dass Android eine tolle Plattform im Betrieb ist. Nach so einer kurzen Entwicklungszeit
hat man ein sehr gutes Betriebssystem, was auch Windows 7 auf den Tablet Geräten gewaltig
Konkurrenz machen wird. Auch Windows Phone 7 gebe ich dank der miesen Programmiermöglichkeiten
noch eine gute Chance. Mal sehen, wo Android in einem Jahr steht… Ich bin schon begeistert,
was Google hier so auf die Beine gestellt hat!

Wussten
Sie: 99,5% der MSDN Online-Angebote gibt’s zum Nulltarif! Wer’s nicht glaubt, findet
im MSDN-Forum eine hilfreiche Übersicht
all der kostenfreien Services, die das Microsoft
Developer Network (MSDN) im Web für die Entwickler-Community bereithält. Dass
die zahlreichen Infos & Ressourcen zwar komplett kostenlos abrufbar, aber beileibe
nicht umsonst sind, zeigt schon ein oberflächlicher Blick auf das Material: tonnenweise
Fachartikel, Video-Tutorials, Webcasts, News, dazu Downloads, Vor-Ort-Events, FAQs
und vieles mehr.
Welch
vielfältige Unterstützung MSDN Entwicklern bietet, wollen wir in den kommenden Tagen
hier bei MSDN
Aktuell (RSS-Feed)
immer wieder mal in den Fokus stellen – in einer kleinen Inforeihe mit dem Titel „MSDN
Hilfe & Support“.
This post is powered by www.Giza-Blog.de |
Visit: MSDN
Online | Follow MSDN Online
on Twitter | Follow Kay
Giza on Twitter
Daily News on MSDN: MSDN
Aktuell
© Copyright
2006-2010 Kay Giza. All rights reserved. Legal
Das Training Kit enthält Demos und Labs zur Einführung und Vertiefung von Visual Studio LightSwitch Beta 1. Developer finden advanced Hand on Labs!
Jetzt downloaden

Hauptfeedback auf die Frage, ob man nicht mal eine eigene App für das neue Windows Phone 7 schreiben möchte ist wohl: “Is n bissl lame so ganz ohne Hardware”. Ja, ich weiß. Leider. Aber dank Peter Nowak gibt’s endlich mal eine Möglichkeit seine eigene Applikation mal auf ein echtes Telefon zu spielen, um zu sehen wie es so läuft. Das alles im Rahmen der NRW Conf 2010. Peter verspricht außerdem 2 Gutscheine für sein Buch zu verschenken.
Infos, wie es abläuft und wo ihr unterschreiben müsst, gibts beim Kollegen Peter.
http://blogs.compactframework.de/Peter.Nowak/2010/08/30/NRW+Conf+2010+Eigenen+WP7+Code+Auf+Einem+Echten+Geraumlt+Testen.aspx
Take your IT Career to its next destination. Microsoft Certification Packs with Free Second Shots can help you get your Certification, validate your knowledge, launch your career, or move your next position. Purchase packs of one to five exams along with free re-takes on every exam purchased and save up to 20%.
WorkItems löschen, eigentlich ein einfacher Task, denkt man. Im TFS ist dafür keine Funktion in der UI vorgesehen. Jedoch kann man sich dem WorkItem Tracking Administration Tool bedienen. Über die VS-Kommandozeile kann man mittels witadmin destroywi Workitems...(read more)
Die Zeiten sind auf Community Events geeicht. Oder soll ich besser sagen Community Conference? Ich bleibe vorerst mal bei Community Conference. Eines dieser Community Conferences war letztes Wochenende: die See#.
See#
Das von der .NET Usergroup Konstanz-Kreuzlingen organisierte Event hatte eine eine sehr ansprechende Agenda und hochkarätige Speaker zu bieten. Meine Sessionliste:
- Windows Phone 7 Applications mit Silverlight, Laurent Bugnion
- IronRuby für .NET Developer, Thorsten Hans
- ADO.NET Entity Framework in N-Tier Applikationen integrieren, Robert Meyer
- Code-Generierung mit dem Text Template Transformation Toolkit (T4), René Leupold
Besonders schade fand ich, dass ich in Ermangelung meiner Parallelisierungsfähigkeiten bei folgenden Sessions nicht dabei sein konnte, denn sie hätten mich brennend interessiert:
SL4@WP7
Naja, nicht so schlimm, denn ich wurde von meiner Sessionwahl keineswegs enttäuscht. Den Anfang machte Laurent mit Windows Phone 7 Entwicklung. Angenehm: er spricht deutsch! Er gab einen guten Überblick über die Funktionen des neuen WP7 und die Programmiermöglichkeiten, darunter Silverlight. Highlight hierbei ist sicherlich, dass Laurent live in der Session gegen ein echtes Device die Programmierbeispiele ausgeführt hat und mit der Webcam dem Publikum gezeigt hat. Nice!
IR
Danach ging es schon weiter. Thorsten Hans zeigte in seiner IronRuby-Session wirklich beeindruckend, dass das .NET Framework mit der CLR und DLR eine revolutionäre Programmierplattform ist. Er ging zunächst auf die DLR und deren Komponenten ein und steigerte während seiner Session stetig den Geekfaktor. Zunächst zeigte er, wie man mit IronRuby umgeht – das Handwerkszeug sozusagen. Danach wurde es schon cooler: .NET-Assemblies und IronRuby im Zusammenspiel: IronRuby-Skripte (mit Scope & Context) aus .NET-Anwendungen aufrufen und vice versa. Als Beispiel zeigte Thorsten eine in Ruby geschriebene Validierung einer Kunden-Registrierung eines .NET-Programms. Ich war beeindruckt! Doch Thorsten ließ nicht locker und haute zum Schluß noch einen richtigen Knaller raus: Unit Testing einer .NET-Komponente mit IronRuby & RSpec!
Gut, dass danach die Mittagspause anstand, dass musste ich erst mal verarbeiten :) In der Pause hatte ich dank Basti auch die Gelegenheit, den von Thomas getesteten Sony Vaio VPCS12V9E/B selbst einmal “anzutesten”. Ich muss sagen, dass Thomas die Messlatte ganz schön hoch legt, denn für meinen Geschmack ist die Verarbeitung des Sony wirklich gut. Das Gehäuse ist kein Shiny-Alu-Guß, aber auch kein Plastik. Die Chiclet-Tastatur ist ok, der Druck relativ sensibel. Performance gut, Display in Ordnung.
EF4
Nach der Mittagspause ging es zu Robert’s Entity Framework Session. Er ging zunächst auf die “Schwierigkeiten” der ersten Version des Entity Frameworks ein, um danach gleich mit den Neuerungen von EF4 nachzulegen. An seinem Vortrag besonders gefallen haben mir die vielen kleinen Beispiele aus der Praxis, mit denen Robert seine Expertise in diesem Bereich einmal mehr zu unterstreichen wusste. In der zweiten Hälfte der Session widmete er sich den neuen Features wie (echten) POCO-Support, Domain-First-Design und natürlich dem IObjectSet<T>. Robert ging auch auf Testbarkeitskriterien von EF4-Lösungen ein und nennte einige Leitfäden zum Testing. Fazit: eine guter EF4 Überblick mit wertwollen Praxisbeispielen vom Experten.
T4
Die letzte Session hatte es in sich: T4. René zeigte zunächst die Grundlagen. Was ist T4, Wieso T4. Aufbau, Architektur, Anwendung. So einfach kann eine Einführung sein. Doch dann ließ es sich auch Rene nicht nehmen, in die Tasten zu greifen. Exemplarisch an Anwendungsbeispielen wie z.B. EF-Templates oder Templates für Unit Testing ging er auf die Features der T4-Engine ein. Bemerkenswert: René lässt sich auch durch kleinere technische Probleme nicht aus dem Konzept bringen. Er hatte wirklich eine Fülle von Beispielen parat, mit denen er reichhaltigen Funktionalitäten von T4 erläuterte. Ein Text- und Code-Jongleur, kann ich da nur sagen.
Trotz dieser guten Sessions war mein Eindruck von See# nicht ganz perfekt – doch daran war ich selbst schuld. Durch die lange Anreise habe ich die Keynote von Golo verpasst. Die lange Reisezeit war schlußendlich auch der ausschlaggebende Faktor, warum ich leider nicht mehr bei der Grillparty und dem .NET Coding Dojo mit Stefan dabei sein konnte. Sehr schade. Nichtsdestotrotz konnte ich wieder auf dem Event wirklich tolle neue Entwickler-Kollegen kennenlernen, darunter Peter Bucher, Roberto Bez, Jürgen Gutsch und Thorsten Hans. Für mich hat sich dadurch die Teilnahme an See# doppelt gelohnt.
Let’s go to NRWConf!
Kaum ist die eine Community Conference zu Ende, steht die nächste schon vor der Tür – die NRWConf 2010 am 9./10. September steht an. Wenn man sich die Agenda der NRWConf ansieht, dann klingt das überaus vielversprechend. Also ich werde mir definitiv wieder eine Menge Sessions so zu Gemüte führen und vieles dazu lernen. Am Abend gibt es – wie auch bei der See# – ein .NET Coding Dojo. Diesmal jedoch mit meiner Wenigkeit als Operator. Ich denke es wird nicht nur eine Menge Spaß machen, sondern wieder einmal erkenntnisreich sein ;-)
Ich freue mich!
Nutzer des IE 6 sehen sie im Internet immer häufiger: mehr oder weniger diskrete
Hinweise, dass der genutzte Browser veraltet wäre und man doch bitte die aktuelle
Version einspielen, oder aber einen alternativen Browser einsetzen solle.
Gegen solche Hinweise habe ich nichts einzuwenden. Schließlich ist der IE 6 nun wirklich
kein aktueller Browser mehr und aufgrund seiner vielen bekannten Fehler bei der Darstellung
von standardkonformen (X)HTML / CSS ist es für den Webdesigner nur unter großem Aufwand
möglich, einen Internetauftritt so zu gestallten, dass er sowohl in standardkonformen
Browsern und im IE 6 vernünftig aussieht. Außerdem sollte man auch die zum Teil recht
eigenwillige Implementierung des DOMs und von JavaScript nicht vergessen, die den
IE 6 auch für JavaScript Entwickler schnell zum Alptraum werden lassen.
Türsteher
Heute kam mir jedoch eine sehr restriktive Variante des bekannten “Rette deine Seele
und nutze einen moderneren Browser” Hinweises unter: Und zwar wollte ich kurz einen
Eintrag auf Jan Welkers Blog lesen,
der meine Aufmerksamkeit erregt hatte. (Anmerkung: Ich schätze Jan wirklich sehr!
Dieser Beitrag soll sich nicht persönlich gegen ihn richten!) Nach dem Öffnen des
Beitrags im Browser bekam ich jedoch nicht die gewünschte Information zugesicht, sondern
wurde automatisch auf eine
Seite weitergeleitet, die mir freundlich erklärte, dass man meinen Browser nicht
möge und ich doch bitte mit einem neueren oder anderen Browser wieder kommen soll.
Ab diesem Augenblick war ich also ausgesperrt. Ausgesperrt, weil der Rechner an dem
ich saß (es war nicht mein Rechner) von der dortigen IT Abteilung nur den IE 6 installiert
bekommen hatte.
Nun wusste ich also endlich, wie sich meine Freunde vor 15 Jahren gefühlt haben müssen,
als der Türsteher vor der Disco sagte “Du kommst hier nicht rein! Deine Klamotten
gefallen mir nicht!”. Tja, damals lachte ich noch über die Jungs, die die Kleidung
noch morgens von ihrer Mutter herausgelegt bekamen und mit diesem Outfit dann halt
nicht in die Disco kamen. Heute war ich es jedoch, der im wahrsten Sinne des Wortes
dumm aus der Wäsche guckte.
Gegenwind
Etwas missmutig über das gerade geschehene wechselte ich auf Twitter – wo ich im Übrigen
nur einen Hinweis “your browser is outdated” erhielt – und fragte Jan, oder die Idee
mit dem Aussperren wirklich für so gut hält.
Leider bekam ich bis jetzt noch keine Antwort Jan, dafür aber von anderen bekannten
Gesicherten der Community, die zu meiner Verwunderung Jans Strategie vollstens unterstützten
und zum Teil sogar das gleiche taten.
Grob zusammengefasst lauteten die Argumente:
-
Wenn mehr große Webseiten genauso agieren würden, wäre der IE 6 endlich weg
-
Der Aufwand für ein IE 6 konformes Layout ist im Vergleich zum Nutzen viel zu groß
Beide Argumente kann ich sehr gut nachvollziehen – und um eines ganz klar zu stellen:
Ich bin kein Fan des IE 6. Auch mich hat er, wie wahrscheinlich die meisten Webentwickler
bereits viel Zeit, Nerven und Haare (nein, Haare nicht: die waren
schon vor dem IE 6 weg ;-) gekostet.
Wie denn sonst?
Trotzdem halte ich wenig vom aktiven Aussperren von interessierten Nutzern (m)einer
Website. Für weitaus besser und vor allem anwenderfreundlicher halte ich es in den
meisten Fällen, im Falle des IE 6 einen Hinweis einzublenden, dass der genutzte Browser
nicht aktuell ist, was dazu führen könnte, dass sowohl Darstellungs-, als auch Funktionsfehler
auftreten.
Über diesen Weg habe ich niemanden den Zugriff auf die von mir bereitgestellten Informationen
verwehrt und Nutzer veralteter Browser trotzdem über mögliche Fehler auf der Seite,
welche durch ihn verschuldet sind, informiert.
Wenn ich nämlich kurz überlege, warum jemand noch den IE 6 einsetzen könnte, dann
fallen mir folgende Gründe ein:
-
Geringe Computerkenntnisse:
Der IE 6 war vorinstalliert und der Anwender ist sich entweder nicht bewusst, dass
er updaten sollte, oder aber traut sich dies nicht zu.
-
Falsche Informationen:
Ein befreundeter “Computerspezialist” hat dem (laienhaften) Anwender erzählt, dass
der IE 6 der schnellste Browser sei, weil er schon so alt ist und deshalb auf moderner
Hardware besonders schnell läuft.
-
Faulheit:
Der Anwender weiss zwar, dass der IE 6 fehlerhaft ist, hat ihn aber aus dem selben
Grund noch installiert, aus dem er auch keine regelmäßigen Backups macht und keinen
bzw. keinen aktuellen Virenscanner hat.
-
Gewohnheit:
Der Anwender nutzt den IE 6 bereits seit Jahren, kommt gut mit ihm zurecht und will
deshalb gar nicht updaten.
-
Abhängigkeiten von alten, aber wichtigen Intranet Anwendungen:
Der Anwender würde gerne updaten, kann es aber nicht, weil seine geschäftskritische
Intranetanwendung nur vernünftig unter dem IE 6 läuft (ja, das soll es auch geben
;-)).
-
Die IT-Abteilung:
Der Anwender würde gerne upgraden, hat gar keine Rechte dies zu tun. Die IT-Abteilung
hingegen weigert sich gegen das Update, weil sie dann vielleicht eine Liste unzähliger
Intranetanwendungen auf Kompatibilität testen und den neueren IE direkt auf unmengen
von Clients ausrollen müsste.
Wenn ich nun auf diese Liste Blicke frage ich mich, welche Kategorie ich wirklich
von meinem Internetangebot ausschließen möchte. Drei und Vier wären vielleicht geeignete
Kandidaten, der ganze Rest jedoch eigentlich nicht. Und selbst bei drei und vier frage
ich mich, ob man hier nicht doch die Freiheit gewähren sollte mit einem Browser der
Wahl zu arbeiten.
Wenn das Ergebnis dann anschließend nicht vernünftig aussieht: Selber schuld!
Mein Appell
Mein Aufruf an die Betreiber von Webangeboten lautet daher: Schließt keine interessierten
Anwender aus! Informiert
lieber dezent, dass der Browser und somit das Ergebnis nicht optimal ist, aber
lasst IE 6 User nicht draußen warten!
Denn wenn wir tief in uns gehen und uns ehrlich fragen, ob durch das Aussperren des
IE 6
-
die Welt besser wird?
-
das Web besser wird?
-
Der IE 6 schneller aussterben wird
dann müssen wir, oder zumindest ich diese Fragen wohl mit nein beantworten. Dies ist
übrigens die gleiche Antwort, die man wahrscheinlich auf die Frage:
-
Wird der User den ich eben wegen seines Browsers ausgesperrt habe jemals wieder kommen?
In diesem Sinne: http://saveie6.com/ ;-)
Natürlich lasse ich mich aber auch gerne vom Gegenteil überzeugen. Sprich: Eure Meinung
zu diesem Thema interessiert mich sehr.
blog.codemurai.de © André Krämer |Impressum | Abonieren
In the last weblog
post I have talked about the difference of unique and non-unique clustered indexes.
As you have seen SQL Server uses an internal overhead of 4 bytes (the so-called uniquifier)
to make non-unique clustered index rows unique. Today I want to work out the difference
between unique and non-unique non-clustered indexes defined on a table with a unique
clustered index. As you already know SQL Server creates a unique clustered index when
you define the PRIMARY KEY constraint on a table. On the other hand
you can use the CREATE UNIQUE CLUSTERED INDEX statement to create
a unique clustered index on a table. The following listing creates our customers table,
creates a unique clustered index on it, and finally creates one unique- and one non-unique
non-clustered index on that table.
-- Create a table
with 393 length + 7 bytes overhead = 400 bytes
-- Therefore
20 records can be stored on one page (8.096 / 400) = 20,24
CREATE TABLE Customers
(
CustomerID INT NOT NULL,
CustomerName CHAR(100) NOT NULL,
CustomerAddress CHAR(100) NOT NULL,
Comments CHAR(189) NOT NULL
)
GO
-- Create a unique
clustered index on the previous created table
CREATE UNIQUE CLUSTERED INDEX idx_Customers ON Customers(CustomerID)
GO
-- Insert 80.000
records
DECLARE @i INT = 1
WHILE (@i <= 80000)
BEGIN
INSERT INTO Customers VALUES
(
@i,
'CustomerName' + CAST(@i AS CHAR),
'CustomerAddress' + CAST(@i AS CHAR),
'Comments' + CAST(@i AS CHAR)
)
SET @i += 1
END
GO
-- Create a unique
non clustered index on the clustered table
CREATE UNIQUE NONCLUSTERED INDEX idx_UniqueNCI_CustomerID
ON Customers(CustomerName)
GO
-- Create a non-unique
non clustered index on the clustered table
CREATE NONCLUSTERED INDEX idx_NonUniqueNCI_CustomerID
ON Customers(CustomerName)
GO
After the creation
of both non-clustered indexes you can use the DMV sys.dm_db_index_physical_stats to
get some information about the indexes. When you look into the DMV, you can see that
the unique non-clustered index has a record length of 107 bytes and the non-unique
non-clustered index has a record length of 111 bytes. So again, there must be a difference
in the internal storage format of both indexes! Let's analyze it and start with the
unique non-clustered index.
In my case the index
root page of the unique non-clustered index is 4370, so I can dump it out very easily
with the DBCC IND command:
DBCC PAGE(UniqueClusteredIndexStructure_NonClusteredIndex, 1, 4370, 3)
GO
As you can see from
the following figure each index record contains the non-clustered key (which is unique
in this case) – the column CustomerName:
When you examine
the byte by byte representation of the unique non-clustered index record, you can
see that SQL Server uses here the following bytes:
-
1 Byte: Status Bits
-
n Bytes: Unique Non-Clustered
Index Key – in this case 100 bytes
-
4 Bytes: PageID
-
2 Bytes: FileID
In sum SQL Server
uses the above mentioned 107 bytes per each index record on each non-leaf level of
the unique non-clustered index. So again, the length of your non-clustered index key
has an impact on how many rows SQL Server can store on an index page. So a CHAR(100) –
like in this example – would be not a very good idea…
When you are walking
down the unique non-clustered index until you reach the leaf-level of the index always
stores the above mentioned 107 bytes per each index row – nothing more. When you finally
dump out the leaf-level of the non-clustered index, you get the following picture:
As you can see here,
SQL Server stores here at the leaf-level directly the clustered key – in our case
the value of the column CustomerID. This value is for SQL Server
the pointer to the corresponding record in the clustered index. With this value in
the hand, SQL Server can now find the record in the clustered index – through a Clustered
Index Seek operator. This is a big difference compared to non-clustered indexes
defined on a heap table. Because in a heap table, SQL Server uses at the leaf-level
the HEAP RID to point DIRECTLY to the corresponding data
page where the record is stored. Therefore SQL Server can directly read the correct
data page without accessing an additional index!
This also implies
that SQL Server can find a record through a non-clustered index on a heap table faster
than a record through a non-clustered index on a clustered table, because SQL Server
don't have to execute the additional Clustered Index Seek operator.
So the correct row can be found with less page reads on a heap table. But please don't
over estimate this detail, and think that you will get a performance benefit by using
non-clustered indexes on heap tables. The fact is that SQL Server always tries to
store the index pages in the Buffer Manager, so it's really very cheap for SQL Server
to do this additional Clustered Index Seek to get the correct record
from the clustered index back.
Let's now analyze
our non-unique non-clustered index. When you dump out the index root page, you can
see that SQL Server stores here the non-clustered index key and also the clustered
index key, which is different from the previous example with the unique non-clustered
index:
SQL Server needs
here the unique clustered index key to make each non-unique non-clustered index key
unique. This behavior is done on EACH LEVEL of the non-unique non-clustered
index, from the index root page down to the leaf-level. This means that you have a
huge storage overhead, because SQL Server stores in EACH INDEX RECORD also
your unique clustered key besides the non-unique non-clustered index key. So when
you have a badly chosen clustered key (like CHAR(100), etc.) it will
even get much more worse for you! When you analyze the index row you can see that
SQL Server uses the following bytes for the storage:
-
1 Byte: Status Bits
-
n Bytes: Non-unique
Non-Clustered Index Key – in this case 100 bytes
-
n Bytes: Unique Clustered
Index Key – in this case 4 bytes for the integer value
-
4 Bytes: PageID
-
2 Bytes: FileID
When you sum up those
bytes, you will get the 111 bytes mentioned earlier. So please keep this additional
storage overhead in your head when using non-unique non-clustered indexes, because
it impacts your non-clustered indexes on each level! You can download the T-SQL script
for this posting here.
In the
next installment of this series we will have finally a look into the differences of
unique/non-unique non-clustered indexes defined on a non-unique clustered index. Stay
tuned J
-Klaus
Das INETA Deutschland Speakers Bureau hat erneut eine Spende von Microsoft Deutschland erhalten! :-)
Nach nun über 3 Jahren (gegründet im April 2008) hat sich das Speakers Bureau etabliert. Als erster Sponsor war Microsoft Deutschland dabei, darum freut es mich unheimlich, dass wir zum dritten Mal Sponsoring von Microsoft Deutschland bekommen! Somit können wir auch weiterhin diesen Service für die INETA Deutschland User Groups aufrecht erhalten. Mittlerweile haben wir 63 mal Sprecher zu verschiedenen User Groups schicken können, auch die Sprecherliste ist auf 22 Sprecher angewachsen.
Da bleibt mir einfach nur DANKE für die Unterstützung zu sagen!
Wie du einen Sprecher für deine User Group anfordern kannst, steht hier.
Aktuelle Sprecherliste des INETA Deutschland Speaker Bureau:
- Schissler, Thomas
- Lorenz, Patrick A.
- Keller, Lars
- Weigelt, Roland
- Raacke, Mathias
- Schwichtenberg, Dr. Holger
- Weinert, Albert
- Weber, Torsten
- Sommer, Oliver
- Klein, Constantin
- Dobermann, Mirko
- Lieser, Stefan
- Biswanger, Gregor
- Forkmann, Steffen
- Freiberger, Jörg
- Jaros, Gerhard
- Samaschke, Karsten
- Fisher, Daniel
- Neumann, Jörg
- Golo Roden
- Damir Dobric
- Thorsten Kansy
Das INETA Deutschland Speakers Bureau sucht noch weitere Sponsoren! Interesse? Dann schicken Sie mir gern eine E-Mail und wir sprechen über die Möglichkeiten: keller [at] ineta-germany [dot] org
Hey Dudes! Nächste Runde TechTalk startet und ich bin mal wieder mit von der Show. Und das auch noch mit einer ehrenvollen Thematik, die ich besonders gerne mag: Windows Phone 7. Wer die TechTalk-Reihe regelmäßig verfolgt, der weiß, dass die vergangene Ausgabe bereits schon das Telefon zum Thema hatte. Es wird da sicher die eine oder andere thematische Parallele geben, aber sicher wird’s diesmal genauso unterhaltsam.
Highlights bei mir: Ich werde ein Phone dabei haben und auch verwenden. Außerdem werde ich das tun, was ich am besten kann. Etwas mehr auf die absurden Anwendungsgebiete des Telefons eingehen ;) Nein, natürlich schauen wir uns ganz klassisch das Telefon und die Basisfunktionalitäten an, welche Möglichkeiten man als Entwickler hat und worauf man achten muss. Aber der Spaß wird nicht zu kurz kommen. Immerhin unterstützt das Ding ja XNA und was man damit machen kann, bringt ganz neue Möglichkeiten. z.B. ordentlich 3D rendern auf dem Handy rockt schon.
Also schnell Anmelden, Platz sichern und Popcorn mitbringen!
Orte sind wie üblich meine Lieblingsstädte, leider ohne Leipzig
Wer übrigens Themenwünsche, Vorschläge, Fragen vorweg oder gar Hinweise zur Lieblingsbiersorte loswerden will, der darf sich gerne der Kommentarfunktion bedienen.
http://www.microsoft.com/germany/msdn/techtalk/WindowsPhone7_DasPortabelTorZurWelt.mspx
(Channel9 Seite des Videos, mit anderen Video-Formaten & Auflösungen)
Dieses Windows Phone 7 Video zeigt wie Seiten-Navigation innerhalb einer Silverlight Anwendung funktioniert:
- Was sind Seiten/Pages ?
- Wie funktioniert die Navigation
- Übergabe von Parametern
DOWNLOAD: Die Navigations-Demo-App aus dem Video.
knom
(Channel9 Seite des Videos, mit anderen Video-Formaten & Auflösungen)
Dieses Windows Phone 7 Video erklärt das UI-Model im Detail:
- Wann werden Applikationen deaktiviert & aktiviert?
- Wie muss/kann man auf Aktivieriung/Deaktivierung reagieren?
- Session, Tombstoning
- Erhalten von Daten über die die Deaktivierung hinweg
DOWNLOAD: Demo-Applikation zum Video
knom
Am 10. September geht in Wuppertal wieder das Community-Event „NRW Conf“ über die Bühne, eine vom Verein „Just Community“ organisierte Veranstaltung für Software-Entwickler und IT-Pros, die seit 2005 im Jahresturnus stattfindet. Aufgeboten sind nach bisherigem Stand diesmal 24 Referenten mit Vorträgen zu aktuellen Developerthemen – darunter Cloud Computing, ASP.NET Controls, C# 4.0 oder Windows Phone. Auf der NRW Conf hat man nun auch die Möglichkeit, bereits existierende Windows Phone 7-Anwendungen (WP7), auf einem echten WP7-Gerät zu testen. Ermöglicht hat dies MVP Peter Nowak. Die Session hierzu... [... mehr in diesem Blogeintrag auf Giza-Blog.de]
This post is powered by
www.Giza-Blog.de |
Visit: MSDN Online |
Follow MSDN Online on
Twitter | Follow Kay
Giza on Twitter
Daily News on MSDN:
MSDN
Aktuell
©
Copyright 2006-2010 Kay Giza. All rights reserved.
Legal
Die Steuerung eines ChildWindow-Objektes in Silverlight wirft sehr schnell Fragen auf, wenn MVVM sauber eingesetzt werden soll. Wann ist die Eigenschaft DialogResult zu setzen und wer ist dafür verantwortlich, sind die ersten Fragen, die sich stellen.
Ansatz 1: Binding auf Eigenschaft DialogResult
Der erste Versuch liegt vermutlich darin, die Eigenschaft DialogResult des ChildWindow auf eine Eigenschaft des dahinter liegenden ViewModels zu binden. Dies wird jedoch fehl schlagen, da es sich dabei nicht um eine Dependency Property handelt. Ein Binding ist also nicht möglich. Dieser Weg scheitert hier. Eine Beschreibung dieser Eigenschaft findet sich im MSDN.
Ansatz 2: Attached Behavior
Eine funktionierende Lösung besteht darin, ein Attached Behavior zu implementieren. Dieses stellt eine Dependency Property zur Verfügung, welche auf einem ChildWindow an das dahinter liegende ViewModel gebunden werden kann. Das ViewModel selbst muss dafür eine entsprechende Eigenschaft zur Verfügung stellen.
public class DialogResultBehavior
{
public static readonly DependencyProperty DialogResultProperty =
DependencyProperty.RegisterAttached(
"DialogResult", typeof(bool?), typeof(DialogResultBehavior),
new PropertyMetadata(DialogResultPropertyChanged)
);
private static void DialogResultPropertyChanged(
DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs e)
{
var childWindow = dependencyObject as ChildWindow;
if (childWindow != null)
childWindow.DialogResult = e.NewValue as bool?;
}
public static bool? GetDialogResult(ChildWindow childWindow)
{
return childWindow.GetValue(DialogResultProperty) as bool?;
}
public static void SetDialogResult(ChildWindow childWindow, bool? value)
{
childWindow.SetValue(DialogResultProperty, value);
}
}
Eingebunden wird dies im ChildWindow nun folgendermaßen:
<controls:ChildWindow x:Class="DevTyr.ChildWindow.MvvmDemo.Views.DateSelectionWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:beh="clr-namespace:DevTyr.ChildWindow.MvvmDemo.Behaviors"
beh:DialogResultBehavior.DialogResult="{Binding DialogResult}">
// Markup
</controls:ChildWindow>
In dieser Definition wird vorausgesetzt, dass das ViewModel eine Eigenschaft DialogResult bereit stellt. Diese wird durch das ViewModel mit dem korrekten Wert gesetzt. Im Normalfall geschieht dies durch an Schaltflächen gebundene Commands.
Das Ergebnis ist nun ein sauberer Weg, ein ChildWindow durch das im ViewModel implementierte Verhalten zu steuern. Wege á la Ereignishandler für das Click-Event, welche das MVVM-Pattern brechen, werden dadurch vermieden.

Am Samstag (den 28.08.2010) fand erstmalig die See# Party am Bodensee statt. Eine Konferenz von der Community für die Community. Schon der Veranstaltungsort – das Dreispitz in Kreuzlingen – war eine sehr nette Location, die den entsprechenden Rahmen für...(read more)
Muss mal wieder was zur Erkenntnis des Tages schreiben, sonst glaubt mir keiner mehr, dass das eine kleine Serie ist. Meine aktuelle Erkenntnis stützt sich auf meine Erfahrungen von gestern, nachdem ich das Ameisenspiel AntMe! (www.antme.net) für die Cloud startklar gemacht habe. Spieler werden in Zukunft die Chance haben, ihre programmierten Ameisen direkt zum Online-Portal hochzuladen und dann andere Spieler herauszufordern. Die Simulation muss dann natürlich auf dem Server stattfinden. Um da ordentlich zu skalieren, gehen wir natürlich gleich in die Cloud.
Für einen ordentlichen Datenaustausch bietet Azure neben SQL Azure auch Windows Azure eigene Speichermedien. Da gibt es die Tabellen, die garkeine richtigen Tabellen sind. Dann hat es noch Queues zur Kommunikation zwischen den einzelnen parallelen Prozessen und am Ende noch Blobs, um die wirklich fetten Daten abzulegen.
Wie funktionierts? Neben der eigentlichen Webseite, deren Datenbank direkt bei SQL Azure liegt, existieren 2 Worker Roles in Azure. Eine davon übernimmt die Rolle des Queue-Managers. Sie liest aus SQL Azure aus, welche Simulationen durchgeführt werden müssen, bereitet die Daten für die Simulations-Rollen korrekt auf (Daten werden dann in den Tabellen gehalten) und ein Simulationsauftrag wird in eine Queue geschoben. Simulatoren sind auch Worker Roles und können in x-facher Instanz laufen. Eine dieser Simulatoren holt sich einen Auftrag aus der Queue, grabscht sich die zusätzlichen Daten aus den Tabellen und beginnt die Simulation. Die Aufzeichnung der Simulation wird direkt als Stream in einen neuen Blob gestreamt, wo der spieler es später direkt per URL zur Wiedergabe heraus streamen kann.
Aber nun zu meiner Erkenntnis: Implementierung dieser Interprozess-Kommunikation ist denkbar einfach. Tabellen-Entitäten werden im Stil des Entity Frameworks erstellt und bei Start der Rolle mit einem simplen “Erstell-wenn-noch-nicht-vorhanden”-Befehl im Table-Storage angelegt. Danach greift man über einen zentralen Datacontext darauf zu. Wow! Noch einfacher ist es mit den Queues und Blobs. Dort ist mit 2 Zeilen Code eine Verbindung zu vorhandenen (oder bei Bedarf neu erstellten) Datenquelle hergestellt und es kann los gehen. Queues werden wahlweise mit Strings oder Byte-Arrays gefüttert und Blogs per Stream gefüttert. Denkbarst einfach! Danke Azure. Innerhalb von einer Stunde hatte ich eine funktionierende Lösung.
Worauf ich aber eigentlich raus wollte:
Wenn ihr Queues verwendet, dann achtet bitte darauf, dass ihr entnommene Messages auch aus der Queue löscht. Sehr eigenartiges Konzept. Messages bleiben bei einem Pop in der Queue, sind aber für knapp 30 Sekunden nicht sichtbar. Nach einem Pop muss die Message also nochmal explizit aus der Queue gelöscht werden, damit der Service nicht endlos die selbe Message bearbeitet.
Agenda
Am 06. Oktober 2010 findet in Köln der aus Microsoft Sicht wichtigste Strategie-Event im deutschsprachigen Raum für alle Softwarehersteller und Systemintegratoren statt. Sie erhalten einen Ausblick auf die neuesten Softwaretrends und Entwicklungen von morgen, wie Windows Azure oder Microsoft Kinect.
Highlight – Steve Ballmer
Erleben Sie Steve Ballmer hautnah in seinem Vortrag zum Thema Innovationen im Softwaremarkt und Microsoft.
Steve Ballmer
Chief Executive Officer (CEO)
Microsoft Corporation Anmeldung
Melden Sie sich bereits heute an und profitieren Sie von unserem attraktiven Angebot für Frühbucher.
Der Besuch des Software Strategy Summit kostet für Microsoft-Partner nur 149,-- Euro (für Nicht-Microsoft-Partner: 159,-- Euro).
Andreas Pollak
Technologieberater für ISV’s
Product Marketing Manager Developer & Designer Tools
19.-20. Oktober 2010, Rosenheim
SQLdays ist die Konferenz für die deutschsprachige SQL Server
Community vom 19.-20. Oktober 2010 in Rosenheim. Freuen Sie sich auf drei
parallele Tracks mit über 20 Sessions zu SQL Server Administration,
Entwicklung und Business Intelligence. Treffen Sie Datenbank- und BI-Experten
wie Klaus Aschenbrenner, Markus Raatz, Steffen Krause, Thomas Grohser oder Willfried
Färber persönlich und erfahren Sie News aus erster Hand und wertvolle Tipps und Tricks
aus der Praxis. In ganztägigen Workshops vor und nach der Konferenz haben Sie
zudem die Gelegenheit spezielle Themen nochmal bis ins Detail zu vertiefen.
Sichern Sie sich jetzt Ihre Teilnahme unter www.SQLdays.net
In meinem Posting "Juli 2010: Microsoft MSDN Forum, TechNet Forum und Answers Forum Update und aktuelle Forenstruktur" hatte ich Anfang Juli auf die aktuelle Foren-Struktur aufmerksam gemacht und ein paar Hintergründe erklärt. Seit Freitag letzter Woche sowie heute hat das MSDN Forum Zuwachs bekommen.
Neu sind die Foren Microsoft Access und Windows Phone 7.
Mit diesem Posting möchte ich gerne die aktuelle Foren-Struktur (Stand 30.08.2010) für Microsoft Answers, TechNet und MSDN hier posten... [... mehr in diesem ausführlichen Blogeintrag auf Giza-Blog.de]
This post is powered by
www.Giza-Blog.de |
Visit: MSDN Online |
Follow MSDN Online on
Twitter | Follow Kay
Giza on Twitter
Daily News on MSDN:
MSDN
Aktuell
©
Copyright 2006-2010 Kay Giza. All rights reserved.
Legal
Lohnt sich Testautomatisierung zur Qualitätssicherung in der Praxis? Wir meinen ja und zeigen Ihnen, wie Sie schnell und erfolgreich zum vollautomatisierten Softwaretest kommen.
An diesem ALM Day beschäftigen wir uns mit sämtlichen Fragen rund um das Thema Testautomatisierung und Qualitätssicherung. Zusammen mit unseren Partnern AIT und PC-Ware zeigen wir auf, welchen Mehrwert und welche Einsatzmöglichkeiten Ihnen Testautomatisierung heute bietet – „out of the box" mit dem Microsoft Visual Studio Team Foundation Server!
Die neuen Test-Tools der Visual Studio Produktfamilie werden anhand eines Praxisbeispiels näher vorgestellt. Die umfangreichen neuen Werkzeuge speziell für die Qualitätssicherung und -steuerung ermöglichen erstmals eine reibungsfreie Zusammenarbeit zwischen Testern und Entwicklern. Das komfortable Einrichten, Verwalten und Auswerten von virtuellen Testumgebungen wird durch leistungsfähige Systemmanagement-Werkzeuge deutlich einfacher und komfortabler. Die vertiefte Integration mit Versions-, Projektverwaltung und Build-System ermöglicht ein umfangreiches Berichtwesen und sorgt für die notwendige Nachvollziehbarkeit und Transparenz im gesamten Entwicklungsprozess.
|
Datum:
|
Mittwoch, 1. September 2010
|
|
Zeit:
|
13:15 – 16:15 Uhr
|
|
Check-in:
|
ab 12:45 Uhr
|
|
Ort:
|
Microsoft Schweiz GmbH, Richtistrasse 3, 8304 Wallisellen
|
|
Zielgruppe:
|
Verantwortliche aus der Qualitätssicherung, Softwaretester, Projektleiter
|
|
Level:
|
100
|
| |

|
Gestern fand in Kreuzlingen zum ersten Mal die See# Party 2010 statt, die Community-Konferenz der .NET Usergroup Konstanz-Kreuzlingen. Thematisch drehte sich zwar alles um .NET, allerdings wurde dem Thema ALT.NET von den Veranstaltern viel Platz in der Agenda eingeräumt – was ich persönlich als sehr positiv empfand.
Auch die von mir gehaltene Keynote beschäftigte sich mit diesem Thema – neben der Frage, was sich hinter dem Begriff ALT.NET überhaupt verbirgt, ging es mir vor allem darum, die Teilnehmer zu motivieren, auch abseits der von Microsoft vorgegebenen Richtung nach Lösungen und interessanten Ideen zu suchen und diese zu nutzen.
Direkt im Anschluss an die Keynote hielt ich meine Session mit dem Titel Was noch zu beweisen wäre, in der ich den Teilnehmern die Komplexitätstheorie von Algorithmen und deren Zusammenhang mit dem P=NP-Problem auf – der anspruchsvollen Theorie zum Trotz – verständliche Art erläutert habe.
Mit insgesamt ungefähr 100 Teilnehmern war die See# Party aus meiner Sicht sehr gut besucht. Besonders beeindruckend war neben der Veranstaltung an sich die Lokation, das Dreispitz in Kreuzlingen, das nicht nur ausreichend Platz für die Sessions, sondern auch eine große Außenterrasse für die abendliche Grillparty bot.
Zusammen mit einem von Stefan Lieser veranstalteten .NET Coding Dojo rundete diese abendliche Grillparty die See# Party ab. Insgesamt hat mir die Konferenz gut gefallen, es waren viele interessante Teilnehmer da, mit denen sich entsprechende Gespräche ergeben haben.
Ein großes Dankeschön daher an die Organisatoren der See# Party 2010 – ich freue mich auf die Nachfolge im nächsten Jahr!
Am
23.09.2010 um 18 Uhr trifft sich die .NET User Group Karlsruhe zu Vortrag “Von 0 auf
MSBuild 4.0” von Thorsten Hans.
Von 0 auf MSBuild 4.0
MSBuild ist das Werkzeug zum Erstellen von .NET Projekten. In dieser Session wird
hierbei der Weg zu eigenen MSBuild-Skripten geebnet. Nach einer kurzen Einführung
in die Thematik, geht es von einfachen Beispielen, über eigene MSBuild Tasks hin zu
den wichtigen neuen Features von MSBuild 4.0. Thorsten Hans (http://www.dotnet-rocks.de)
zeigt wie leicht und schnell man MSBuild erlernen kann.
Über den Sprecher
Thorsten Hans arbeitet als Teamlead .NET and SharePoint Development bei der Firma
Data One in Saarbrücken. Er beschäftigt sich neben SharePoint und .NET Entwicklung
mit Dynamischen Sprachen, MSBuild und der Webentwicklung mit Microsoft Technologien.
Er ist mehrfach als MCTS und MCPD zertifiziert. Sie erreichen Ihn über http://ironruby-rocks.com oder http://www.dotnet-rocks.de .
Xing Profil
https://www.xing.com/profile/Thorsten_Hans
Twitter
http://www.twitter.com/ThorstenHans
Teilnahme
Bitte meldet Euch wieder via
XING an, die Location ist wieder DJK-Ost:
DJK-Ost
Friedrichstaler Allee 52
76131 Karlsruhe
Vorabanmeldungen können auch per E-Mail
an Frank Pfattheicher gesendet werden.
This weblog is sponsored by CoDeSo - Consulting, Development
& Solutions.
Die erste See# Party ist für dieses Jahr vorbei und die Leser dieses Beitrages – welche die wunderbare Session von Rainer Stropek nicht gesehen haben – werden sich vielleicht wundern was das für ein blöder Titel ist ;-)
(“LINQ ist wie eine Taube…” und Extension Methods sind die “Kuckuckseier” die anderen Klassen untergejubelt werden können)
Wie habe ich die See# Party erlebt?
Es waren für uns drei Tage pure Action :-) Insgesamt gesehen hat es – trotz aller Pannen, die es aus meiner Sicht gab – dennoch irgendwie Spaß gemacht. Aber ich werde mich nicht nochmal überreden lassen eine eigene Session zu machen, wenn ich eine solche Veranstaltung organisiere. Mit dem Kopf bei der Veranstaltung, aber nicht bei der Session zu sein, ist sowohl anstrengend für die Besucher der Session, als auch für den Speaker…
Die Erfahrung war es allerdings absolut wert diese Veranstaltung zu machen. Den Spaß an der Sache hatte ich aber bei den Gesprächen mit den Teilnehmern und Speakern. Spaß macht es auch wenn hochkarätige Speaker wie Laurend Bugnion tatsächlich den Weg auf sich nehmen um auf der See# Party zu sprechen. Wenn Speaker aus der deutschsprachigen Community kommen um Vorträge zu halten. Und auch wenn neue Speaker die Möglichkeit nutzen, ihre erste Session auf einer Konferenz zu halten.
Spaß macht es auch, wenn man gerade zur rechten Zeit in eine Session kommt, in der Reiner Stropek LINQ zu einer Taube mit Kuckuckseiern macht. (@Rainer: ich finde den Vergleich sowohl absolut passend als lustig) Spass macht es auch, wenn Golo Roden die KeyNote zu ALT.NET genau so hält, wie man sie sich vorgestellt hat. (Es gab keine Absprache über das WIE, nur das Thema selber)
Bestätigt wird man auch, wenn Thomas Scheuermann trotz Sintflut in Nürnberg und überschwemmten Keller, die Reise auf sich nimmt um seine Session zu halten und anschließend wieder nach Hause fährt um den Keller wieder in Ordnung zu bringen. (@Thomas: vielen, vielen, vielen Dank dafür. Mehr weiß ich einfach nicht zu sagen *sprachlos*)
Leider habe ich nicht alle Sessions besuchen können... Aber dem Feedback nach, hätten sehr viele Leute gerne mehr als nur vier Sessions besucht. Auch das ist eine Bestätigung dass die Auswahl der Themen und der Sprecher tatsächlich gelungen ist. Auch das wurde mir immer wieder gesagt. Leider konnte ich auch keine der Sessions komplett besuchen, sondern bin mit meiner kleinen Kamera von einer Session zu anderen um noch ein paar Erinnerungen aufzufangen (Die Bilder werde ich in einer Wochen auf der Website publizieren)
#ssp2011?
Wie man aus dem obigen Text vielleicht lesen mag, geht der Trent zu einer See# Party 2011: Einer .NET Community Konferenz für den südlichen Raum der deutschsprachigen .NET Community (Süddeutschland, die Schweiz, Vorarlberg und Liechtenstein)
Darüber werde ich in den nächsten Tagen ausführlich nachdenken. Diese See# Party war durch die viel zu kurze Planungszeit enorm schwierig und chaotisch. Auch wurden unsere Erwartungen dadurch an manchen Stellen nicht komplett erfüllt. (Vor allem durch die viel kleiner Teilnehmerzahl wird es enorm schwierig sein die Kosten zu decken)
Es gibt auf jeden Fall eine große Liste mit Dingen die beim nächsten Mal besser gemacht werden können und müssen.
In acht Tagen werden wir uns wieder zusammensetzen und darüber reden, wie diese allererste See# Party war und wie es mit weiteren See# Partys weiter gehen könnte. Bis dahin bin ich auf einer Berghütte in der Schweiz, ohne Strom, ohne Internet und ohne Telefon. :-)

Mehr als 1825 Postings und 1195 Kommentare in jetzt fast 6 Jahren in diesem Blog, sind mit der Blogsoftware dasBlog entstanden. Hey, ich mag dasBlog, ernsthaft. Wenn man sich einige Tage lang mit dasBlog beschäftigt, es anpasst und einige unsinnige Performance-Bremsen entfernt, wenn man sich mit dem IIS auseinandersetzt, Kompression einschaltet und weite Performance-Tricks anwendet etc. läuft es auch wirklich gut. Ahh - und natürlich die Security beachtet, dann läuft's perfekt. Schade ist nur, dass dasBlog scheinbar tot ist. Die letzte Version von dasBlog 2.3 (2.3.9074.18820) ist vom 15. März 2009, was in der IT-Welt mehr als eine Ewigkeit ist.
Jetzt könnte man sagen, hey - warum wechselst Du nicht? Erst einmal ist das hier keine Beschwerde. dasBlog ist Open Source, ein Community Projekt - da erlaube ich mir nicht mich zu beschweren... [... mehr in diesem Blogeintrag auf Giza-Blog.de]
This post is powered by
www.Giza-Blog.de |
Visit: MSDN Online |
Follow MSDN Online on
Twitter | Follow Kay
Giza on Twitter
Daily News on MSDN:
MSDN
Aktuell
©
Copyright 2006-2010 Kay Giza. All rights reserved.
Legal
In der MFC 10.0 hat sich ein Bug eingeschlichen, der sich unter Windows Vista und Windows 7 bemerkbar macht. Unter Windows XP tritt der Fehler nicht auf. Das Problem tritt in jedem Stil auf, der DWM verwendet. D.h. nicht wenn Windows klassisch ausgewählt wird.
Wenn auf einen CFormView mehrere Buttons liegen und der CFormView gerollt wird, dann kommt es unter Umständen zu Fehlern beim Neuzeichnen von Buttons. Dies schließt alle Button-Formen ein: Check-Buttons, Radio-Buttons und normale Buttons.
Das Ganze sieht nach dem Rollen in etwa so aus:

Der Text einiger Buttons erscheint nach dem Rollen als schwarze Blöcke. Es kann auch vorkommen, dass nur Teile der Buttons falsch gezeichnet werden.
Um das Problem gezielt nachzuvollziehen habe ich ein kleines Sample gebaut. Man kann durch zwei Schalter den CScrollView gezielt nach oben oder unten Rollen. Beim Rollen nach unten und bei bestimmten Fenstergrößen tritt dann der Fehler auf. Ich habe das Main-Window entsprechend beim Start in der Größe angepasst.
Das Problem liegt in einer Implementierung von WM_PRINTCLIENT in CScrollView (CScrollView::OnPrintClient), die ein Double-Buffering verwendet, dass entweder falsch ist oder sich eben mit der Standardimplementierung eines Dialoges beißt. Auf den ersten und zweiten Blick konnte ich in der Implementierung selbst keinen Fehler sehen. Deshalb vermute ich, dass sich dieses Double-Buffering mit dem auch vorhandenen Double-Buffering in den Standardimplementierungen der Dialogklasse beißt bzw. nicht korrekt berücksichtigt, dass auch Child-Windows neu gezeichnet werden müssen.
Die Lösung ist entsprechend einfach:
- Man fügt einfach einen Handler für WM_PRINTCLIENT in seiner von CFormView abgeleiteten Klasse ein.
- Dieser Handler ruft dann nicht die Implementierung der Basisklasse CFormView auf, sondern die Implementierung in CView (CView::OnPrintClient).
...
ON_MESSAGE(WM_PRINTCLIENT,&CScrollDialogMFCView::OnPrintClient)
...
LRESULT CScrollDialogMFCView::OnPrintClient( WPARAM wp, LPARAM lp )
{
// Bypass the CScrollView::OnPrintClient implementation
return CView::OnPrintClient(wp,lp);
}
Dieser Fehler ist in keiner der vorhergehenden MFC Versionen vorhanden (auch nicht in MFCNext), weil einfach kein entsprechender Handler vorhanden war..
Es stellt sich wohl bei einigen jetzt die Frage warum dieser Handler eingebaut wurde. Auch die Antwort ist einfach:
Seit Windows Vista wird stark von AnimateWindow Gebrauch gemacht und auch DWM intern scheint des öfteren WM_PRINT/WM_PRINTCLIENT zu verwenden. Entsprechend haben fast alle Klassen in der MFC entsprechende Handler ergänzt bekommen.
Das Sample kann man hier herunterladen: ScrollDialogMFC – VS-2010.
Ich habe in der stdafx.h einen define FIX_CSCROLLVIEW_PROBLEM eingebaut mit dem man den Fix einfach aktivieren und deaktivieren kann.
Copyright © 2010 Martin Richter
Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.
(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)
Themenverwandte Beiträge:
Die Silverlight Listbox wird noch ein Thema für ein eigenes Buch. Wer bei Bing nach Beträgen dazu sucht wird vieles dazu finden. U.a. hier und hier und hier. Ein Kunde meiner Silverlight Schulung hat mich gefragt wie man einen Eintrag einer Listbox der ausgewählt (selected) ist, anders darstellt. Nun habe ich mich geistig auf die Suche nach dem passenden Template gemacht. Das ist ist aber falsch gedacht. Silverlight verwendet für die “aktiven” Parts den Visual State Manager der das Verhalten beeinflusst.
Um an diesem VSM zu gelangen muss man in das generated Item Container Template der Silverlight Listbox.

Dann erhält man umfangreichen XMAL Code. Die wichtigen Stellen habe ich gelb markiert.
<UserControl.Resources>
<Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem">
<Setter Property="Padding" Value="3"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Top"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="TabNavigation" Value="Local"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid Background="{TemplateBinding Background}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimation Duration="0" To=".35" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="fillColor"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<DoubleAnimation Duration="0" To=".55" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="contentPresenter"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected"/>
<VisualState x:Name="Selected">
<Storyboard>
<DoubleAnimation Duration="0" To=".75"
Storyboard.TargetProperty="Opacity"
Storyboard.TargetName="fillColor2"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="FocusStates">
<VisualState x:Name="Focused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0"
Storyboard.TargetProperty="Visibility"
Storyboard.TargetName="FocusVisualElement">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Unfocused"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="fillColor" Fill="#FFBADDE9"
IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1"/>
<Rectangle x:Name="fillColor2" Fill="red"
IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1"/>
<ContentPresenter x:Name="contentPresenter" Margin="5"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalAlignment="Left" />
<Rectangle x:Name="FocusVisualElement"
RadiusY="1" RadiusX="1" Stroke="#FF6DBDD1"
StrokeThickness="5" Visibility="Collapsed"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
Entsprechend sieht dann meine Liste nicht mehr besonders schön aber aus. Aber ich konnte das selektierte Item verändern und kann sogar die Animation dazu steuern. Und wieder ein Auftrag erfüllt.

Wenn man in Silverlight Projekten Datenklassen erstellt und dann bindet entsteht der Wunsch im Designer schon einen sinnvollen Preview zu haben. Für Expression Blend gibt es die Möglichkeit mit Designtime zu arbeiten. In diesem Silverlight Beispiel will ich aber direkt die DAL pimpen. Dafür muss einfach der Konstrukor herhalten, der für die verschiedenen Fälle unterschiedliche Daten generiert.
Public Class person
Implements INotifyPropertyChanged
public Sub New()
If DesignerProperties.IsInDesignTool Then
_name = "Hannes Preishuber ist ein Designer"
Else
If HtmlPage.IsEnabled Then
_name = "Hannes Preishuber nuttzt den Webbrowser"
Else
_name = "Hannes Preishuber startet die Anwendung OOB"
End If
End If
End Sub
Die Bindung wird voll deklarativ durchgeführt.
<UserControl.Resources>
<local:person x:Key="personDataSource" d:IsDataSource="True"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White"
DataContext="{Binding Source={StaticResource personDataSource}}">
<TextBox Height="23" Margin="151,23,12,0"
TextWrapping="Wrap" Text="{Binding name, Mode=TwoWay}">
In Visual Studio 2010 (cidder)

Im Webbrowser
Out Of Browser (OOB)

Diesesmal hat mein Silverlight Schulungsteilnehmer (Stephan) mir eine cooles Silverlight Sample gezeigt. Während der Schulung war wieder mal die Listbox ein Thema (darüber könnte ich schon ein Buch schreiben. Es sollte eine Liste mit Namen angezeigt werden und dabei das Itemtemplate verändert werden. Das geht eigentlich ganz einfach entweder mit Expression Blend oder direkt im XAML Code ala
<ListBox.ItemTemplate>
<DataTemplate>
<Border Margin="5" BorderBrush="#FF340CF9" CornerRadius="5" Height="32">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="0"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<TextBlock Text="{Binding}" Foreground="#FFF9F5F5" FontWeight="Bold" Margin="4,2"/>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>

Das ganze sieht allerdings mehr nach Balkengrafik aus. Der Wunsch ist das alle Listboxitems gleich breit sein sollen. Eigentlich ganz einfach. Die Width der Broder gesetzt und… Aber es soll genau so breit sein wie die Listbox.
Das geht indem man das HorizontalContentAlignment auf Stretch setzt. Da kommt man leider gar nicht so leicht ran. Entweder man nimmt Expression Blend und zerlegt die Listbox in sein Template. Contextmenü – Edit Template-Edit a copy.- und erhält 300 Zeilen XAML Code

Oder man nimmt die relevante Setter Stelle einfach raus und setzt sie sozusagen auf dem kurzen Dienstweg im ItemContainerstyle der Silverlight Listbox
<ListBox Margin="96,26,129,54" x:Name="listbox1" >
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem" >
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
Perfektes Ergebnis im Browser

Ein Hinweis in eigener Sache, auch weil viele Anfragen dazu in letzter Zeit mich erreicht haben: In Microsofts offiziellen Community Guide findet man ja bereits viele Social Media-Angebote von Microsoft, seien es Portale, Blogs, Twitter, Facebook- oder Xing-Gruppen, Foren oder RSS-Feeds. Sollten Sie Mitglied im sozialen Netzwerk LinkedIn sein, möchte ich Sie herzlich einladen... [... mehr in diesem Blogeintrag auf Giza-Blog.de]
This post is powered by
www.Giza-Blog.de |
Visit: MSDN Online |
Follow MSDN Online on
Twitter | Follow Kay
Giza on Twitter
Daily News on MSDN:
MSDN
Aktuell
©
Copyright 2006-2010 Kay Giza. All rights reserved.
Legal
Windows Phone 7 steht kurz vor der Fertigstellung. Wahrscheinlich werden die ersten Geräte ab Oktober verfügbar sein. Zeitgleich öffnet der Windows Phone 7 Marketplace seine Pforten. Für all diejenigen, die tiefer in das Thema Windows Phone 7-Entwicklung einsteigen möchten, ist sicherlich das Buch „Entwickeln für Windows Phone 7“ von Patrick Getzmann, Simon Hackfort und Peter Nowak interessant.

Die drei Autoren gehen sowohl auf die Entwicklung mit Silverlight als auch auf die Entwicklung mit dem XNA Framework ein. Das Buch wird ab Dezember 2010 bei Microsoft.press erhältlich sein. Also genau das richtige Geschenk zu Weihnachten! Sie können das Buch bereits bei Amazon vorbestellen.
Bezugsquelle: Amazon.de
ISBN-10: 3866454627
ISBN-13: 978-3866454620
Preis: 39,90 €
Golo will die räumliche Nähe für Teammitglieder nicht weiter überschätzen, Ilker will sie nicht unterschätzen. Mit seinem “Gemeinsam für die gemeinsame Sache” drückt er sogar aus, dass bei räumlicher Distanz keine Gemeinsamkeit mehr ent-/bestehen könne. Ja, was denn nun? Golos Fahne folgen in das bisher weniger erforschte Land verteilter Teams oder eher in der bisherigen Reisegruppe der
Aktuell habe ich in meiner Silverlight Schulung einen Teilnehmer, der wirklich interessante Fragen aufwirft, deren Antwort ich dann im Nachgang suche und hier in meinem Blog poste. Schließlich sind nur glückliche Silverlight Kurs Teilnehmer auch gute Teilnehmer. In diesem Silverlight 4 Beispiel soll ein Bild beschnitten werden. Das geht auch ganz einfach mit dem Clipping Path Attribut.
Mit Expression Blend nimmt man ein Bild, legt darüber eine Kurve (z.B. Kreis) und markiert beide. Dann wird im Context Menü Path- Make Clipping Path ausgewählt.

Im XAML sieht das wie folgt aus und man sieht nur mehr den Hintern der hübschen Person vom Foto
.
<Image Margin="30,41,-140,-124" Source="/maus[1].jpg" Stretch="Fill"
Clip="M470.5,351.5 C470.5,387.3985 425.05692,416.5 369,416.5 C312.94308,416.5
267.5,387.3985 267.5,351.5 C267.5,315.6015 312.94308,286.5 369,286.5
C425.05692,286.5 470.5,315.6015 470.5,351.5 z"/>
Leider lässt sich das so nicht mehr animieren. Viele Attribute eines UIElements lassen sich durch ein Unterelement aufsplitten. So auch das Clip Attribut zu Image.Clip. Der Pfad wird dann mit Geometry Elementen beschrieben. In unserem Beispiel eben eine Ellipse.
<Image x:Name="image" Source="/maus[1].jpg" Stretch="Fill" RenderTransformOrigin="0.5,0.5" >
<Image.Clip>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="100,100">
</EllipseGeometry>
</Image.Clip>
</Image>
Insgesamt gibt es fünf solcher Geomtrien.
-
EllipseGeometry
-
GeometryGroup
-
LineGeometry
-
PathGeometry
-
RectangleGeometry
Jetzt bleibt nur mehr das Problem der Animation. Leider gibt es keine Unterstützung durch Expression Blend oder schon gar nicht Visual Studio 2010. Also ran per Hand. Da ich eine Punkt verschieben möchte ist die PointAnimation das passende. Recht Tricky ist die Adressierung des Center Propertys über die XAML Hierarchie.
<Storyboard x:Name="Storyboard1">
<PointAnimation BeginTime="0" Duration="0:0:01" From="0,0" To="200,200"
Storyboard.TargetName="image"
Storyboard.TargetProperty="(UIElement.Clip).(EllipseGeometry.Center)">
</PointAnimation></Storyboard>
Gestartet wird die Animation per Expression Blend behavior. Am Ende eine Null Code Lösung.
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Funktioniert. Ich bin wieder mal begeistert.



In diesem Tipp geht es um das Umschalten zwischen einer Debug- und Release-Ansicht im XAML Designer.
Zusammenfassung
Während man im Code mit #if DEBUG zwischen Debug- und Release-Build unterscheiden kann, gibt es etwas Vergleichbares in XAML nicht. Mit Hilfe eines geeigneten Value Converters kann jedoch Abhilfe geschaffen werden.
Beschreibung
Mit dem #if pragma im Quellcode zwischen verschiedenen Builds zu unterscheiden hat wohl jeder Entwickler schon einmal gemacht. Diese Möglichkeit fehlt mir in XAML, da ich beispielsweise bei komplexeren Layouts während der Entwurfsphase gerne mal bestimmte Bereiche unterschiedlich einfärbe. So kann man viel besser erkennen, ob Margins, Paddings etc. stimmen. Ärgerlich dabei ist, dass man so ein buntes Layout zumindest nicht jedem Kunden zeigen kann und es schön wäre, dieses "Debug Layout" im Release-Build einfach abzuschalten zu können.
Natürlich kann man das mit etwas C#-Code einfach hinbekommen, aber eigentlich will ich die Unterschiede der Builds bereits im Designer sehen. Mit Hilfe des Value Converters ConditionalConverter kann man das erreichen. Das folgende XAML-Fragment zeigt exemplarisch ein Grid, welches im Debug-Build rot und im Release-Build blau ist. Natürlich auch zur Laufzeit, aber vor allem im XAML Designer. Durch den Wechsel des Builds in Visual Studio verändert sich die Anzeige des Designs entsprechend:
<Grid Background="{Binding Converter={StaticResource ConditionalConverter}, ConverterParameter='Red|Blue'}"/>
Der ConditionalConverter liefert je nach Build den ersten oder den zweiten Teil des Parameter-Strings zurück. Das funktioniert natürlich auch mit Zahlen, Texten, Margins etc. Zwar liefert der Converter immer nur Strings, aber diese werden beim Zuweisen an die Property von deren Type Converter entsprechend in den richtigen Typ umgewandelt. Wie das in XAML üblich ist.
Auffällig ist, dass das Binding keinen Path hat. Er wird jedoch auch nicht benötigt, denn das Ergebnis hängt nur von ConverterParameter ab. Die Implementierung ist relativ einfach:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string result = null;
if (parameter is string)
{
var param = ((string)parameter).Split('|');
#if DEBUG
result = param[0];
#else
if (param.Length >= 2)
result = param[1];
#endif
}
// "x:Null" represents the markup extension "{x:Null}".
if (result == "x:Null")
result = null;
return result;
}
Das Binding wird zur Designzeit allerdings nur dann ausgeführt, wenn die Property DataContext des Target Objekts und die Source-Property des Bindings nicht beide Null sind, denn in diesem Fall wird der Value Converter gar nicht erst aufgerufen. Sollte dies so sein, kann man die Source-Property im Binding einfach auf irgendeinen Wert setzen, denn da der Path nicht definiert ist, wird sie nicht verwendet. Sie darf nur nicht Null sein:
<Grid Background="{Binding Converter={StaticResource ConditionalConverter},
Source=xyz,
ConverterParameter='Red|Blue'}"/>
So ist Source nicht mehr Null und das Binding funktioniert.
Man muss noch beachten, mit dem ConditionalConverter keine Properties zu setzen, die eigentlich durch einen Style gesetzt werden sollten. Das Binding hat Vorrang und der Style kommt nicht zur Anwendung.
Eine weitere theoretische Möglichkeit wäre es, den ConditionalConverter in einem Style zu verwenden, z.B. so:
<Style TargetType="Border">
<Setter Property="Background"
Value="{Binding Source=_, ConverterParameter='#FF0000|#00FF00',
Converter={StaticResource ConditionalConverter}}"/>
</Style>
Das funktioniert aber nicht. Während es in WPF durchaus üblich ist Bindings in Styles zu verwenden, ist diese Funktionalität in Silverlight leider noch nicht implementiert. (Genauer gesagt ist sie bisher nur im Designer implementiert. Das Binding im Style funktioniert bei Silverlight zur Designzeit; wenn man aber die Anwendung startet, gibt es eine Fehlermeldung.)
Expression Blend
In Blend funktioniert das Ganze im Prinzip genauso, allerdings muss hier beachtet werden, dass Blend aktuell ausschließlich Debug-Builds erzeugen kann. Wenn man also in Blend die Release-Ansicht betrachten möchte, muss man vorübergehend die Implementierung von ConditionalConverter ändern. Es reicht, einfach Underscore an #if DEBUG anzufügen und damit die Abfrage umzudrehen.
Code-Beispiel
Zum direkten Ausprobieren gibt es hier noch ein Beispiel: Die MainPage.xaml im Designer öffnen und dann zwischen Debug- und Release-Build hin- und herschalten. Vorher beide Builds einmal compilieren.
ConditionalConverter.zip (16 kB)
Hier geht's zum nächsten Tipp.
Es gibt einige Neuigkeiten zum Thema Windows Phone 7-Entwicklung. Die Windows Phone Developer Tools werden in ihrer RTM-Version am 16. September 2010 veröffentlicht. Dies teilte Jeff Wilcox über seinen Blog mit. Außerdem hat das XNA Framework-Entwicklerteam derweilen eine Hand voll Samples zur Windows Phone 7-Entwicklung mit dem XNA Game Studio veröffentlicht.
- 2D Touch Game Lab (Catapult Wars)
- 2D Graphics Sample
- 2D Particles Sample
- Sound + Music Sample
- Landscape/ Portrait Orientation Sample
Catapult Wars für Windows Phone 7 vereint die einfacheren Sample und demonstriert damit u.a. ein XML-basiertes Sprite-Animationssystem, Text-Rendering, Kollisionserkennung mit Bounding Boxes, das Abspielen von Sounds und Musik sowie Menüinteraktionen und die Erkennung von Gesten. Der Interpretation von Handbewegungen ist auch ein eigener Artikel gewidmet. Ferner schreibt das XNA Framework-Entwicklerteam über 2D Assets und gibt einen Einblick in C# für Umsteiger, die von Objective-C oder Java kommen.
Create games for Windows Phone 7
Anwendungen die Sie über den Marketplace veröffentlichen möchten, sollte möglichst bis Anfang Oktober fertiggestellt sein. Dann öffnet der Marketplace seine Pforten und Einreichungen sind möglich. Jede Anwendung muss diversen Kriterien genügen und einem Zertifizierungsprozess standhalten, damit sie es in den Marketplace schafft. Alle Details verraten Ihnen die Marketplace-Richtlinien.