2010-12-20 12 views
0

ズーム機能をピンチボックスのリストボックスに追加しようとしています。これを行う最も効率的な方法は何ですか? ListBoxをGridコントロールの中に置き、スクロール可能にしました。Windowsでリストボックスをズームするときにピンチをかける7

これは私の現在のコードです。

<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> 

答えて

1

リストボックスは、ピンチングまたは他の方法でズームするようには設計されていません。

これを実装するには、異なるズームレベルでコンテンツを再描画する必要があります。どのようにあなたは彼らがテキストサイズをこのように変更することをユーザーに通知します


  • あなたはしかし、克服すべき多くの問題を持っているだろうか?
  • リストボックスの項目をスクロールして選択する際の標準的な動作にどのように影響を与えないようにしますか。
  • ラッピングと現在表示されているテキストのスクロールはどのように行われるべきですか?
  • 電話で大量のテキストを表示するためにリストを使用しないでください。大量のテキストを表示する必要がある場合は、リストに短い「タイトル」を付け、別のページに詳細を表示します。こうすることで、リスト内のテキストを常に変更する必要がなく、常に読めるように十分大きく表示することができます。
  • これはあなたが克服しようとしている真の問題なのでしょうか、それとも素晴らしいものと思いますか?あなたのアプリだけでは電話が使われないので、OSや他のアプリで固定テキストサイズのリストを使用する必要があるのなら、なぜこの必要がありますか?
  • テキストのサイズを変更すると、フレームワークがリストのすべてを再描画するため、パフォーマンスに問題が発生する可能性があります。あなたはズームを使用している間、画面に表示されているものを再描画するだけで、遅延ローディングの使用を見ることができます。しかし、これは、サイズが変わるときに表示されるものの上端(および下端)を決める方法に影響します。

要約:これはほとんど間違いなく、非常に複雑で、うまくいくのは難しいでしょう。あなたが本当にこれを試したいと思っている場合は、問題があるコードを投稿してください。

+0

お返事ありがとうございます。テキストによる拡大は、ListBox内のコンテンツのフォントサイズを増減することを意味します。だから私はコードサンプルを教えてもらえますか? – Daniel

+0

私はこのリストボックスに聖書の詩を表示していますが、ユーザが選択した章の詩をスクロールできるようにスクロール機能を保持したいと思います。これが概念を明確にしているかどうかは不明です。 – Daniel

+0

@Danielスクロールするだけでリストボックスは必要ありません。 ScrollViewerにテキストをラップするだけです。 –

0

Alex Yakhninは、長いテキストをスクロールするソリューションを提供しています。

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

あなたはあなたのニーズに十分であり得るScrollViewerの中のTextBlockをラップすることができます。テキストの長さが十分な場合は、テキストのサイズが大きくなるにつれて様々な壁に当たるでしょう。 Alexのソリューションは、ScrollViewerにStackPanelをラップし、管理可能なセクションでStackPanelにTextBlockを追加するコントロールです。背後にあるコードで

<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}"/> 

::私はmanipulationDeltaで自分自身をこれをやったが、それはクラスでは全く

をスムーズいない

+0

私は、テキストコントロールのピンチズームソリューションを探しています。そのリストボックスやテキストブロックが問題ではありません。しかし、私は表示するデータの複数の行を持っているので、私はListBoxを使用したい。これが明確になることを願っています。 – Daniel

+0

もちろん、リストボックスを使ってテキストブロックをスクロールできますが、キャッチがあります。リストボックスは、可変高さのリストボックス項目で仮想化を表示しません。私はあなたが表示テキストのためにこのコントロールに設定するあなたに接続されているリストボックスのどの機能が好奇心です。私はまたあなたがピンチしてズームしてあなたのためにやりたいことが何であるか興味があります。 –

+0

私はListBoxを使用してデータベースから複数の行を表示しています。したがって、ユーザーは個々のアイテムと対話できます。 – Daniel

0

は、XAMLで

x:local="clr-namespace:YourApplicationNamespace" 

属性

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); 
     } 
    } 

CustomSettingsクラス

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)); 
    } 
} 
関連する問題