Pinch для увеличения ListBox на Windows Phone 7 - PullRequest
0 голосов
/ 20 декабря 2010

Я пытаюсь добавить функцию масштабирования для масштабирования в 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 ]

1 голос
/ 20 декабря 2010

Список не предназначен для увеличения (с помощью сжатия или любым другим способом).

Если вы хотите реализовать это, вы должны перерисовать содержимое с разными уровнями масштабирования.
Однако вам придется преодолеть ряд проблем:

  • Как вы информируете пользователя, что он может изменить размер текста таким образом?
  • Как избежать влияния на стандартное поведение при прокрутке и выборе элементов в списке.
  • Как должна вести себя прокрутка в отношении переноса и отображаемого в данный момент текста?
  • Список не должен использоваться для отображения большого количества текста на телефоне. Если вам нужно отобразить большой объем текста, добавьте короткий «заголовок» в список, а затем отобразите детали на другой странице. Таким образом, текст в списке всегда может отображаться достаточно большим, чтобы его никогда не нужно было менять, и он всегда должен быть читаемым.
  • Это настоящая проблема, которую вы пытаетесь преодолеть, или просто то, что, по вашему мнению, было бы неплохо иметь? Телефон не будет использоваться только для вашего приложения, так зачем вам это нужно, если пользователю все равно придется использовать списки с фиксированным размером текста в ОС и других приложениях.
  • У вас могут возникнуть проблемы с производительностью, поскольку инфраструктура перерисовывает все в списке при изменении размера текста. Вы можете посмотреть на использование отложенной загрузки, чтобы перерисовать только то, что отображается на экране во время масштабирования, но это повлияет на то, как вы определите верхнюю (и нижнюю) часть того, что отображается при изменении размеров.

Резюме: Это почти наверняка не нужно, и будет очень сложным и трудным для выполнения хорошо. Если вы действительно хотите попробовать это, попробуйте, а затем отправьте код с любыми проблемами.

0 голосов
/ 03 апреля 2014

Я сделал это сам с манипуляцией Delta, но это не совсем гладко

В атрибутах класса

 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));
    }
}
0 голосов
/ 21 декабря 2010

Алекс Яхнин предлагает решение для прокрутки длинного текста.

Создание прокручиваемого текстового блока для WP7. - Блог Алекса Яхнина

Вы можете обернуть TextBlock в ScrollViewer, который может быть достаточным для ваших нужд. Если ваш текст достаточно длинный, вы поразите различные стены, так как размер текста увеличивается. Решение Алекса - это элемент управления, который оборачивает StackPanel в ScrollViewer и добавляет TextBlocks к StackPanel в управляемых разделах.

...