Glengamoi (Forum) · AspHeute (Artikel) · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Martin Hey: Wer lesen kann...

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

Manuel Sidler: Review See# Party



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!

Ralf Westphal: Lesen heute für Softwareentwickler

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

Thomas Bandt: Nhibernate und der (Un-)Sinn von Repositories

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


kick it on dotnet-kicks.de   | Kommentieren | © 2010 Thomas Bandt

Thomas Bandt: Ich bin dann mal offline

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.


kick it on dotnet-kicks.de   | Kommentieren | © 2010 Thomas Bandt

Martin Richter: Breaking-Change: In VC-2010 in der STL wird 0 bzw. NULL nicht mehr gültiger Zeiger akzeptiert

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)
Add to favorites Google Bookmarks del.icio.us MisterWong.DE Technorati Facebook Live Twitter

Themenverwandte Beiträge:

Stefan Lange: Silverlight Tipp der Woche: .restext statt .resx Dateien für Text-Ressourcen

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.

Marco Scheel: Links for 2010-09-03 [del.icio.us]

msdn Austria [MS]: 13.10.2010 Wien Software Quality Conference Iqnite im Studio 44

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)

Anmeldung zur iqnite Konferenz

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

Softwaretesten wie es sein sollte

Martin Hey: Mal ausnahmsweise kein Standard

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:
  1. es soll eine fixe Innengröße haben - unabhängig von den Einstellungen für Rahmengrößen im Windows
  2. es soll einen 3D-Rahmen haben, der im Aero-Stil ist, wenn das Betriebssystem die Voraussetzungen dazu bietet
  3. 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.

Kay Giza [MS]: MSDN Hilfe und Support: Herzlichen Glueckwunsch zum 3. Geburtstag der kostenlosen MSDN Hotline

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 | Giza-Blog.de: RSS Feed
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
Subscribe

msdn Austria [MS]: Windows Phone 7: XNA Spieleentwicklung

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…

Sven Hubert: Das AIT TeamSystemPro Team auf der Basta 2010, Mainz

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

Florian Schmidt: Neues Handy - Ein Rundgang durch die Android Plattform (aus Windows Mobile Sicht)

 

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!

Kay Giza [MS]: Fuer Entwickler: Hilfe und Support: kostenlos, aber nicht umsonst!

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 | Giza-Blog.de: RSS Feed
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
Subscribe

msdn Austria [MS]: Visual Studio LightSwitch Beta 1 Training Kit

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

Tom Wendel [MS]: Ihre Phone App auf einem echten Phone testen? (EDT 08/31/10)

NRW Conf 2010 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

msdn Austria [MS]: Microsoft Certification Packs – turn your job into a career

image

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

 

image

Thorsten Hans: QuickTip: WorkItems im TFS 2010 löschen

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)

Ilker Cetinkaya: Me Likes Community Events

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#

seesharpDas von der .NET Usergroup Konstanz-Kreuzlingen organisierte Event hatte eine eine sehr ansprechende Agenda und hochkarätige Speaker zu bieten. Meine Sessionliste:

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!

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

André Krämer: Du kommst hier nicht rein!

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:

  1. 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.
  2. 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.
  3. 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.
  4. Gewohnheit:
    Der Anwender nutzt den IE 6 bereits seit Jahren, kommt gut mit ihm zurecht und will deshalb gar nicht updaten.
  5. 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 ;-)).
  6. 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

Klaus Aschenbrenner: Unique and non-unique non-clustered indexes on a unique clustered index

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:

image

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:

image

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:

image

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

Lars Keller: Microsoft Deutschland sponsert erneut das deutsche INETA Speakers Bureau

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:

 

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

Tom Wendel [MS]: TechTalk “Windows Phone 7 – Das mobile Tor zur Welt”

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

11.10.2010 Berlin Anmelden
12.10.2010 Hamburg Anmelden
18.10.2010 Köln Anmelden
19.10.2010 Karlsruhe Anmelden
25.10.2010 München Anmelden

 

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

msdn Austria [MS]: Windows Phone 7 Video: Seiten-Navigation in Silverlight

Get Microsoft Silverlight

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

KnomImageknom

msdn Austria [MS]: Windows Phone 7 Video: Aktivierung und Deaktivierung von Applikationen

Get Microsoft Silverlight

(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

Max_Foto3 knom

Kay Giza [MS]: NRW Conf, Windows Phone 7, der Albert laesst die Korken knallen

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 | Giza-Blog.de: RSS Feed
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
Subscribe

Norbert Eder: ChildWindow, DialogResult und MVVM

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.

kick it on dotnet-kicks.de

Marco Scheel: Links for 2010-08-30 [del.icio.us]

Thorsten Hans: See# Party - Review

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)

Tom Wendel [MS]: Heimtückische Queues bei Windows Azure (EDT 08/30/10)

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.

msdn Austria [MS]: 06.10.2010 in Köln – Steve Ballmer am Microsoft Software Strategy Summit 2010 für Softwarehersteller

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

Klaus Aschenbrenner: SQLdays 2010 – Fachkonferenz rund um SQL Server & Business Intelligence

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

Kay Giza [MS]: Neues MSDN Access und Windows Phone 7 Forum

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 | Giza-Blog.de: RSS Feed
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
Subscribe

Sven Hubert: Microsoft ALM Day mit AIT: Qualitätsicherung von und mit Microsoft - der Team Foundation Server

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

 

clip_image001

Golo Roden: See# Party 2010

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!

Ralf Schoch: .Net User Group Karlsruhe: Von 0 auf MSBuild 4.0

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

Jürgen Gutsch: LINQ ist eine Taube mit Kuckucksei

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

DotNetKicks-DE Image

Kay Giza [MS]: Ist dasBlog - die ASP.NET Blog-Engine - tot?

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 | Giza-Blog.de: RSS Feed
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
Subscribe

Marco Scheel: Links for 2010-08-28 [del.icio.us]

Martin Richter: Bug: VC-2010 MFC CFormView zeichnet Buttons beim Rollen falsch, es erscheinen schwarze Blöcke

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)
Add to favorites Google Bookmarks del.icio.us MisterWong.DE Technorati Facebook Live Twitter

Themenverwandte Beiträge:

ppedv Team Blog: [Hannes Preishuber] Selektierten Eintrag in Silverlight Listbox anders darstellen

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.

image

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.

image

ppedv Team Blog: [Hannes Preishuber] Visual Studio 2010 und Expression Blend Datenbindung mit Designer unterstzung

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

Im Webbrowser
image
Out Of Browser (OOB)

image

ppedv Team Blog: [Hannes Preishuber] Listbox eintrge die die ganze Breite einnehmen

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>

image

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

image

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

image

Kay Giza [MS]: MSDN jetzt auch auf LinkedIn

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 | Giza-Blog.de: RSS Feed
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
Subscribe

Jens Konerow: WP7 Entwicklerbuch von Microsoft.press

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 €

Ralf Westphal: Die Weite des Merkmalhorizonts

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

ppedv Team Blog: [Hannes Preishuber] Einen Silverlight Clipping Path Animieren

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.

image

Im XAML sieht das wie folgt  aus und man sieht nur mehr den Hintern der hübschen Person vom Foto Zwinkerndes Smiley.

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

 

imageimageimage

Stefan Lange: Silverlight Tipp der Woche: ConditionalConverter

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.

Jens Konerow: XNA Game Studio 4.0 kommt ins Rollen

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.

friends header

bloggers headline

links header

 
Don't contact us via this (fleischfalle@alphasierrapapa.com) email address.