Части изображения отсутствуют при использовании ScaleTransform с LayoutTransformer и Scrollviewer на Windows Phone 7
Я пытаюсь получить масштабированное изображение в ScrollViewer в моем приложении Windows Phone 7. На странице приложения я определяю элементы управления следующим образом:
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Name="ImageScroller" HorizontalAlignment="Center" VerticalAlignment="Center">
<layout:LayoutTransformer x:Name="LayoutTransformer">
<layout:LayoutTransformer.LayoutTransform>
<ScaleTransform x:Name="ImageScale"/>
</layout:LayoutTransformer.LayoutTransform>
<Image x:Name="Image" Margin="4" Source="{Binding ImageSource}" />
</layout:LayoutTransformer>
</ScrollViewer>
Класс LayoutTransformer происходит из проекта расширения Silverlight.
У меня есть методы для обработки событий ZoomIn и ZoomOut, и я делаю там следующее:
private void ApplicationBarIconButton_Click_1(object sender, EventArgs e)
{
// Zoom In
ImageScale.ScaleX = ImageScale.ScaleY = ImageScale.ScaleX + 0.5;
LayoutTransformer.ApplyLayoutTransform();
ImageScroller.InvalidateMeasure();
}
Однако, когда у меня есть Zoom-In и изображение изменено, элемент управления ScrollView имеет пустую область внизу и справа от изображения. Почти как если бы Изображение было масштабировано, но обрезано по размеру исходного изображения до преобразования масштаба.
Есть идеи, что я делаю не так?
Я также создал проект, который воспроизводит эту проблему: http://dl.dropbox.com/u/2598447/ZoomTest.WP7.zip
1 ответ
Я наконец получил некоторый ответ и, надеюсь, решение от Дэвида Энсона из Microsoft. Вот его комментарий, но вы также можете прочитать его ответ в своем блоге:
Спасибо за отличную демонстрацию! Эта проблема возникает из-за ограничения Silverlight на Windows Phone 7 - элементы пользовательского интерфейса размером более 2048x2048 при отображении обрезаются до этого размера. Вот ссылка на дополнительную информацию о проблеме:
stackru.com/.../bitmapimage-size-restrictions-in-silverlight
В вашем примере тестовое изображение имеет размер 1201x1401, и я впервые замечаю отсечение после 3-кратного увеличения, что соответствует коэффициенту увеличения 1,9x, что соответствует эффективному размеру изображения 2282x2662, который превышает пределы в обоих направлениях. Выполнение математических вычислений для вычисления суммы, превышающей 2048, дает 234 в горизонтальном направлении и 614 в вертикальном. Теперь запомните эти цифры и прокрутите до правого нижнего угла ScrollViewer на экране телефона с разрешением 480x800. Обратите внимание, что количество горизонтального черного пространства составляет примерно половину ширины экрана (т.е. ~240 пикселей), а вертикальное черное пространство составляет около трех четвертей высоты экрана (то есть 600 пикселей) - потому что эти оценки так близко соответствуют средним значениям, которые мы Я только что вычислил, я уверен, что вы столкнулись с этой проблемой.
К сожалению, это ограничение платформы (которое вы уже подтвердили, успешно выполнив свой сценарий на настольном Silverlight), и поэтому я не могу исправить это непосредственно в LayoutTransformer. К счастью, есть некоторые обходные пути, которые обсуждаются в ветке / ссылке выше.
Извините за беспокойство - надеюсь, это поможет!
Кроме того, в ответе упоминается статья о стековом потоке, описывающая основную причину этой проблемы как ограничение платформы Windows Phone 7: