捏在Windows Phone 7上的ListBox上放大

时间:2010-12-20 15:34:40

标签: windows-phone-7 listbox zoom scrollviewer pinch

我正在尝试将缩放缩放功能添加到数据绑定ListBox。最有效的方法是什么?我已将ListBox放在Grid控件中并使其可滚动。

这是我目前的代码。

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

3 个答案:

答案 0 :(得分:1)

列表框不是为了缩放而设计的(通过捏合或任何其他方法)。

如果要实现此功能,则必须以不同的缩放级别重新绘制内容 但是你需要克服许多问题:

  • 您如何通知用户他们可以通过这种方式更改文字大小?
  • 如何避免影响滚动和选择列表框中项目的标准行为。
  • 关于包装和当前显示的文本,滚动应该如何表现?
  • 不应使用列表在手机上显示大量文字。如果您需要显示大量文本,请在列表中添加一个简短的“标题”,然后在另一个页面中显示详细信息。这样,列表中的文本总是可以以足够大的方式显示,从而不需要更改,并且应始终可读。
  • 这是一个你想要克服的真正问题,还是你觉得有什么好处?手机不会仅用于您的应用程序,因此如果用户仍需要在操作系统和其他应用程序中使用固定文本大小的列表,为什么还需要此功能。
  • 当您更改文本大小时,框架会重新绘制列表中的所有内容,因此您可能会遇到性能问题。你可以看看使用延迟加载只需要在缩放时重新绘制屏幕上显示的内容,但这会影响你如何确定尺寸变化时显示的顶部(和底部)。

总结:这几乎肯定是不必要的,并且会非常复杂并且难以做好。如果你真的想尝试这个,那就去吧,然后发布任何问题的代码。

答案 1 :(得分:0)

Alex Yakhnin提供了滚动长文本的解决方案。

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

您可以在ScrollViewer中包装TextBlock,这可能足以满足您的需求。如果您的文字足够长,那么当文字变得更大时,您将会遇到各种各样的墙壁。 Alex的解决方案是一个控件,它将StackPanel包装在ScrollViewer中,并将TextBlocks添加到可管理部分的StackPanel中。

答案 2 :(得分:0)

我自己用manipDelta完成了这个,但它根本不顺利

在类属性

 x:local="clr-namespace:YourApplicationNamespace"

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

在后面的代码中:

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