Ошибка WP7 ScrollViewer, когда высота содержимого> 2000px - PullRequest
3 голосов
/ 20 декабря 2011

В моем проекте я использую ScrollViewer для отображения некоторой информации о большой высоте.

Я использую так:

<Grid Grid.Row="1" Height="630">
     <ScrollViewer Background="Red" Grid.Row="1">
         <Grid>
             <Rectangle Height="3000" Fill="LightBlue" Width="440"/>
          </Grid>
     </ScrollViewer>
</Grid>

Но, к сожалению, прямоугольник не отображается полностью, когда scrollViewвертикальная высота бара> 2000.

Я тестировал без Grid как содержимое ScrollViewer, только с Rectangle, результат тот же.

И ошибка также происходит с шириной.

Есть ли у вас какие-либо идеи, что обходной путь?как с этим справиться?

Этот пост - это та же проблема без каких-либо исправлений.

Спасибо заранее!-Джимми


Полный тест xaml:

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <Grid Grid.Row="1" Height="630">
        <ScrollViewer Background="Red" Grid.Row="1">
            <Grid>
                <Rectangle Height="3000" Fill="LightBlue" Width="440"/>
            </Grid>
        </ScrollViewer>
    </Grid>
</Grid>

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

Макс. Размер текстуры на WP7 - 2048х2048. Высота прямоугольника превышает этот предел. Как только вы уменьшите его ниже этого предела, он начнет работать.

Этот код лучше подходит для экспериментов, поскольку вы можете определить нижнюю границу:

<Grid Grid.Row="1" Height="630">
  <ScrollViewer Background="Red" Grid.Row="1">
    <Grid>
      <Border Height="2048" BorderBrush="Blue" BorderThickness="5">
        <Rectangle Height="2000" Fill="LightBlue" Width="440"/>
      </Border>
    </Grid>
  </ScrollViewer>
</Grid>

После увеличения высоты границы нижняя часть исчезнет.

С другой стороны, я должен сказать, что это поведение меня тоже удивляет. Я ожидал бы, что система разлагает большие объекты на более мелкие текстуры, но, очевидно, дизайнеры WP7 решили не делать этого, а обнаружили явную ошибку пользовательского интерфейса.

3 голосов
/ 20 декабря 2011

Если это просто текст, вы можете использовать этот пользовательский элемент управления: прокручиваемый текстовый блок . В противном случае разделите ваш контент на блоки размером <2048. </p>

UPD:

2048px - ограничение для кэшированной графики GPU. Вы можете использовать много элементов управления (<2048) внутри прокрутки (всего> 2048). В некоторых случаях все хорошо, но в некоторых это не

Например:

<ScrollViewer Background="#4FFF6060">
    <Grid Background="#FFFF8A8A" Width="240" HorizontalAlignment="Left" d:LayoutOverrides="Height">
        <Rectangle Fill="Blue" Height="4000" VerticalAlignment="Top" Width="120" HorizontalAlignment="Left"/>
        <Rectangle Fill="Red" Height="2000" VerticalAlignment="Top" Width="120" HorizontalAlignment="Right"/>
        <Rectangle Fill="Red" Height="2000" VerticalAlignment="Top" Width="120" HorizontalAlignment="Right" Margin="0,2000,0,0"/>
    </Grid>
</ScrollViewer>

В этом случае синий прямоугольник обрезается с 2048px, но два прямоугольника с высотой 2000px, размещенные один над другим, выглядят хорошо.

Второй пример использует StackPanel для отображения области 4000px, и он тоже работает

<StackPanel Background="#FFFF8A8A" HorizontalAlignment="Right" Width="240" d:LayoutOverrides="Height">
    <Rectangle Fill="#FF88FF00" Height="2000" Width="240" HorizontalAlignment="Right"/>
    <Rectangle Fill="#FF88FF00" Height="2000" VerticalAlignment="Top" Width="240" HorizontalAlignment="Right"/>
</StackPanel>
...