Konventionen für WPF-Anwendungen, die sowohl auf dem Desktop als auch auf der Oberfläche (PixelSense) 1.0 ausgeführt werden

8

Bearbeiten: Um Verwechslungen zu vermeiden: Es handelt sich um die Tabelle, die früher oder noch immer Microsoft Surface 1.0 genannt wurde. Es geht nicht um die Tabelle, die früher Microsoft Surface 2.0 genannt wurde, und es geht nicht um den Tablet-Computer, der jetzt Microsoft Surface heißt. Bearbeitungsende

Ich schreibe eine WPF-Anwendung, die sowohl auf Desktop-Systemen als auch auf MS Surface / PixelSense 1.0 laufen sollte. Ich suche nach Konventionen, wie dies normalerweise geschieht.

Ich bin mir bewusst, dass es einige Unterschiede zwischen den Plattformen gibt, weshalb die grundlegenden GUI-Skelette für den Desktop und die PixelSense-Version unterschiedlich sind (in diesem Fall ein Canvas in der Desktop-Version und ein ScatterView in der PixelSense-Version als root-GUI-Element).

Allerdings gibt es viele WPF-basierte Benutzersteuerelemente / GUI-Fragmente in der Desktop-Version, die in der PixelSense-Version mehr oder weniger genauso aussehen sollten.

Leider scheinen Standard-WPF-Steuerelemente in PixelSense nicht zu funktionieren. Steuerelemente wie CheckBox müssen durch SurfaceCheckBox ersetzt werden, um auf Benutzereingaben zu reagieren, was leicht verifiziert werden kann mit diesem kleinen Codebeispiel bei PixelSense:

%Vor%

Offensichtlich bedeutet dies, dass die WPF-Benutzersteuerelemente in PixelSense nicht ohne Änderungen angezeigt werden können, wie dies durch Anweisungen in Ressourcen wie Microsoft-Dokumentation auf der PixelSense-Präsentationsebene , die SO-Fragen stellt wie diese zu einer WPF-Baumansicht beziehen sich auch auf diesen Blogeintrag auf die PixelSense-WPF-Ebene oder diese SO-Frage zum erneuten Schreiben einer WPF-Desktopanwendung für PixelSense . Die letzte Seite ruft sogar die erforderlichen Änderungen minimal auf, aber sie sind immer noch Änderungen.

Außerdem, Reaktionen auf SO Frage darüber, wie man ein bestimmtes verwendet Die WPF-Desktopsteuerung in PixelSense impliziert, dass die Verwendung von .NET 4.0 die Dinge vereinfachen könnte, aber ich glaube nicht, dass .NET 4.0 vom PixelSense-SDK 1.0 unterstützt wird (es ist .NET 3.5-basiert) soweit ich das beurteilen kann.

Als Softwareingenieur kann ich immer noch nicht der Strategie zustimmen, dieselben GUI-Fragmente (die im Grunde aus denselben Steuerelementen im selben Layout mit dem gleichen Verhalten gegenüber dem Datenmodell bestehen) mit derselben Programmiersprache zweimal zu schreiben. Das scheint einfach falsch zu sein.

Also, drei mögliche Lösungen, die ich bisher gefunden habe:

  • Schreiben Sie die GUI-Fragmente für Standard-WPF. Kopieren Sie dann die Bibliotheken, die diese GUI-Fragmente enthalten, mithilfe von Skripten und transformieren Sie alle relevanten Xaml-Dateien (z. B. mit XSLT) so, dass sie die Standard-WPF-Steuerelemente durch ihre Surface* -Partner ersetzen.
    Nachteile:
    • Erhöhte Wartung erforderlich, damit Skripts immer dann funktionieren und ausgeführt werden, wenn sich etwas in den WPF-Projekten geändert hat.
    • Außerdem kann es kompliziert sein, zu definieren, welche Xaml-Dateien berücksichtigt werden sollen und welche Steuerelemente durch was ersetzt werden sollen (zusätzliche PixelSense-Steuerelemente von Drittanbietern)
    • Schließlich wäre das generierte PixelSense-Projekt eine exakte Kopie des WPF-Projekts, abgesehen von den Xaml-Dateien, sodass kein PixelSense-spezifischer Code eingeführt werden könnte (oder wenn dies möglich wäre, würde dies die Skripts zum Generieren des PixelSense-Objekts machen) Projekte noch komplexer).
  • Richten Sie nur PixelSense / Surface aus, und Desktopbenutzer müssen das Surface SDK installieren. Danke an den Benutzer Clemens für den Vorschlag!
    Nachteile:
    • Benutzer müssen das Surface 1.0 SDK installieren, was - auf aktuellen Systemen - ein nicht-trivialer Vorgang ist: Damit das Surface 1.0 SDK unter Windows ausgeführt werden kann 7 64 Bit Maschine, verschiedene Aktionen wie das Patchen von MSI-Dateien müssen ausgeführt werden.
    • Der PixelSense / Surface 1.0-Simulator ist die einzige Möglichkeit, Surface 1.0-Anwendungen auf einem Desktop-Computer auszuführen. Dieser Simulator ist nicht sehr gut benutzbar und auf manchen Systemen geradezu fehlerhaft: Auf meinem Computer sieht das so aus: (Die Ausgabe deckt ab nur einige 3/4 des Simulatorfensters, aber der Eingang wird im gesamten Fenster registriert, dhUm auf die untere rechte Ecke der Oberflächensimulation zu klicken, muss ich in die (scheinbar transparente) untere rechte Ecke des Simulatorfensters klicken.)
  • Verwenden Sie beim Erstellen der grafischen Benutzeroberfläche anstelle der expliziten Verwendung von standardmäßigen WPF- oder PixelSense-Steuerelementklassen eine plattformspezifische Factory, die den entsprechenden Steuerelementtyp erstellt.
    Nachteile:
    • Die GUI-Fragmente können nicht mehr mit Xaml geschrieben werden; zumindest die meisten Steuerelemente und alle ihre Bindungen müssen in C # -Code erstellt werden.

Ich stehe derzeit auf die dritte Option, da es einfach ein akzeptabler Preis für die Plattformunabhängigkeit zu sein scheint. Ich denke jedoch, dass WPF das verbindende Element zwischen den Desktop- und PixelSense-GUIs sein sollte und dass dies ein häufiges Problem sein sollte, und ich frage mich, ob dies bisher nicht gelöst wurde. Also frage ich hier: Wie wird das normalerweise gemacht?

P.S .: Orientierung ist kein Problem. Die oben genannten GUI-Fragmente werden in drehbaren ScatterViewItems auf PixelSense und in ihrer normalen vertikalen Ausrichtung auf Desktops angezeigt.

    
O. R. Mapper 29.06.2012, 07:40
quelle

1 Antwort

7

Beginnen wir damit, den Wayback-Rechner in die Zeit zu springen, als Surface 1.0 gebaut wurde ...

Es ist das Jahr 2006. Es gibt kein Konzept von Multitouch im Windows-Betriebssystem (oder sogar in normalen Mobiltelefonen!). Es gibt keine APIs, die es einer Anwendung ermöglichen, auf Benutzer zu reagieren, die gleichzeitig mit mehreren Steuerelementen interagieren. Die Input Routing-, Capturing- und Focusing-Mechanismen, die in bestehende UI-Frameworks integriert sind, verbieten grundsätzlich, dass Multitouch auf nicht-beschlagnahmte Weise funktioniert. Selbst wenn diese Probleme auf magische Weise verschwanden, stürzten die meisten Apps immer noch ab, wenn der Benutzer etwas machte, für das er nicht vorgesehen war (wie zum Beispiel 'Speichern' und 'Beenden') und die Benutzer wären ziemlich schlecht gelaunt, weil das Aussehen & Amp; ; Das Gefühl der vorhandenen Apps / Steuerelemente ist für winzige Mauscursor anstelle von großen schlampigen Fingern optimiert.

Also, 2006 habe ich das Surface-Team damit beauftragt, eine Abstraktionsschicht auf WPF zu erstellen, um all diese Probleme zu lösen ... das Ergebnis ist das 1.0 SDK, nach dem Sie fragen. Wir haben versucht, das von Ihnen erwähnte Software-Engineering-Problem zu minimieren, indem Sie die vorhandenen UI-Steuerelemente abzweigen, anstatt eine völlig neue Hierarchie zu erstellen (diese Entscheidung erschwert die Entwicklung des SDK viel ), während Sie instanziate different verwenden müssen Klassen auf jeder Plattform, aber danach funktionieren die in den ursprünglichen Versionen der Steuerelemente verwendeten Ereignisse und Eigenschaften wie erwartet für die Surface-Versionen.

Schneller Vorlauf nach 2009 ... Multitouch fängt an Dampf zu bekommen. Windows 7 fügt native Unterstützung für Multitouch hinzu, behandelt jedoch die UI-Framework-Probleme nicht wirklich.

Fast forward to 2010 ... die WPF- und Surface-Teams arbeiten zusammen, um viele der von Surface für die aufgelisteten Probleme entwickelten Lösungen zu übernehmen, sie an den nativen Touch-Stack von Win7 anzupassen und als Teil von Win7 zu versenden WPF 4.0 ... das bietet Multi-Touch-Input-Routing, Events, Captures und Fokus, aber Touch-Funktionen konnten nicht einfach zu den integrierten WPF-Controls hinzugefügt werden, ohne dass Tonnen existierender Apps zerstört wurden. Daher hat das Surface-Team das "Surface Toolkit for Windows Touch" veröffentlicht, das WPF 4.0-kompatible Versionen der meisten Surface 1.0 UI-Steuerelemente bereitstellt. Aber Surface 1.0 von 2006 war nicht kompatibel mit dieser neuen Version von WPF. Obwohl Sie endlich ultimative Touch-Erlebnisse für Windows und Surface erstellen konnten, konnten Sie immer noch nicht 100% Ihres Codes teilen.

Schneller Vorlauf zu 2011 ... Surface 2.0 (mit PixelSense-Technologie) wird veröffentlicht. Es verwendet die neuen WPF 4.0-Features (so viele der APIs, die mit dem Surface 1-SDK geliefert wurden, werden nicht mehr benötigt) und enthält eine aktualisierte Version des Surface Toolkits für Windows, obwohl das Steuerelement neu gestaltet wurde Metro. Schließlich haben sich Produkt-Timelines synchronisiert, und Sie können eine einzige Codebasis verwenden, um für beide Plattformen großartige Touch-Erlebnisse zu erstellen.

Ok, jetzt zurück zu deiner heutigen Frage ... du fragst nach Surface 1.0, also hilft dir die 2011er Größe nicht wirklich. Sie können jedoch das 2010-Zeug nutzen:

  1. Erstellen Sie Ihre App mit den WPF 4-APIs und dem Surface Toolkit für Windows Touch
  2. Schreiben Sie Code, der Surface-Eingabeereignisse und leitet es durch den Eingabestapel von WPF 4 (die Möglichkeit, dies zu tun, ist dies nicht) sehr bekannt, aber es wurde speziell für diese Art von erstellt Szenario).

Also, wie machst du diese Dinge? Gute Frage. Glücklicherweise hat mein Kumpel Joshua Blake einen Blogbeitrag zusammen mit etwas wiederverwendbarem Code, um Sie durch den Blog zu führen. Werfen Sie einen Blick auf Ссылка .

    
Robert Levy 29.06.2012, 13:29
quelle