2010-12-20 10 views
0

Ich versuche Pinch zu Zoom-Funktion zu einem Daten gebunden ListBox hinzufügen. Was ist der effizienteste Weg, dies zu tun? Ich habe die ListBox in ein Grid-Steuerelement platziert und es scrollbar gemacht.Prise Zoomen auf ListBox auf Windows Phone 7

Dies ist mein aktueller Code.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="10,0,10,10" Background="Black" > 
     <ListBox Name="lstText" FontSize="24" Foreground="White" SelectionMode="Single" Margin="10,0,10,10" ScrollViewer.VerticalScrollBarVisibility="Visible" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel > 
         <TextBlock Text="{Binding Text}" TextWrapping="Wrap"></TextBlock>       
        </StackPanel>       
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
    <toolkit:GestureService.GestureListener> 
     <toolkit:GestureListener 
      Tap="GestureListener_Tap" 
      PinchCompleted="GestureListener_PinchCompleted" 
      Flick="GestureListener_Flick"> 

     </toolkit:GestureListener> 
    </toolkit:GestureService.GestureListener> 

Antwort

1

Die Listbox kann nicht gezoomt werden (über Pinching oder andere Methoden).

Wenn Sie dies implementieren möchten, müssen Sie den Inhalt auf den verschiedenen Zoomstufen neu zeichnen.
Sie würden eine Reihe von Fragen haben allerdings zu überwinden:

  • Wie beurteilen Sie die Benutzer informieren, dass sie die Textgröße auf diese Weise verändern können?
  • Wie vermeiden Sie das Standardverhalten beim Scrollen und Auswählen von Elementen in der Listbox?
  • Wie soll sich das Scrolling in Bezug auf das Wrapping und den aktuell angezeigten Text verhalten?
  • Eine Liste sollte nicht verwendet werden, um große Textmengen auf einem Telefon anzuzeigen. Wenn Sie eine große Menge an Text anzeigen müssen, haben Sie einen kurzen "Titel" in der Liste und zeigen dann das Detail auf einer anderen Seite an. Auf diese Weise kann der Text in der Liste immer so groß dargestellt werden, dass er niemals geändert werden muss und immer lesbar sein muss.
  • Ist das ein echtes Problem, das Sie zu überwinden versuchen oder einfach etwas, von dem Sie denken, dass es schön wäre, es zu haben? Das Telefon wird nicht nur für Ihre App verwendet. Warum brauchen Sie das, wenn der Benutzer im Betriebssystem und anderen Apps weiterhin Listen mit fester Textgröße verwenden muss?
  • Sie haben möglicherweise Leistungsprobleme mit der Leistung, da das Framework bei der Änderung der Textgröße alles in der Liste neu zeichnet. Sie können den verzögerten Ladevorgang verwenden, um beim Zoomen nur neu zu zeichnen, was auf dem Bildschirm angezeigt wird. Dies wirkt sich jedoch darauf aus, wie Sie den oberen (und unteren) Bereich der angezeigten Größen bestimmen.

Zusammenfassung: Dies ist fast sicher unnötig und wird sehr kompliziert und schwierig sein, gut zu machen. Wenn Sie das wirklich versuchen wollen, dann versuchen Sie es und schreiben Sie den Code mit allen Problemen.

+0

Vielen Dank für Ihre Antwort. Mit Text Zoom meinte ich, es sollte die Schriftgröße des Inhalts innerhalb der ListBox vergrößern und verkleinern. Können Sie mich auf ein Codebeispiel hinweisen? – Daniel

+0

Ich zeige Verse aus der Bibel in dieser Listbox an, aber ich möchte die Scrollfunktion beibehalten, damit Benutzer durch die Verse eines ausgewählten Kapitels blättern können. Nicht sicher, ob dies das Konzept verdeutlicht. – Daniel

+0

@Daniel Sie brauchen keine Listbox, nur um zu scrollen. Wickeln Sie den Text einfach in einen ScrollViewer. –

0

Alex Yakhnin bietet eine Lösung zum Scrollen von Langtexten.

Creating Scrollable TextBlock for WP7. - Alex Yakhnin's Blog

Sie können einen Textblock in einem Scroll wickeln, die für Ihre Bedürfnisse ausreichen. Wenn Ihr Text lang genug ist, werden Sie eine Vielzahl von Wänden treffen, wenn der Text größer wird. Alex 'Lösung ist ein Steuerelement, das ein StackPanel in einem ScrollViewer umschließt und TextBlocks in überschaubaren Abschnitten zum StackPanel hinzufügt.

+0

Ich suche nach einer Prise Zoom-Lösung für die Textsteuerung. egal, ob Listbox oder Textblock. Aber ich möchte ListBox verwenden, da ich mehr als eine Datenzeile anzeigen kann. Ich hoffe, das macht es deutlich. – Daniel

+0

Sicher, Sie können ListBox verwenden, um Textblöcke zu scrollen, jedoch gibt es einen Haken. Listbox führt keine Anzeigevirtualisierung mit Listenboxen mit variabler Höhe durch. Ich bin gespannt, welche Funktion (en) der Listbox, an die Sie angehängt sind, dafür sorgen, dass Sie dieses Steuerelement für den Anzeigetext einstellen. Ich bin auch neugierig, was Sie wollen, Pinch und Zoom für Sie tun. –

+0

Ich verwende ListBox, um mehrere Zeilen aus der Datenbank anzuzeigen. So kann der Benutzer mit jedem einzelnen Gegenstand interagieren. – Daniel

0

ich das selbst mit Manipulation gemacht habe, aber es ist überhaupt nicht

In der Klasse glätten Attribute

x:local="clr-namespace:YourApplicationNamespace" 

Im XAML:

<Grid x:Name="LayoutRoot" ManipulationDelta="LayoutRoot_ManipulationDelta"> 
    <Grid.Resources> 
     <local:CustomSettings x:Key="Settings"/> 
     <DataTemplate x:Key="verseDataTemplate"> 
      <TextBlock FontSize="{Binding Path=Font35, Source={StaticResource Settings}}" 
        Text="{Binding}"/> 
     </DataTemplate> 
    </Grid.Resources> 
    <ListBox ItemTemplate="{StaticResource verseDataTemplate}"/> 

in der Code-behind:

private void LayoutRoot_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
    { 
     try 
     { 
      var fnt = lboVerses.FontSize; 
      if (e.DeltaManipulation.Scale.X == 0 || e.DeltaManipulation.Scale.Y == 0) return; 
      if (e.DeltaManipulation.Scale.X > 1 || e.DeltaManipulation.Scale.Y > 1) 
      { 
       if (fnt < 72) 
        BibliaSettings.font35++; 
      } 
      else if (e.DeltaManipulation.Scale.X < 1 || e.DeltaManipulation.Scale.Y < 1) 
      { 
       if (fnt > 5) 
        BibliaSettings.font35--; 
      } 
     } 
     catch (Exception x) 
     { 
      Debugger.Log(0, "Errors", x.Message + "\n" + x.StackTrace); 
     } 
    } 

Ihre CustomSettings-Klasse

public class CustomSettings : INotifyPropertyChanged 
{ 
    public static List<CustomSettings> Instances; 
    public CustomSettings() 
    { 
     if (Instances == null) Instances = new List<CustomSettings>(); 
     Instances.Add(this); 
    } 
    public static int font35 
    { 
     get 
     { 
      return Get("Font35", 35); //Provide mechanism to get settings 
     } 
     set 
     { 
      Save(value, "Font35");//Provide mechanism to store settings 
      Instances.ForEach(inst => inst.OnPropertyChanged("Font35")); 
     } 
    } 
    public int Font35 
    { 
     get 
     { 
      return font35; 
     } 
     set 
     { 
      font35=value; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
}