0

我正在尝试将捏缩放功能添加到数据绑定列表框。最有效的方法是什么?我已将 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>
4

3 回答 3

1

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

如果要实现这一点,则必须以不同的缩放级别重新绘制内容。
但是,您需要克服许多问题:

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

总结:这几乎可以肯定是没有必要的,而且会非常复杂并且很难做好。如果您真的想尝试一下,请尝试发布任何问题的代码。

于 2010-12-20T16:12:54.403 回答
0

我自己用 operationDelta 完成了这个,但它一点也不流畅

在类属性中

 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));
    }
}
于 2014-04-03T16:41:21.837 回答
0

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

为 WP7 创建可滚动文本块。- Alex Yakhnin 的博客

您可以将 TextBlock 包装在 ScrollViewer 中,这可能足以满足您的需求。如果你的文本足够长,随着文本变大,你会碰到各种各样的墙。Alex 的解决方案是一个控件,它将 StackPanel 包装在 ScrollViewer 中,并将 TextBlocks 添加到 StackPanel 的可管理部分。

于 2010-12-20T23:19:29.357 回答