Dieser Artikel wurde maschinell übersetzt.

Neue Benutzeroberflächentechnologien

Abschließen des E-Book-Readers

Charles Petzold

Charles PetzoldVorher gab es entzündet "und" Winkel "und" iPads "und" Smartphones; Bevor gab, HTML, PDF, XPS, EPUB, MOBI und Plucker; bevor es sogar Computer, die im Besitz von Einzelpersonen gab, gab es Project Gutenberg.Gegründet 1971 von Michael S.Hart (verstorbenen zuletzt im Alter von 64), Project Gutenberg ist einfach die älteste Sammlung von digitalisierten Public-Domain-Bücher.Während ihr Inventar ca. 35.000 Bücher hübschen, scheint im Vergleich zu den 15 Millionen oder so Texte von Google Books angesammelt, bleibt Project Gutenberg eine wertvolle Ressource für den Zugriff auf die Klassiker.

Projekt Gutenberg Bücher sind jetzt verfügbar in mehreren Formaten für Rich-Text, aber seit vielen Jahren war der Schwerpunkt ausschließlich auf nur-Text, die Annahme begründet wird, dass Rich-Text-formats kommen und gehen aber nur-Text ist immer.Vor fünf Monaten, wenn ich eine einfache, aber wesentliche Textdatei, für eine Spalte, die veranschaulichen benötigt, wie zum Schreiben von Paginierung Logik für Windows Phone, wandte ich mich an das Projekt Gutenberg.As ich begann stufenweise Verbesserung dieser Code, das Projekt wurde auf ein eigenes Leben.Das Programm hat jetzt in einen vollwertigen e-Book-Leser für Windows Phone entwickelt, die Sie auf der Project Gutenberg-Bibliothek zugreifen können.Ich nenne sie Phree Book-Reader – ausgesprochen "Kostenloses Buch Reader" und "e-Book-Reader" mit Betonung, jedoch mit "Ph" für "Phone" geschrieben – und steht als kostenloser Download aus dem Markt Windows Phone.Wie üblich, können Sie das Programm von Quellcode aus Herunterladen der MSDN Magazin Website.

Kataloge und Webdienste

Es gibt viele Möglichkeiten, eine große Anwendung zu erstellen.Einige Entwickler, wie ein Top-Down-Ansatz, der mit der Gesamtstruktur und allmählich beginnt eine detailliertere Code implementiert werden.Andere bevorzugen einen Bottom-Up-Prozess, beginnend mit der Low-Level-Routinen, die in eine leistungsfähigere Assemblys kombiniert werden.

Ich Neige dazu, die beiden Ansätzen mit dem primären Ziel immer etwas zu mischen – alles – so schnell wie möglich arbeiten.Sogar ein Skelett Programm, das nur ein klein wenig funktionsfähig ist gibt mir das wesentliche positive Feedback, das mich hält, und nachdem ich das Programm verwende, werden die erforderlichen Erweiterungen deutlich.

Wenn Sie in dieser Spalte für die letzten fünf Monate gelesen haben, wissen Sie, dass meine vorherigen e-Book-Leser auf nur ein Buch oder vor kurzem vier Bücher beschränkt waren.Diese Bücher wurden in die ausführbare Datei der Anwendung als Inhalt gebündelt.Dieser Ansatz erlaubt mir, die Konzentration auf das Leseerlebnis unter Vermeidung des chaotischen Auftrags des Herunterladens Bücher über das Web und das Problem sogar noch schlimmer gemacht, bestehen beim Zulassen von Benutzern zum Suchen von Büchern nach Titel und Autor.Aber ich wusste, ich würde schließlich diese Herausforderungen zu meistern.

Der Project Gutenberg-Website (gutenberg.org) versucht, machen es einfach für Benutzer zu suchen und Herunterladen von Büchern, aber es keinen öffentlichen Webdienst implementiert, so dass andere Anwendungen auf ähnliche Suchen durchführen können.

Jedes Buch gespeichert, die im Projekt Gutenberg wird durch eine ganze Zahl-ID identifiziert.Wenn ein Programm die ID-Nummer für ein bestimmtes Buch kennt, können sie eine XML-Datei auf gutenberg.org/ebooks/N.rdf, herunterladen, wobei n die ID-Nummer ist.Diese Beschreibung Ressourcenformat oder RDF, Datei ist oft etwa 10 KB groß und enthält das Buch Titel, Autor und andere Informationen, zusammen mit Links auf das Buch in verschiedenen Formaten.Diese Datei ist sehr nützlich, wenn Sie wissen, dass die ID-Nummer des gewünschten Buchseiten, aber nicht so groß, sonst.

Project Gutenberg wird auch einen vollständigen Katalog aller Bücher in der Auflistung an der gutenberg.org/feeds/catalog.rdf.zip angezeigt.Ca. 9 MB groß ist und in einen 200 MB-XML-Datei extrahiert.Die Informationen in diesem Katalog sind ähnliche – aber nicht identisch – zu den Informationen in den einzelnen RDF-Dateien.Eine neue Version des Katalogs wird täglich erstellt, das Lager Project Gutenberg neue Bücher hinzugefügt werden.

Zuerst dachte ich mein e-Book-Reader Laden Sie den gesamten Katalog auf das Telefon konnte, und im isolierten Speicher für die Zwecke der Suche zu speichern, aber ich machte mir Sorgen über die Größe.Zum Beispiel das durchschnittliche Wort ist kürzer als fünf Zeichen und Wörter durch Leerzeichen getrennte, eine 50.000-Word-Adressbuch im Nur-Text-Format nur 300 KB Speicherplatz erforderlich.Im Gegensatz dazu nimmt der entpackte Katalog gleich viel Speicherplatz wie mehr als 6.000 Bücher!

Ich dann ein anderes Problem festgestellt: Ich könnte zu öffnen und lesen Sie die Katalogdatei mit den regelmäßigen.NET-Version von "XmlReader" durch die ProhibitDtd-Eigenschaft der XmlReaderSettings auf False festlegen.Allerdings die Silverlight-Version von "XmlReader", die auf die Datei und keine Einstellung der DtdProcessing-Eigenschaft des XmlReaderSettings erstickt – oder irgendetwas anderes ich versuchte – gearbeitet.

Nach viel Betrachtung entschied ich mich meine eigene auf meiner Website gehosteten Webdienst zu schreiben.Webdienst die Katalogdatei von der Website Project Gutenberg erhält das Dekomprimieren sie, öffnet es, analysiert und speichert Sie eine abgespeckte Version lokal in einem Format "flat" – eine Textzeile pro Buch – für schnellere Suche.

Natürlich haben jedes Mal, wenn Sie mit den Daten einer anderen Person zu tun haben Sie auch mit ihren Daten tun.Mein Webdienst implementiert eine Methode mit dem Namen Search mit Argumenten, die Angabe von Titel und Autor Wörter und bis zu 25 Instanzen eines Typs gibt, ich GutenbergBook genannt.Diese Klasse enthält Informationen über das Buch erhalten aus dem Katalogeintrag, einschließlich eines Titels (und manchmal zwei Titel) Null oder mehr "Ersteller" (Autor und möglicherweise Koautoren), und NULL oder mehr Mitarbeitern (z. B. Translators and Editors).

Ebenfalls in der Gutenberg-Katalog ist eine "freundliche Titel," die wird im Allgemeinen enthält der Titel und Autor und beschränkt sich auf 50 Zeichen.Dieses Titels angezeigten Schienen ideal zum Anzeigen der Suchergebnisse für die Benutzer und für das Buch zu identifizieren, wenn sie gelesen wird.

Diese angezeigten Titel ist jedoch nicht immer so freundlich.Es eignet sich hervorragend für kurze Titeln wie "Emma von Jane Austen" aber häufig für längere Titel mangelhaft ist.Angenommen, der Gutenberg-Katalog enthält 12 Einträge für verschiedene Editionen und Edward Gibbon berühmte historische Werk-Volumes und alle 12 haben denselben angezeigten Titel auf 50 Zeichen abgeschnitten: "Die Geschichte von the ablehnen und Herbst von the Roman E."

Für mich bedeutete dies, dass wenn ich wollten diese angezeigten Titel verwenden, um heruntergeladene Buch zu identifizieren, muss ich würde der Nutzer auf irgendeine Weise zu bearbeiten, einen bedeutungsvollen Ausdruck, z. B. "Ablehnen und die Römer, Volume 3 fallen."

Die Front-End-PivotTable

Der front-End der e-Book-Reader muss zumindest eine Liste der heruntergeladenen Bücher und eine Suchmaske für den Download weitere Bücher anzuzeigen.Es schien mir klar, dass diese beiden Elemente Teil einer Pivot-Steuerelement sein würde – eine beliebte Control für Windows Phone-Programme für mehrere Bildschirme in einem anderen Format als navigierbaren Seiten zu präsentieren.

Das Front-End-Pivot-Steuerelement Phree Book Reader hat fünf Elemente in der folgenden Reihenfolge: Bett, Bibliothek, Suche, Anforderung und Info.

Obwohl Suche das dritte Element in der Pivot, ist es in dem ein neuer Benutzer beginnen soll.Siehe Abbildung 1, Sie geben in Wörter der Autor oder Titel und ein Aufruf an den Webdienst.Bis zu 25 Treffer werden zurückgegeben und in einem Listenfeld angezeigt.Jeden Seitenaufruf wird durch die ID-Nummer und die angezeigten Titel aus dem Katalog Project Gutenberg identifiziert.

The Search Item of the Pivot Control

Abbildung 1 das gesuchte Element des Pivot-Steuerelements

Wenn der Benutzer eines der folgenden Elemente tippt, das Programm navigiert zu einer Download-Seite wie in gezeigt Abbildung 2.Diese Seite zeigt zusätzliche Informationen aus dem Katalog und können Sie das Adressbuch downloaden.Beachten Sie den Contributor-Eintrag, der angibt, des berühmten Übersetzer russischer Literatur Konstanz Garnett.

The Download Page Ready to Download

Abbildung 2 die Download-Seite bereit zum Download

Wenn Sie beginnen, ein Buch herunterladen, werden Sie häufig plötzlich ändern Dateinamen angezeigt.Der Project Gutenberg-Katalog enthält die Dateinamen für die verschiedenen Formate zur Verfügung – einschließlich das bevorzugte Format für meine Zwecke im UTF-8 codierte nur-Text – aber ich entdeckt, dass einige dieser Dateien leer oder beschädigt wurden.Die Dateinamen in die einzelnen RDF-Dateien wurden verschiedene und zuverlässiger ist.Also vor Beginn der Phree-Book-Leser ein Buch herunterladen es lädt die RDF-Datei und ruft einen Dateinamen aus, die.

Nachdem das Buch heruntergeladen wurde, zeigt die Download-Seite Schaltflächen, die Navigieren zu anderen Seiten.Die erste Schaltfläche ermöglicht den Benutzer ändern, was das Programm als der "Display-Titel" bezeichnet Dieser Titel wird auf den angezeigten Titel aus dem Katalog Gutenberg ursprünglich festgelegt und ist auch auf 50 Zeichen begrenzt.

Die zweite Schaltfläche umfasst Kapitel Pausen.Projekt Gutenberg Bücher variieren in der Anzahl der Leerzeilen zum Trennen von Kapiteln verwendet.Mit dieser Option können Benutzer dieses Kriterium zu ändern und Entfernen überflüssiger Kapitel Pausen.

Das Abfrageelement für das Pivot-Steuerelement ist ähnlich wie suchen, mit der Ausnahme, dass Sie einfach in ein Projekt Gutenberg-ID-Nummer für ein Buch als Suche Begriffe eingeben.Das Pivot-Steuerelement navigiert klicken Sie dann auf die Download-Seite.

Wenn ein Buch heruntergeladen wurde, tritt das Buch die Bibliothek ist das zweite Element für das Pivot-Steuerelement und zeigt Abbildung 3.

The Library Item of the Pivot Control

Abbildung 3 das Bibliothekselement des Pivot-Steuerelements

Diese Bibliotheksansicht verwendet die Titel und Autor Informationen aus den Anzeigetitel, anstatt den Katalogeintrag.Bücher sind nach Autor und Titel geordnet.Tippen Sie auf einen der Titel dieses Buch lesen zu beginnen.Tippen Sie auf das Fragezeichen zu finden in die vollständigen Kataloginformationen (ähnlich wie die Download-Seite) und optional den Anzeigetitel und die Umbrüche Kapitel bearbeiten oder löschen das Buch.

Es gab nie Zweifel in meinem Kopf wollte ich die Phree-Book-Reader-Bibliothek alphabetisch nach Autor.Das ist genau wie meine Fiction Regalen zu Hause angeordnet werden außer bin ich nicht ganz so zwingende über Alphabetisches Sortieren die Titel.Ich nehme an, könnte es Benutzern von Phree-Book-Leser, die lieber die Bibliothek wird ein wenig unterschiedlich angeordnet sind, aber ich schrieb dieses Programm vor allem für mich, so dass ich wirklich nicht öffnen, um die Verhandlungen über dieses Problem!

Anzeigen von Büchern nach Autor und Titel ist eine große Anwendung von ListBox-Gruppierung.Die Windows Presentation Foundation (WPF)-Version von ItemsControl verfügt über eine tolle Eigenschaft namens GroupStyle, mit dem Sie einen Stil für eine Gruppierungseigenschaft von Elementen in einer CollectionView definieren kann.In Silverlight verwenden Sie CollectionViewSource, und obwohl es Gruppen unterstützt, muss Silverlight ItemsControl ein GroupStyle.

Stattdessen ich verwendet ItemsControl für die Sammlung von Autoren, wobei Name des Autors, gefolgt von einer nicht rollbaren ListBox für Titel, Autor, zeigt die Vorlage für jedes Element, wie in dargestellt, Abbildung 4.

Abbildung 4 das Bibliothekselement für Pivot

<ScrollViewer Name="libraryScrollViewer"
              VerticalScrollBarVisibility="Auto">
  <ItemsControl Name="libraryItemsControl">
                     
    <!-- Assumes ItemsSource = AppSettings.Library.Authors -->
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <StackPanel>
          <!-- Creator -->
          <TextBlock Text="{Binding}"
                     FontWeight="Bold"
                     Margin="0 6" />
                                     
          <!-- Books -->
          <ListBox ItemsSource="{Binding Titles}"
                   ItemContainerStyle="{StaticResource listBoxItemStyle}"
                   SelectionChanged="OnLibraryListBoxSelectionChanged">
                                     
            <!-- Prevent scrolling of ListBox -->
            <ListBox.Style>
              <Style TargetType="ListBox">
                <Setter Property="ScrollViewer.VerticalScrollBarVisibility"
                        Value="Disabled" />
              </Style>
            </ListBox.Style>
                                     
            <ListBox.ItemTemplate>
              <DataTemplate>
                <Grid>
                  <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                  </Grid.ColumnDefinitions>
 
                  <Grid Grid.Column="0"
                        Margin="12 6"
                        VerticalAlignment="Center">
                    <Polygon Fill="{StaticResource PhoneAccentBrush}"
                             Points="6 0, 47 0, 47 57, 41, 63, 0 63, 0 6" />
                    <Image Source="Images/BookIcon.png" />
                  </Grid>
                                                 
                  <!-- Book title -->
                  <TextBlock Grid.Column="1"
                             Text="{Binding}"
                             FontSize="{StaticResource
                               PhoneFontSizeMediumLarge}"
                             VerticalAlignment="Center"
                             TextWrapping="Wrap" />
                                                  
                  <!-- Info Button -->
                  <Button Content=" ? "
Grid.Column="2"
                          Tag="{Binding ID}"
                          VerticalAlignment="Center"
                          Click="OnInfoButtonClick" />
                </Grid>
              </DataTemplate>
            </ListBox.ItemTemplate>
          </ListBox>
        </StackPanel>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</ScrollViewer>

Eine Alternative zu dieser Regelung zu finden, ist in meiner Vorgangsliste für Phree-Book-Reader. Ich habe das bemerkt, wie ich mehr Bücher in der Bibliothek sammeln, die ersten Ladephase Zeit beginnt zu leiden, und ich vermute, dass geschachtelte ListBox-Steuerelemente der Grund, warum sind.

Menschen bezeichnen sich manchmal zu Büchern, die sie derzeit lesen als "Bücher auf meinem Nachttisch." Aus diesem Grund das erste Pivot-Element hat die Bezeichnung "am" und maximal sechs Büchern, sortiert in absteigender Reihenfolge von Datum und Uhrzeit der letzten Lesevorgang angezeigt. Jedes Buch wird mit dem Anzeigetitel identifiziert.

Ein Windows Phone ist übrigens eine großartige Möglichkeit, lesen Sie im Bett mit dem Licht deaktiviert.

Das letzte Pivot-Element ist mit der Bezeichnung "über" und enthält einige Hilfeinformationen über das Programm sowie Links zu meiner Vergangenheit MSDN Magazin Spalten über den e-Book-Reader.

Um die Pivots Pivotieren

Wie kann ich diese front-End entwickelt wurde, beteiligt Meine größte Kämpfe das Pivot-Steuerelement selbst, und die Navigation vom und an das Pivot-Steuerelement.

Wenn das Programm startet, sollte das Standard-Pivot-Element normalerweise Krankenbett sein. Das Programm sollte es so einfach wie möglich wieder, das am meisten kürzlich gelesene Buch lesen machen. Jedoch, wenn der Benutzer noch keine Bücher lesen noch nicht, wird die Nachttisch Liste sein leer also Bibliotheks-Ansicht bis erste sollte. Und wenn der Benutzer keine Bücher heruntergeladen – vielleicht weil das Programm zum ersten Mal ausgeführt wird – das gesuchte Element sollte der Standardwert.

Programmseitigen Steuerung der Pivot-Steuerelement wird durch Festlegen der SelectedIndex-Eigenschaft des Pivot erreicht. Allerdings kann diese Eigenschaft nicht festgelegt werden, bevor das Pivot-Steuerelement geladen wurde. Nachdem das Pivot-Steuerelement geladen, Festlegen der Eigenschaft hat jedoch die Auswirkung Gleitschiene sichtbar das Pivot-Steuerelement auf das Element des. Ich glaube, ich würde eine weniger sichtbare Überblendung bevorzugen.

Logik, die im Zusammenhang mit das Pivot-Steuerelement komplizierter, wenn ein Buch heruntergeladen wird. Wenn der Benutzer von das gesuchte Element zu der Seite zum Herunterladen navigiert, und klicken Sie dann das Telefon zurück-Taste drückt, ohne das Buch herunterzuladen, sollten Navigation auf das gesuchte Element zurück. Jedoch wenn das Buch heruntergeladen wird, sollten dann die Download-Seite zurück zu das Pivot-Bibliothekselement gehen, in dem das Buch nun aufgeführt. Wenn das Buch wird heruntergeladen, und der Benutzer entscheidet, rechts, um die Leseansicht zu wechseln, sollte die dann zurück zur Homepage navigieren das am Element sichtbar ist, erneut aus, um das Buch lesen Sie zeigen, werden verursachen.

Ich habe mich mit Zustand-Wörterbuch von der PhoneApplicationService zu verfolgen, in denen das Programm wurde und was es tut. Die Suche und die Anforderung, dass Pivot-Elementen festlegen einen Statuseintrag Wörterbuch mit dem Namen "DownloadBook", bevor einen Wörterbucheintrag "SuccessfulDownload" oder "SuccessfulDownloadAndRead", je nachdem, ob Navigieren zu der Seite zum Herunterladen und diese Seite festgelegt wird. hat der Benutzer ausgewählt oder nicht zu der Leseansicht zu springen. Ich bin nicht ganz zufrieden mit den Inelegance dieses Ansatzes und vielleicht in der Zukunft wechsele etwas, das ein wenig besser funktioniert.

Wie üblich als veraltet markieren

Offensichtlich größer ein Programm ruft, die schlimmere Probleme der Markierung als veraltet geworden. Berücksichtigen Sie die Suchmaske angezeigt, Abbildung 1. Ich schrieb den Webdienst zurückzugebenden nur 25 Hits, sondern auch um ein Programm erhalten bei jedem weiteren Aufruf ausgelöst durch die Schaltfläche unten auf dem Bildschirm Weitere 25 ermöglichen. Schließlich könnte es Hunderte, sogar Tausende – der Elemente in der ListBox, je nach den Besonderheiten der Suchkriterien.

Dies ist ein gutes Beispiel für eine knifflige Bereich der Markierung als veraltet. Alle Daten in der ListBox konnte neu generiert werden, indem Sie den Webdienst erneut aufrufen würde, aber das zu viel Zeit. Die Elemente in der ListBox müssen gespeichert werden. Aber was Sie nicht wollen zu tun ist, speichern und Wiederherstellen des Inhalts in die OnNavigatedFrom und OnNavigatedTo überschreibt. Dieses Steuerelement ist Teil einer Pivot-Element auf der Hauptseite des Programms, und es gibt eine Menge von Navigation zu und von dieser Seite, die nicht veraltet. Es ist gut zu speichern und Wiederherstellen von kleine Objekte in die Überschreibungen für die Navigation, aber nicht Tausende von Elementen in einer ListBox. Die Inhalte des Listenfeldes sollten nur gespeichert werden, wenn die Anwendung tatsächlich als veraltet gekennzeichnet ist.

Für dieses Programm experimentierte ich mit einer Mehrzweckverfahren genau dies zu tun – in der App-Klasse, die ich definiert einer Eigenschaft namens TombstoneObjects:

public IDictionary<string, object> TombstoneObjects { set; get; }

Jede Klasse, die an einer beliebigen Stelle im Programm können dieses Wörterbuch verwenden. Die SearchControl-Klasse implementiert die ITombstonable-Schnittstelle, die ich im Artikel des letzten Monats. In der SaveState-Methode (das heißt von der OnNavigationFrom-Überschreibung der Hauptseite), des Steuerelements kopiert den Inhalt des Listenfeld-Steuerelements in ein List-Objekt und speichert, die dem TombstoneObjects Wörterbuch. In der RestoreState-Methode wiederhergestellt es den Inhalt des Listenfeld-Steuerelements, jedoch nur, wenn das Listenfeld leer ist.

Die App-Klasse ist verantwortlich für das Speichern und den Inhalt des TombstoneObjects zum Wörterbuch Zustand des PhoneApplicationService wiederherstellen, da die App-Klasse auf intelligente Weise dazu kann. Er weiß, wann das Programm als veraltet gekennzeichnet, ist, weil diese Handler für das Ereignis PhoneApplicationService installiert hat. Das Ergebnis ist, dass sehr wenig überflüssige Arbeit tritt auf, wenn das Programm nicht tatsächlich als veraltet gekennzeichnet ist.

Obwohl ich Phree Buch Leser für Windows Phone 7 schrieb, die zum Zeitpunkt schreibe dies ich, dass ich mit Betaversionen der nächsten Version gearbeitet haben. In Windows Phone 7.5 sind Anwendungen veraltet seltener, so es doppelt wichtig für diese Anwendungen ist auf eine Menge unnötigen veraltet Arbeit zu vermeiden.

Apropos der nächsten Version von Windows Phone, habe ich bereits eine Liste der Features gesammelt möchte ich Phree Book-Reader hinzu, wenn ich das Upgrade unterwerfen. Vielleicht werden wir das Programm in einem zukünftigen Neubetrachtung sein.

Charles Petzold ist ein langjähriger redaktionelle Beiträge für MSDN Magazin. Sein neues Buch "Programming Windows Phone 7" (Microsoft Press, 2010), steht als kostenloser Download unter bit.ly/cpebookpdf.

Dank der folgenden technischen Experten für die Überprüfung dieses Artikels: Richard Bailey