.NET Blog   ·   .NET Casts   ·   .NET GUI Foren   ·   .NET BlogBook   ·   WPF Blogger   ·   visual studio one   ·   ASP.NET professional

  • ACHTUNG - NEUES BLOG

    Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
Download .NET Essentials Installer
Trickkiste

WPF: RoutedCommand, RoutedUICommand, ICommand und Commands im Allgemeinen - Eine Einführung

02.01.08 - .NET, Grundlagen, WPF
Beitrag von Norbert Eder
 Einige mögen bereits wissen, dass unter der Windows Presentation Foundation die Möglichkeit besteht, Commands zu verwenden. Für andere mag es neu sein. Wem ein Command gar nichts sagt, der möge sich meinen Beitrag Patterns: Command Pattern zuvor zu Gemüte führen.

Das Command-System wurde in die Windows Presentation Foundation integriert, um durchzuführende Aufgaben/Tasks besser vom User Interface (Oberfläche) zu trennen.

Warum UI von Aufgaben trennen


Ein oft geschilderter Vorteil der WPF ist, dass das grafische Design nicht zwingend vom Entwickler gemacht werden muss. So kann hier in der Tat ein Designer Hand anlegen (jedoch muss er etwas von XAML verstehen). Das ist jedoch nicht der Punkt, auf den ich hinaus möchte.
Ein Grundsatz der Softwareentwicklung ist es, stabile und robuste Software zu bauen. Dazu muss natürlich getestet werden. Manuelle Tests, die alles abdecken sind aber einer bestimmten Projektgröße kaum durchzuführen. Automatisierte Tests müssen her. Mit Hilfe von Unit Tests können nun Teile der Anwendung getestet werden. Dies funktioniert jedoch nur dann, wenn diese Teile vom grafischen Aufbau komplett getrennt sind. Sinnvoller Weise werden nun sämtliche Aufgaben von der UI getrennt und werden/bleiben so testbar.

Wie kann die WPF hier helfen?


Mit Hilfe der WPF Commands muss hier kein großer Aufwand betrieben werden, um obiges Ziel auch tatsächlich zu erreichen. Nun gibt es jedoch zwei abzudeckende Möglichkeiten:
  • Commands müssen das UI aktualisieren
  • Commands können komplett frei von allen UI-Einflüssen ausgeführt werden

Muss der Command mit der Oberfläche interagieren, sind RoutedUICommands genau der richtige Ansatz. Im zweiten Fall ist das Interface ICommand zu implementieren.

Bezüglich der RoutedUICommands ist es nun so, dass durch die WPF bereits einige fertige Implementierungen vorhanden sind:


Der Vorteil liegt darin, dass diese Commands sehr einfach an UIElemente gebunden und ausgeführt werden können. Hier ein kleines (unvollständiges) Beispiel zur Veranschaulichung:
<UserControl.CommandBindings>
    <CommandBinding 
      Command="MediaCommands.Play" 
      CanExecute="OnQueryExecute" 
      Executed="Execute"/>
</UserControl.CommandBindings>

<StackPanel Grid.Row="2" Orientation="Horizontal">
    <Button 
      Command="MediaCommands.Play" 
      Content="{Binding RelativeSource={RelativeSource Self}, 
        Path=Command.Text}" />
</StackPanel>

Da diese Commands jedoch ein spezifisches Verhalten anbieten, welches nicht immer benötigt wird, ist es mitunter notwendig, eigene Commands zu implementieren, um die gewünschte Funktionalität zu erhalten.

Eigene Commands via ICommand implementieren


Müssen eigene Funktionalitäten als Command abgebildet werden, kann dies mit Hilfe einer Implementierung des ICommand-Interfaces passieren. Dieses Interface schreibt zwei Methoden vor und ein Event vor:
  • CanExecute
  • Execute
  • CanExecuteChanged


Ein simpler Beispielcommand, welcher ein bestimmtes Objekt entgegeben nimmt und dieses manipuliert, könnte wie folgt aussehen:
public class MySaveCommand : ICommand
{
    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        if (parameter is EasySum)
        {
            EasySum es = (EasySum)parameter;
            es.Result = es.Summand1 + es.Summand2;
        }
    }

    #endregion
}


Eine weitere - und vor allem übliche - Möglichkeit besteht darin, einen RoutedCommand zu erstellen.

RoutedCommand erstellen


Mit Hilfe von RoutedCommands ist es sehr einfach, einen Command für das User Interface zu erstellen. Dazu benötigt es nicht sehr viel. Das nachfolgende Beispiel zeigt, wie anhand eines RoutedCommands die Hintergrundfarbe eines Panels verändert werden kann.

Hierzu muss unser neuer Command definiert werden:
public static RoutedCommand ChangeBackgroundCommand = new RoutedCommand();

Des weiteren müssen zwei Eventhandler implementiert werden. Zum einen für das CanExecute-Event und zum anderen für das Executed-Event.
private void ChangeBackgroundCommandCanExecute(
    object sender, CanExecuteRoutedEventArgs e)
{
    if (sender is Panel)
        e.CanExecute = true;
    else
        e.CanExecute = false;

}

private void ChangeBackgroundCommandExecuted(
    object sender, ExecutedRoutedEventArgs e)
{
    Panel target = e.Source as Panel;
    if (target != null)
    {
        if (target.Background == Brushes.AliceBlue)
        {
            target.Background = Brushes.LemonChiffon;
        }
        else
        {
            target.Background = Brushes.AliceBlue;
        }

    }
}

Im Eventhandler für das CanExecute-Event überprüfen wir lediglich, ob das übergebene UIElement auch tatsächlich ein Panel ist. Ist dem so, lassen wir eine Manipulation der Hintergrundfarbe zu. Andernfalls wird eine Ausführung des Commands verwehrt.
Im Eventhandler für das Executed-Event wird dann die Hintergrundfarbe geändert bzw. wieder auf die Ursprungsfarbe zurück gestellt.

Damit der Command nun auch verwendet werden kann, muss ein CommandBinding erstellt werden:
<StackPanel Name="MyStackPanel"
    Background="AliceBlue"
    Focusable="True">
    <StackPanel.CommandBindings>
        <CommandBinding 
            Command="{x:Static custom:Window1.ChangeBackgroundCommand}"
            Executed="ChangeBackgroundCommandExecuted"
            CanExecute="ChangeBackgroundCommandCanExecute"/>
    </StackPanel.CommandBindings>
    <Label>A StackPanel</Label>
    <Button Command="{x:Static custom:Window1.ChangeBackgroundCommand}"
      CommandParameter="ButtonOne"
      CommandTarget="{Binding ElementName=MyStackPanel}" 
      Content="Change Background" />
</StackPanel>

Wie zu sehen ist, wird hier der aufzurufende Command definiert, als auch die beiden Eventhandler, die bereits implementiert wurden. custom definiert hier lediglich einen eigenen Namespace.
Das CommandBinding ist an einem StackPanel definiert, welches ein Label und einen Button enthält, welcher dann schlussendlich den Command auslöst.

Fazit


Dieser Artikel hat das der WPF zugrunde liegende Konzept der Commands vorgestellt und eine kleine Übersicht inklusive einiger Beispiele gegeben. Ebenso wurden die Unterschiede erläutert. Damit sollte nun jeder angehende WPF-Entwickler das notwendigste Wissen mitbringen, um eigene Commands zu entwickeln und diese in seinen Anwendungen einzusetzen. Natürlich wird es durchaus noch notwendig sein, das eine oder andere nachzulesen. Der Start sollte damit allerdings gemacht sein.
  Kommentar hinzufügen   |  2 Trackbacks   |  Permalink  |  Trackback-URL


Rückblick 2007, Aussichten 2008

31.12.07 - Blog-Intern
Beitrag von Norbert Eder
 Das Jahr 2007 ist nun um und ich möchte durchaus ein paar Worte zum vergangenen Jahr verlieren - war es doch ein spannendes.

Ein kurzer Rückblick


2007 begann grundsätzlich ganz gut, wohlwissend, dass einige Arbeit auf mich warten würde. Eine Idee war geboren und musste umgesetzt werden. .NET Casts. Geplant als Lieferant von Informationen rund um .NET und Microsoft. Neben diversen Casts wurde zugleich auch das .NET BlogBook eingeführt.

Im Laufe des Jahres gab es dann auch die Teilnahme an zwei größeren Veranstaltungen. So zuerst die ASP Konferenz, gefolgt von der BASTA!. Damit verbunden waren sehr viele neue Kontakte und natürlich auch jede Menge neuer Ideen, die sich im Zuge der einzelnen Vorträge heraus kristallisierten.

Auch Veröffentlichungen gab es 2007 wieder einige wichtige. Silverlight, gefolgt von Visual Studio 2008 (.NET Framework 3.5) und C# 3.0. Natürlich gab es viel mehr, aber für mich waren das wohl die wichtigsten neuen Produkte.

Zu den ganzen neuen Projekten, Veranstaltungen und Produkten hat sich auch auf diesem Blog einiges getan. Kleinere Aktualisierungen der Oberfläche sind hier nur ein ganz kleiner Punkt, da diese wohl nicht so auffällig waren. Vielmehr habe ich das angebotene Themenspektrum ein wenig eingeschränkt und werde dies auch weiter tun. Ein Spezialisierungsprozess, welcher - aus meiner Sicht - durchaus sinnvoll ist und sicherlich auch meinen Lesern zugute kommt, so hoffe ich zumindest.

2007 in ein paar wenigen Zahlen


Wie misst man Erfolge? Nun, schwer zu beantworten. Neben den vielen neuen Kontakten, Gesprächspartnern und Freunden möchte ich ein paar Zahlen liefern, die für viele vielleicht klein erscheinen mögen, für mich aber schon einen kleinen Erfolg dieses Blogs und meiner anderen Projekte zeigen.

.NET Casts
Insgesamt wurden 9 Livecasts und 7 Podcasts aufgezeichnet und online gestellt. Unabhängig der Teilnehmerzahlen der Livecasts gab es insgesamt 12.908 Downloads der einzelnen Casts (wobei einer überhaupt nicht zum Download angeboten wurde, da dieser extern gehostet wurde und wir das Material leider nie zur Verfügung gestellt bekamen). Alleine durch diese Downloads wurden 0,5 Terabyte an Daten von unserem Server geladen.

Außer der Casts gab es noch unser .NET BlogBook mit insgesamt 4 Ausgabe. Von Ausgabe zu Ausgabe konnten die Downloadzahlen gesteigert werden, was uns gezeigt hat, dass dieses Service durchaus Anklang fand. Insgesamt konnten über 15.000 Downloads verzeichnet werden. Tendenz steigend. Auch konnten wir mit der 4. Ausgabe das erste Gewinnspiel veranstalten. Aus zahlreichen Teilnehmern wurden schließlich 5 Gewinner ausgewählt.

Blog - Living.NET
Alle auf diesem Blog angebotenen Downloads wurden 2007 32.800 Mal genutzt. Eine - für mich - durchaus beachtliche Zahl.

Die Anzahl der Besuche konnte um 387 % gegenüber 2006 gesteigert werden, die Seitenzugriffe um 326 %. Zahlen mit denen man durchaus zufrieden sein kann.

Ausblick 2008


2008 wird sicherlich auch wieder ein spannendes Jahr. Was wird meine Leser erwarten, was plane ich zu unternehmen, wie geht es weiter?

Schwer zu sagen, auch 2008 wird es wieder viel Neues zu berichten geben, viele Artikel wollen wieder geschrieben werden und auch sonst wird es ein sehr interessantes Jahr werden (einige wenige wissen ja bereits Bescheid).

Hier eine geplante Übersicht:
.NET Casts: Dieses Projekt ist leider im letzten Quartal 2007 ein wenig eingeschlafen. Hauptgrund war wohl, dass wir als Team ziemlich mit Arbeit eingedeckt waren und somit kaum bis gar nicht zu Aufzeichnungen kamen. Leider. Schließlich war noch viel für 2007 geplant. Für 2008 erhoffen wir uns auf jeden Fall wieder den einen oder anderen spannenden Cast, als auch 4 neue Ausgaben des .NET BlogBooks (hier dürfen die ersten Jänner-Tage spannend erwartet werden).

Blog Living.NET: Auch hier sind einige Änderungen geplant, die jedoch noch nicht vollständig ausgereift sind. Im Laufe des ersten Quartals wird ein komplett neuer Bereich eingezogen, auf den ich jetzt im Moment jedoch noch nicht näher eingehen will. Man darf durchaus gespannt sein.

Projekte: Hoffentlich noch im Jänner 2008 wird eine neue Plattform für Entwickler online gehen. Aufmerksame Blog-Leser werden wohl wissen, worum es geht. Anderen möchte ich die Überraschung nicht verderben. Geplanter Start: Februar/März 2008.

Die eine oder andere Geschichte wird dann 2008 sicherlich noch passieren, aber alles möchte ich nicht verraten.

Abschluss


Schlussendlich möchte ich mich bei meinen treuen Lesern bedanken. Für die Unterstützung, die Beteiligung an Diskussionen, die vielen Hinweise, Ratschläge und Diskussionen. DANKE.

Daher, allen einen guten Rutsch. Glück, Erfolg und natürlich Gesundheit für 2008.
  2 Kommentare - 780 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


.NET Framework und Visual Studio Downloads

27.12.07 - Blog-Intern, .NET, Visual Studio
Beitrag von Norbert Eder
 Seit längerer Zeit gibt es hier am Blog eine Download-Sektion mit den wichtigsten und gängigsten .NET Framework und Visual Studio Downloads. Diese Sektion wurde von mir nun wieder angepasst, als auch neue Downloads eingepflegt.

Sollten weitere, wichtige Downloads fehlen, werde ich diese natürlich in die Liste mit aufnehmen.
  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Visual Studio one: LINQ: Vom Regen in die Traufe?

24.12.07 - Blog-Intern, .NET, Datenverwaltung
Beitrag von Norbert Eder
  Die Liste der von mir verfassten Fachzeitschriften Artikel ist wieder angewachsen.

In der Ausgabe 01/08 der Visual Studio one wurde der Artikel LINQ: Vom Regen in die Traufe? veröffentlicht. Dabei handelt es sich um eine kritische Hinterfragung wie sinnvoll denn LINQ für uns Entwickler tatsächlich ist und in welchen Bereichen sich ein Einsatz lohnt und wo man dann doch lieber die Finger davon lassen sollte.

Zusatz: Die Ausgabe 01/08 lohnt sich zudem mehrfach: Neues Design und mehr Inhalte. Also genug Stoff für die Feiertage und zudem noch schön anzusehen.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Die Wohnung vs Küche, Teil 6

23.12.07 - Blog-Intern
Beitrag von Norbert Eder
 Freitag auf Samstag um 2:00 Uhr in der Früh war es dann soweit. Die Küche hat den Kampf gewonnen und sich erfolgreich einen Teil der Landkarte gesichert. Hier die letzten Bilder und damit wäre dieses Thema nun auch abhakt und es kann normal im Programm weitergehen.







Geschafft. Over and out.

  4 Kommentare - 860 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Die Wohnung vs Küche, Teil 5

21.12.07 - Blog-Intern
Beitrag von Norbert Eder
 Der Vormarsch der Küche ist kaum mehr aufzuhalten. Vorhandene Stellungen wurden weiter befestigt und mit zusätzlichen Mannen versehen. Hier wird es wohl nichts mehr zu holen geben, für die Wohnung. Die Schlacht neigt sich dem Ende zu ...





Kann sich die Wohnung gegen diese Übermacht noch einmal behaupten?

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Die Wohnung vs Küche, Teil 4

21.12.07 - Blog-Intern
Beitrag von Norbert Eder
 Zur Zeit findet wohl die alles entscheidende Schlacht statt. Sowohl die Küche, als auch die Wohnung haben sich gerade strategisch positioniert und werden wohl in Kürze mit aller Wucht aufeinander treffen. Ich hoffe nur, dass sich die Verwundeten und Verletzten in Grenzen halten.





Man darf auf den Ausgang durchaus gespannt sein.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Die Wohnung vs Küche, Teil 3

21.12.07 - Blog-Intern
Beitrag von Norbert Eder
 Jede Schlacht fordert ihre Opfer und man muss ihrer gedenken. Auch wenn die Wohnung sich bereits im Rückzug befindet, ist es die Küche, die bereits einen jungen starken Krieger verloren hat.



Aber eines ist sicher: Die Küche wird sicherlich nicht zurückstecken und wohl diesen verletzten Krieger durch einen stärkeren ersetzen.
  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Die Wohnung vs Küche, Teil 2

21.12.07 - Blog-Intern
Beitrag von Norbert Eder
 Es ist soweit, die Küche hat den Kampf mit der Wohnung aufgenommen. An vielen Stellen finden Scharmützelkämpfe statt, doch konnte die Küche bereits erfolgreich Plätze einnehmen und Stellungen erbauen.

Hier nun das Schlachtfeld:







Zur Erinnerung: heute Morgen wähnte sich die Küche noch in Sicherheit ... die Bilder.
  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Visual Studio 2008 verdunkelt und stromsparend

21.12.07 - .NET, Visual Studio
Beitrag von Norbert Eder
 Hier habe ich ja bereits einmal auf ein paar Einstellungen für Visual Studio aufmerksam gemacht, die einfach etwas dunkler sind. Dies hat nicht nur den Vorteil, dass es die Augen schont, sondern zudem auch noch stromsparend ist.

Hier nun meine verwendeten Einstellungen. Zuerst für normales C#:



Und hier für XAML (Einstellungen für XML sind die gleichen):



Wer sich diesen Style auch zulegen möchte, der kann mein nachfolgendes VSSettings-File importieren.

Download VS2008_Eder.zip

Zusätzlich wird der kostenlose Font Monaco benötigt.
  9 Kommentare - 1268 mal angesehen   |  1 Trackbacks   |  Permalink  |  Trackback-URL



Zurück Weiter