Части изображения отсутствуют при использовании 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. Вот его комментарий, но вы также можете прочитать его ответ в своем блоге:

Ваш телефон может превратиться в робота - LayoutTransformer отлично работает на платформе Windows Phone

Спасибо за отличную демонстрацию! Эта проблема возникает из-за ограничения 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:

Ограничения размера BitmapImage в Silverlight

Другие вопросы по тегам