Windows Presentation Foundation 4. Einführung und Praxis

 Ausbildung, Entwicklung  Kommentare deaktiviert für Windows Presentation Foundation 4. Einführung und Praxis
Feb 052011
 

WPF 4 - Einführung und PraxisKurz bevor das Jahr 2010 zu Ende ging habe ich noch einen Amazon Gutschein eingelöst. Norbert Eder hat zu dieser Zeit sein neues Buch “Windows Presentation Foundation 4. Einführung und Praxis ” bei Twitter erwähnt. Da ich wusste, dass ein WPF Projekt auf mich zukam, löste ich den Gutschein gleich mal ein.

Das Buch fängt bei den Basics zu WPF an. Für mich als “erfahrenen” Programmierer genau das richtige. Ich musste mich nicht zuerst noch durch etliche Kapitel C# für Anfänger kämpfen. Ging einfach mit den Basics zu WPF los.

Nutzen, Werkzeuge, Voraussetzungen u.s.w. Alles sehr kurz und knapp, aber nicht so das man das Gefühl hätte dass was fehlt. Das zog sich das ganze Buch hindurch. Absolut genial. Ich suche Bücher die einem kurz und bündig erklären und beibringen um was es geht. Genau für solche ist das Buch gedacht. Ein Anfänger wird nicht glücklich mit diesem Buch.

Das letzte Kapitel geht auf das MVVM Pattern ein. Ich dachte eigentlich, ich hätte kapiert um was es bei MVVM geht. Aber nach dem lesen dieses Kapitels musste ich mir eingestehen das dem nicht ganz so war. Zudem wird ein kleines Framework für den Umgang mit dem MVVM Pattern erstellt. Das werde ich sicher bei meinem nächsten Projekt nutzen.

Kurz: Das Buch kann ich allen empfehlen die schon Erfahrung mit Windows Forms haben. Für Personen die ganz wenig Erfahrung mit WPF haben ist es auch sehr wertvoll. Für Personen die noch nicht programmieren können ist es wahrscheinlich nicht geeignet. Es fehlt dann einfach zu viel Grundwissen. Solche Bücher müsste es mehr geben.

Visual Studio 2010 – WPF UserControls nicht automatisch in der Toolbox

 Entwicklung, Hilferuf und Lösung, Software  Kommentare deaktiviert für Visual Studio 2010 – WPF UserControls nicht automatisch in der Toolbox
Jul 282010
 

In einem aktuellen Projekt entwickeln wir ein Tool das auf WPF basiert. Da gibt es eine zentrale Windows Anwendung die je nach Bedarf UserControls nach lädt. Alle Module werden also in UserControls realisiert und bei bedarf nachgeldaden.

Da es aber in zwischen dutzende Module sind mit einigen 100 UserControls artet das natürlich in der Toolbar aus. Jedesmal beim Kompilieren ist in der Toolbar die Hölle los. Wenn man in der Toolbar auch temporär ein paar Code Snippets sammelt, sie sind danach immer wo anders. Das hat mich sowas von …

Die Lösung dazu ist aber gut versteckt. Will man nicht das die Toolbox automatisch aktualisiert wird muss man das dem Visual Studio 2010 explizit mitteilen.

Extras –> Optionen –> Text Editor –> XAML –> Sonstiges –> Checkbox entfernen bei “Toolboxelemente automatisch ausfüllen”

Checkbox entfernen

Danach sieht die Toolbar schon viel besser aus.

Toobox nachher

Nicht mehr so überladen wie vorher.

Toolbox vorher

Die Kategorien müssen allerdings noch Manuel entfernt werden. Sie verschwinden nicht einfach so.

So, jetzt wieder an die Arbeit.


Artikel empfehlen auf .NET-Kicks Deutschland

Apr 162010
 

Sachen die immer mal wieder nützlich sein können.

1. Kalenderwoche eines Datum ermitteln.
private int KW(DateTime datum)
{
    CultureInfo cultureInfo = CultureInfo.CurrentCulture;
    int kw = cultureInfo.Calendar.GetWeekOfYear(datum, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return kw;
}
2. Ein einfaches Event erstellen.
public event EventHandler<EventArgs> DeletePersonEvent;
public void DeletePerson()
{
	if(DeletePersonEvent != null)
	{
		DeletePersonEvent(this, new EventArgs());
	}
}
3. WPF Zeilenumbruch in einer Caption oder Text Tag.
<TextBox x:Name="myTextBox" Text="Linie 1 &#x0a; Linie 2" />

Zeilenumbruch mit: &#x0a;

4. DataTable über WCF

Das geht nicht. Man darf es zuerst noch in ein DataSet verpacken und dann über WCF übertragen.

public DataSet GetPersonenDataSet()
{
    DataSet ds = new DataSet();
    ds.Tables.Add(m_PersonDao.Read());

    return ds;
}

m_PersonDao.Read() gibt ein DataTable zurück.

5. WPF Datenbindung

Auch immer mal wieder etwas was ich suche, obwohl es eigentlich sehr einfach ist.

Wahrscheinlich gibt es etwa 1000 Möglichkeiten wie man es lösen kann. Ich mache es zur Zeit so.

Code-Behind vom XAML:

public RaumView(RaumModel model)
{
    InitializeComponent();

    this.m_Model = model;

    this.DataContext = m_Model;
}

In Zeile 7 binde ich eine Klasse, die meine Objekte enthält, an den DataContext.

Danach kann ich auf den Controls relativ einfach die Daten binden.

Text="{Binding Raum.Standort.Bezeichnung, Mode=OneWay}"

In diesem Text wird eigentlich m_Model.Raum.Standort.Bezeichnung angezeigt. Das Feld wird aber nicht zurück in den DataContext synchronisiert (Mode=OneWay). Wenn das der fall sein soll, dann macht man das so.

Text="{Binding Raum.Bezeichnung, Mode=TwoWay}"

Die Bezeichnung des Raumes wird jetzt in den DataContext zurück synchronisiert (Mode=”TwoWay”).

So in etwa reicht es für mich zur Zeit aus.

6. GUID im Debugger ändern

Hat man mal das Bedürfnis eine Variable zur Laufzeit zu ändern, die vom Typ GUID ist, kann man nicht einfach die neue GUID im Debugger reinschreiben.

So sieht es zur Laufzeit aus.

Original GUID

Einfach neue GUID zwischen die {} kopieren resultiert in einem Fehler.

Fehler

Lösung:

Richtig gemacht

new Guid(“<GUID>”)

So sieht es danach aus.

neue GUID

7. Irgend eine Datei öffnen

Ich will eine Datei öffnen ohne das ich das Programm kennen muss was für die Datei nötig ist. Das geht natürlich nur wenn ein Haendler für die Datei auf dem System registriert ist. Und wenn, dann ist es einfach.

Process myProcess = new Process();
myProcess.StartInfo.FileName = "<PFAD_ZUR_DATEI>";
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();

Der FileName muss ein kompletter Pfad zu seiner Datei sein. z.B.: “c:\temp\MeinProgi\MeineDatei.txt

8. Eine E-Mail mit dem Standard E-Mail Programm öffnen.

Auch das kann mit der Process Klasse gemacht werden.

Process myProcess = new Process();
myProcess.StartInfo.FileName = string.Format("mailto:{0}", mailto);
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();

Und schon öffnet sich eine E-Mail mit seinem Standard E-Mail Programm. Aber das geht nur wenn auf dem System ein mailto Haendler registriert ist. Aber sobald ein E-Mail Klient installiert ist ist das der Fall. Wenn kein mailto Haendler vorhanden ist kann eigenartiges Passieren. Bei uns auf einem Windows XP startete danach ein paar 100 Mal der Internet Explorer. Wie so er so oft startete ist mir nicht klar. Aber danach gab es eine Klickorgie bis alle IE’s geschlossen waren.

Der mailto Haendler ist unter HKEY_CLASSES_ROOT\mailto zu finden. Das heisst, es muss auch etwas in der Form HKEY_CLASSES_ROOT\mailto\shell\open\command mit einem Eintrag vorhanden sein.

So kann auch eine URL mit dem Standardbrowser geöffnet werden. Dann gibt man bei FileName nur die URL an. http://…

9. WCF Klassen und ihre Konstruktoren

Ich wollte bei der Initialisierung einer neuen Klasse einen Wert erzwingen. Der soll immer gesetzt werden. Dazu habe ich einfach den Konstruktor überladen, dass heisst, keinen leeren mehr angeboten.

Danach wollte der Host nicht mehr starten. Aber die Fehlermeldung gab keinen Hinweis darauf. Auch war in den Tracelogs vom WCF kein Hinweis zu finden. Per Zufall habe ich dann einen Haltepunkt geschickt gesetzt und dort den Hinweis bekommen das die Klasse Serie nicht serialisiert werden kann. Da machte es klick.

Man merke sich. Klassen die über WCF übertragen werden sollen MÜSSEN einen default Konstruktor haben ohne Überladung.

10. WPF Dantenbindung zwischen Controls Eigenschaften

Na ja, ob hier der Titel passt?! Schauen wir mal.

Ich komme immer mal wieder an die Situation das ich Controls einschalten oder ausschalten soll, und das anhand eines anderen Controls. Z.B. Wenn RadioButton IsChecked=true ist, dann bist du eingeblendet. Das geht mit WPF auch erstaunlich einfach.

IsEnabled="{Binding ElementName=optMamUnten, Path=IsChecked}"

Binding ElementName gibt an welches Control man nutzen will. Mit Path wird dann noch gesagt auf welches Property man achten will. Sobald das RadioButton mit dem Namen optMamUnten IsChecked=true ist wird das Control eingeschaltet. So einfach kann es sein.

Gibt dann einen ganz schönen und einfach umzusetzenden Effekt.

Checked 1

Checked 2

kick it on dotnet-kicks.de

Apr 282009
 

Wenn man mit WCF arbeitet kann man einen Service auf zwei arten konsumieren. Jedenfalls sind mir nur zwei bekannt. 🙂

  1. Man kann den WCF Service als “Service References” einbinden. Danach hat man zugriff auf alle Klassen die der WCF veröffentlicht. Wenn ich mich nicht irre kann man dann den Verbindungstyp nicht mehr gross ändern. Vor allem wenn mal alles kompiliert ist.
  2. Man kann den WCF Service mit der ChannelFactory erstellen lassen. Dann braucht man die “Service References” nicht mehr. Die ganze Konfiguration ist dann in der app.config Datei. Es ist dann möglich die ganze Konfiguration zur Laufzweit, ohne neu zu kompilieren, zu ändern.

Wir haben in einem Projekt die Lösung zwei gewählt. Das Entitiy Framework Model, der WCF und der WCF Host, als Windows Service, habe ich erstellt. Zum testen habe ich mir auch ein kleines Tool gemacht das mir einfach ein paar Methoden aufruft.

— Nein, Unit Tests haben wir nicht !! —

Den Proxy für den Zugriff habe ich wie folgt erstellt.

private IService m_Proxy;

public Form1()
{
	InitializeComponent();
	m_Proxy = new ChannelFactory<IService>("Nagg_Connection").CreateChannel();
}
...

Der Zugriff auf die Methoden passiert jetzt so. Ein Beispiel.

kontakt = m_Proxy.SaveKontakt(kontakt);

Bei mir funktionierte das immer einwandfrei. Egal wie oft ich eine Methode aufgerufen habe.

Im WPF GUI wird jetzt aber mit wesentlich mehr Objekten gearbeitet. Dort kam jetzt immer mal wieder die Fehlermeldung dass das Timeout für die Antwort vom Service abgelaufen sei. Das konnte ich schlicht nicht nachvollziehen.

Aber irgend wie hatte ich die Vermutung das man die ChannelFactory nicht zu oft aufrufen sollte. Ich habe dann mal in einem Loop geschaut wie oft man eine ChannelFactory erstellen kann ohne auf einen Fehler zu laufen.

Bei mir waren es 9 mal. Dann machte es bum mit der ominösen Fehlermeldung des Timeouts.

Die Lösung im WPF GUI war dann eine Singleton Klasse die mir den Proxy zurückgab. Somit wird der Proxy nur einmal erstellt.

DotNetKicks-DE Image