Kalender
<<  Juli 2014  >>
MoDiMiDoFrSaSo
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
blettner , eingetragen am 26. Oktober 2009, 15:46

Seit kurzem steht die zweite Beta von Visual Studio 2010 zum Download bereit. Seit der letzten Beta hat sich einiges getan!!
Alle wichtigen Informationen und Download findet man hier: www.codefest.at

Scott Guthrie hat auch schon einige spannende Artikel zum Thema VS 2010 gepostet welche man hier findet: http://weblogs.asp.net/scottgu

blettner , eingetragen am 6. September 2009, 20:25

Da der Sommer nun leider vorbei ist, wird es wieder Zeit hier etwas zu schreiben. Es ist einiges passiert seit meinem letzten Eintrag und das möchte ich hier “als Aufwärmübung” zusammenfassen.

Windows 7

Ich glaub eines der Ereignisse auf die man sehnsüchtig gewartet hat, war die Fertigstellung von Windows 7 bzw. die Freigabe auf MSDN und Technet. Für Entwickler wurde unter anderem das Windows 7 Code Pack V 1.0 zur Verfügung gestellt mit welchem sich Win7 features in .net Applikationen nutzen lassen:

  • Windows 7 Taskbar Jump Lists, Icon Overlay, Progress Bar, Tabbed Thumbnails, und Thumbnail Toolbars.
  • Windows 7 Libraries
  • Windows Vista und Windows 7 Common File Dialogs
  • Windows Vista und Windows 7 Task Dialogs.

…um nur einiges zu nennen (die vollständige Liste ist auf der Downloadseite einsehbar).

Visual Studio 2010

Hier gibts an sich keine neue Version, aber Scott Guthrie veröffentlicht gerade mehrere Blogeinträge über die neuen Funktionen in Visual Studio 2010 und .net 4.0.
http://weblogs.asp.net/scottgu/default.aspx

Silverlight 3 und Expression Studio 3.0

Desweiteren wurde eine neue Version von Silverlight veröffentlicht. Expression Studio erschien auch in einer neue Version (wobei vorallem Blend ein interessantes Upgrade mit SketchFlow) erhielt.

Downloads für Silverlight findet man hier: Silverlight Developer Tools download
Die Trial von Expression Studio erhält man hier: Expression Studio Trial download

Auf codefest.at gibts zur Zeit einen online Webcast zum Thema Silverlight – für jene die sich mit dem Theme näher befassen wollen auch sehr interessant.

In letzter Minute…

Traurig für Nutzer des Windows Mediacenters. Habe gerade am windowsblog.at gelesen, dass Digital Everywhere ihre Aktivitäten einstellen.
Kann mich da nur der Meinung dort anschliessen, sehr schade!!

Hier gehts zum Eintrag: http://www.windowsblog.at/post/2009/09/06/Kein-Digital-Everywhere-mehr.aspx

blettner , eingetragen am 27. Juni 2009, 09:36

Eine der Verbesserungen von VS 2010 die auf uns zukommen, ist die überarbeitete Workflowfoundation. Und da muß ich sagen, diese wird für uns Entwickler endlich verwendbar. Diesesmal ist es wirklich so, dass man Workflows designed und diese dann im Prinzip schon laufen ohne sich noch um viel drumherum kümmern zu müssen.

Anhand eines kleinen Authentifizierungsbeispieles möchte ich zeigen, wie einfach es nun geworden ist. Natürlich reizt dieses Beispiel bei weitem nicht den Funktionsumfang aus, aber man bekommt einen ersten Eindruck.

Design des Workflows

Zuallererst legt man im VStudio ein neues Workflow Projekt an, in diesem Fall ein Sequence Workflow.

project_creation

Ist das Projekt geladen, wird ein Basis Workflow ohne Funktion angezeigt. Zuallererst wollen wir den Benutzernamen überprüfen und im nächsten Schritt das Passwort. Dazu wird die IF – Bedingung verwendet.

wf_sequence

Da in diesem Beispiel an den Workflow Parameter übergeben werden, müssen diese ebenfalls definiert werden.

Arguments

Dazu gibt es im Workflow Designer eine Möglichkeit lokale Variablen und Übergabe Parameter zu erstellen.

Klappt man nun den Workflow auf erhält man folgende Ansicht.

wf_check_user

Diese zeigt, dass die IF Bedingung aus einer “Condition” und einem “Then”, “Else” Zweig besteht. Wie in jeder IF Anweisung wird eine Bedingung angegeben die auf True/False überprüft wird. Je nachdem wird dann der Then oder Else Zweig verwendet. Unsere Condition heisst Username = “Hubert”. Hier möchte ich noch anmerken, dass zum Eingeben von Conditions ein vollständiger VB Editor zur Verfügung steht der auch Intellisense unterstützt.

Ist unsere Bedingung gültig, wird die nächste IF Bedingung aufgerufen, welche das Passwort überprüft. Ist der Benutzername falsch, wird eine Exception ausgelöst und der Workflow abgebrochen.

wf_assign

Ist das Passwort ebenfalls gültig, wird die Variable Passed  auf TRUE gesetzt. Ansonsten auf FALSE und der Workflow beendet.

 

Anpassnungen im Code 

Nachdem unser Workflow nun designed ist, müssen wir einige Änderungen am Code vornehmen, damit die Parameter an den Workflow übergeben werden.

Dictionary<string, object> objParameters = new Dictionary<string, object>();
objParameters.Add("Username", Console.ReadLine());
objParameters.Add("Password", Console.ReadLine());
objParameters.Add("Passed", false);

Dazu wird ein Dictionary Objekt verwendet. Die Items im Dicitonary haben als Key den selben Namen wie die im Workflow angelegten Argumente – anhand dieses Names passiert letztendlich das Matching.

WorkflowInstance myInstance = new WorkflowInstance(new Sequence1(), objParameters);

Um die Werte an den Workflow zu übergeben, muß man noch das erstellen der Instanz um das Dictionary erweitern.

myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e) { 
        syncEvent.Set();
        Console.WriteLine(e.Outputs["Passed"].ToString());
};

Ist der Workflow durchgelaufen, wird der OnCompleted Event aufgerufen in dem man mittels e.Outputs auf das Result Dictionary zugreifen kann – in meinem Fall auf die Variable Passed, die im Workflow gesetzt wurde.

result

Conclusio

Wie man anhand dieses Beispieles sieht, kann man sehr einfach und schnell einen Workflow designen und diesen verwenden. Auch bei so einem einfachen Beispiel freut man sich schon darauf WF4 in zukünftigen Projekten einzusetzen. Das schaut nach einem sehr mächtigen Werkzeug aus!

blettner , eingetragen am 15. Juni 2009, 10:22

Sucht man in WPF nach Refresh und Invalidate, um ein erneutes zeichnen eines GUI Elementes zu erzwingen, wird man leider nicht fündig. Es gibt aber eine andere einfache Methode, genau den selben Effekt zu erreichen. Das unten angeführte Beispiel zeigt, wie man mit Hilfe des Dispatcher Objektes das neu zeichnen des Forms erzwingen kann.

public partial class FormTest : Window {
    private static Action EmptyDelegate = delegate() { };
 
    public FormTest() {
        InitializeComponent();
    }
 
    public void DoSomething(string strMessage) {
        lblStatus.Content = strMessage;
 
        this.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
    }
}

Ein gutes Tutorial bezüglich des Dispatchers und seiner Funktion findet man hier.

blettner , eingetragen am 11. Juni 2009, 10:56

Eine gute Methode um Benutzern einer Software zu zeige, dass gerade eine etwas längere Operation durchgeführt wird, ist das Ändern des Mousecursors.

Winform:

Unter Winform kann man das folgendermassen machen:

this.Cursor = Cursors.WaitCursor;

Ist die Operation beendet, setzt man diesen wieder auf den Default Wert zurück.

WPF:

Unter WPF ists eigentlich das selbe – dachte ich mir zumindest. Das Cursor Property steht einem genauso wie in Winform zur Verfügung, nur kann man setzen was man will, es ändert sich nichts. In WPF muß man es nämlich so machen:

Mouse.OverrideCursor = Cursors.Wait;

Zurückseten kann man das Ganze in dem man das Property auf null setzt.

blettner , eingetragen am 4. Juni 2009, 14:05

Basics:

Prinzipiell sind bei Drag&Drop Operationen mindestens 2 Komponenten betroffen (es gibt natürlich auch Drag&Drop Operationen innerhalb eine Komponente z.b. verschieben von Treeknoten, ich möchte mich hier aber mit Drag&Drop Operationen zwischen 2 verschiedenen Elementen befassen).

In meinem Beispiel selektieren ich eines oder mehrere Elemente aus einer Listbox. Um die Drag&Drop Operation zu starten, muß die linke Maustaste gedrückt sein und sich die Maus bewegen. Trifft das zu, wird mittels DragDrop.DoDragDrop die Operation gestartet. Angegeben wird hier das Objekt das den Event auslöst, ein Objekt mit Daten und der Typ des Mauscursors.

private void listBox_MouseMove(object sender, MouseEventArgs e) {
    if (listBox.SelectedItems.Count > 0) {
        if (e.LeftButton == MouseButtonState.Pressed) {
            objStringList.Clear();
 
            foreach (ListBoxItem objItem in listBox.SelectedItems) {
                objStringList.Add(objItem.Content.ToString());
            }
 
            DragDrop.DoDragDrop(this, 
objStringList,
DragDropEffects.Move);
        }
    }
}

private void DragArea_DragEnter(object sender, DragEventArgs e) {
    e.Effects = DragDropEffects.Move;
}

Begibt man sich mit der Maus nun über das zweite Control, wird der DragEnter Event ausgelöst (wobei man hier noch erwähnen sollte, dass das AllowDrop Property auf dem Control auf true gesetzt werden muß damit das funktioniert). Hier kann man nochmal den Mousecursor setzen (abhängig, ob es sich um ein Objek richtigen Types handelt usw.).

private void DragArea_Drop(object sender, DragEventArgs e) {
    string strMessageBox = "";
    if (e.Data.GetDataPresent(typeof(List<string>))) {
        foreach (string strItem in e.Data.GetData(
typeof(List<string>)) as List<string>) {
            strMessageBox += strItem;
        }
 
        MessageBox.Show(strMessageBox);
    }
}

Im Drop Event wird das übergebene Objekt angenommen und weiterverarbeitet – am Besten auch hier nochmal überprüfen, ob es sich um ein Objekt vom richtigen Typ handelt. In meinem Beispiel werden die Strings aus der Liste zusammengehängt und in einer Messagebox angezeigt.

Drag&Drop von WPF nach WinForm Control in Elementhost

Das funktioniert im Prinzip genauso wie das oben gezeigte Beispiel. Einziger Unterschied ist, dass die Events etwas anders heissen.

Was tun wenn GetData immer NULL liefert

Es kommt immer wieder vor, dass GetData immer NULL retour gibt, obwohl man ein Objekt mit Daten in der DoDragDrop Methode übergibt und auch GetDataPresent den richtigen Objekttyp zurückgibt. Nicht verzagen, sondern einfach mal einen andern Objekttyp auszuprobieren – in meinen Fällen trat es meist bei selbst definierten Objekten auf, dass das nicht funktionier hat. Sollte ich hier mehr in Erfahrung bringen, werde ich dieses Post ergänzen.

Alles in allem ist Drag&Drop sehr einfach implementiert und bietet einem gute Möglichkeiten sein UI sinnvoll zu erweitern.