Prism als Basis von modern strukturierten Applikationen

RK GpxViewer

Auf Prism wurde ich zum ersten Mal bei einem Vortrag bei der .Net Usergroup Regensburg aufmerksam – vor locker 10 Jahren. Zunächst wusste ich gar nicht, um was es sich genau handelt. Nach dem Vortrag und weiterer Recherche hat Prism aber die Art und Weise, wie ich Desktop- und Mobile-Applikationen strukturiert habe, maßgeblich beeinflusst. Ein wichtiger Punkt für mich damals war die Aufteilung einer großen Applikation in mehrere, lose miteinander gekoppelte Module und die dafür bereitgestellten Best Practices. Prism folgt dabei den Grundsätzen des MVVM-Patterns und erweitert dieses um weitere Werkzeuge wie CompositeCommand, dem bereitgestellten EventAggregator oder eben Basisklassen für Module. Zusätzlich wird ein DI-Container integriert. Für die Desktop-Applikation RK GpxViewer [1], welche ich gerade für die Planungen meiner Wander- und Fahrrad-Touren im Sommer baue, verwende ich die aktuelle Version von Prism und möchte hier in diesem Artikel einige Erfahrungen damit teilen.

Weiterlesen …

Worklog SeeingSharp 2: Styling für ModelViewer

ModelViewer

Dieses Wochenende ist für mich der ModelViewer von Seeing# wieder in den Fokus gerückt. Grund war ursprünglich, dass ich mehrere Detailinformationen zum geladenen 3D-Modell anzeigen wollte (z. B. Anzahl Polygone). Da ich dazu ein neues Fenster gemacht habe, habe ich bei der Gelegenheit auch das Styling des ModelViewers etwas überarbeitet. Für mich zunächst leichtes Neuland, da ich sonst eines der großen kommerziellen UI-Frameworks für WPF gewohnt bin. Nach etwas Recherche in der OpenSource-Welt und ein paar kleinen Testprojekten bin ich aber sehr positiv überrascht, wie gut und schnell man hier auch mit OpenSource-Komponenten zum Ziel kommt.

Weiterlesen …

Gemeinsame Icon-Bibliothek in größeren Desktop-Apps

Je umfangreicher Desktop-Apps werden, desto größer wird auch ein Problem, welches zumeist zu Beginn der Entwicklung unterschätzt wird: Wo werden Icons abgelegt, welche von verschiedenen Programmteilen verwendet werden? Viele verschiedene Programmteile und Module (und wie sie auch immer genannt werden…), bei denen jeweils lokal Icons abgelegt werden, können nach einigen Jahren stetiger Entwicklung für Chaos sorgen. Bei meinen Projekten verstärkt sich das Problem zusätzlich aufgrund der Tatsache, dass sich ältere Windows.Forms- und neuere WPF-Komponenten mischen.

Weiterlesen …

WPF Direct3D 11 Interop Performance

Momentan stecke ich wieder etwas mehr Zeit in die Entwicklung mit WPF. Zwar bin ich nach wie vor nicht der größte Fan davon vor allem, was die Performance und die Weiterentwicklung seitens Microsoft angeht, aber WPF ist für den Windows Desktop nun mal Stand der Dinge. Ein für mich sehr kritischer Punkt bei WPF ist die Interaktion mit Direct3D 11 Inhalten von Seeing#. Genau dieses Thema war für mich immer überraschenderweise der schwierigste Teil.

Weiterlesen …

Seeing# in C#-Apps einbinden

Würfel

In den letzten Wochen habe ich mich darauf konzentriert, Möglichkeiten zu schaffen, um Seeing# leichter in C# Apps einbinden zu können – völlig egal ob diese am Desktop oder als Windows Universal App laufen. Ziel ist, dass die Einbindung in allen Fällen möglichst einfach und möglichst ähnlich durchgeführt werden kann. Zu diesem Zweck habe ich die verschiedenen Steuerelemente für WPF und Universal Apps modifiziert, so gibt es jetzt in WPF einen eigenen Xaml-Namespace. Der größere Punkt ist aber eine Einführung eines Komponenten-Systems, mit dem man bereits im Xaml verschiedene Aspekte der 3D-Anzeige zusammenbauen kann. Beispielweise, welche Objekte dargestellt werden sollen und wie die Bedienung der Kamera funktionieren soll.

Weiterlesen …

Direct3D11, WPF und der Energiesparmodus

Direct3D 11 direkt in ein WPF D3DImage zu integrieren ist nicht ganz so einfach – das ist jedem bekannt, der das schon einmal probiert hat. Im Fall meiner 3D-Engine SeeingSharp gehe ich sogar noch etwas weiter: Das Rendering erfolgt komplett verteilt auf dem ThreadPool. Weiterhin werden so Kleinigkeiten wie Kantenglättung unterstützt, die die Integration in WPF auch noch etwas schwieriger machen. Nun habe ich es schon vor einer ganzen Weile geschafft, dass das auf allen getesteten Desktop-Rechnern gut funktioniert – aber irgendwie trifft man immer wieder auf neue Fälle. Neulich habe ich mir das neue Surface Pro 3 gekauft und siehe da… dort gibt es Probleme.

Weiterlesen …

RK2048 – Universal-App fast fertig

RK2048 ist mein erstes „Abenteuer“ eine App mit weitgehend gleichem Coding auf mehreren Plattformen zu entwickeln und zu veröffentlichen. Genau genommen handelt es sich um (fast alle) aktuellen Windows-Plattformen von Windows Phone (8.1) über Windows RT bzw. Windows Store Apps bis Windows Desktop (Wpf). Es ist überraschend, wie gut das mittlerweile zwischen Phone und Tablet funktioniert, einzig WPF ist bei den Standard-Projekttemplates noch etwas außen vor. Im Windows Store ist die erste Version schon veröffentlicht, Windows Phone folgt (hoffentlich) relativ bald. Auch ein Setup für die Desktop-Version ist bereits verfügbar.

Weiterlesen …

Direct3D Adapter- und Output-Informationen per DXGI laden

Eine einfache Aufgabe, die man gerne vergisst, wenn man mit Direct3D arbeitet. Für gewöhnlich arbeitet man mit dem Adapter (=Grafikkarte), welcher als Standard am Rechner eingestellt ist. Dies ist nämlich der Fall, wenn bei allen Initialisierungs-Methoden nicht explizit angegeben wird, welcher Adapter verwendet werden soll bzw. der Standard-Adapter mit Index 0. Aber was ist, wenn mehrere Grafikkarten im Rechner stecken, über die mehrere Monitore (>2) angebunden sind? Was ist, wenn der Software-Renderer (WARP) verwendet werden soll? In diesem Beitrag beschreibe ich ein Beispielprogramm, welches per DXGI (DirectX Graphics Infrastructure) alle verfügbaren Adapter ermittelt und in einer WPF-Oberfläche einige Informationen dazu anzeigt.

Weiterlesen …

Triangulation von WPF-Path Objekten

Zugegeben, der Titel dieses Beitrags hört sich etwas komisch an. Was Besseres ist mir aber leider nicht eingefallen. Im Grunde habe ich mir folgendes in den Kopf gesetzt: Ich möchte in meinem Programm diverse 3D-Objekte wie Pfeile, Böden (nicht nur rein rechteckige) o. Ä. relativ einfach dynamisch erzeugen können. Die Path-Objekte aus WPF bieten mir dafür schon die Grundlage, die ich brauche, nur leider lediglich in 2D. Daher habe ich ein kleines Programm geschrieben, welches aus einen Path per Triangulation-Algorithmus ein Modell aus Dreiecken errechnen kann. Daraus im Anschluss ein wirkliches 3D-Objekt zu machen, ist bekanntlich kein großes Problem mehr.

Weiterlesen …

Bessere PropertyGrids in Wpf durch PropertyTools

Das klassische PropertyGrid kennt wohl jeder Entwickler. Bekannt durch das „Properties“-Fenster in VisualStudio oder einfach als sehr produktives Control in Windows.Forms, um schnell eine Benutzeroberfläche für eigene Objekte erzeugen zu lassen. Daneben gibt es ein ähnliches Control in den meisten Control-Frameworks, welche man dazukaufen kann (z. B. von DevExpress). Neulich bin ich auf ein OpenSource-Projekt auf Codeplex gestoßen, welches in meinen Augen die eine oder andere Sache besser und hübscher macht.

Weiterlesen …