Уменьшите размер холста, но сохраните «видимые» пропорции экрана

Я делаю программу, подобную рисованию, с Canvas и несколькими фигурами (линиями, прямоугольниками и т. д., которые пользователь может рисовать) внутри нее. Я хочу, чтобы пользователь мог увеличить и уменьшить масштаб этого Canvas с помощью жестов щипка в значительной степени (в разумных пределах, скажем, в 5 раз меньше/больше по сравнению с размером по умолчанию Width=1000 и Height=1000).

Это довольно легко сделать, используя ScaleTransform из ManipulationDelta элемента управления. Но я хочу, чтобы Canvas был того же размера, что и раньше; это означает, что если Canvas занимает весь экран, а затем пользователь сжимает его внутрь, Canvas и его содержимое должны уменьшаться, но Canvas все равно должно занимать все пространство экрана (поэтому все выглядит меньше, но теперь для пользователя больше места) рисовать фигуры).

Для этого я попытался увеличить Width и Height из Canvas в соответствии с масштабируемой суммой.

private void ccDraw_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        CanvasControl ccSender = (CanvasControl)sender;
        CompositeTransform ctSender = ccSender.RenderTransform as CompositeTransform;

        ctSender.ScaleX *= e.Delta.Scale;
        ctSender.ScaleY *= e.Delta.Scale;

        ccDraw.Width *= 1/e.Delta.Scale; // sizing up inverse of amount scaled down
        ccDraw.Height *= 1/e.Delta.Scale;// same here
    }

Вы могли бы подумать, что этот код поможет; Я компенсирую меньший размер масштаба увеличением пропорций, чтобы конечный результат был таким же, но Canvas не уменьшается, но нет видимого увеличения Width/Height. Однако я мог видеть в выводе отладки, что значение высоты/ширины изменилось со значения по умолчанию 5000 на 6000,13~.

Может ли кто-нибудь сказать мне, что я делаю неправильно? Или, если есть лучший способ сделать это? Обратите внимание, что Canvas на самом деле не встроенный, а CanvasControl из Win2D, хотя это не должно иметь значения.


person Aniruddha Varma    schedule 18.09.2015    source источник
comment
Вы уверены, что это работает неправильно? Я ожидал, что если вы увеличите преобразование рендеринга на некоторую величину, а затем уменьшите масштаб элемента управления на ту же величину, вы получите что-то такого же размера на экране.   -  person Damyan    schedule 18.09.2015
comment
Да, значения Width и Height элемента управления действительно меняются, но нет никакой очевидной разницы в том, как выглядит элемент управления, т. е. я могу закомментировать последние две строки в приведенном выше коде без какой-либо видимой разницы.   -  person Aniruddha Varma    schedule 19.09.2015


Ответы (1)


Я думаю, что изменение преобразований рендеринга не совсем правильный подход для этого.

Вместо этого я бы рекомендовал вам использовать GestureRecognizer для обработки вашего ввода.

Сохраняйте CanvasControl того же размера, но корректируйте то, что вы рисуете, на основе событий GestureRecognizer. Свойство Transform в сеансе рисования может помочь здесь с настройкой масштаба элементов, которые вы рисуете в своем элементе управления.

person Damyan    schedule 22.09.2015
comment
Я думаю, это должно сработать, но в итоге я использовал цель рендеринга вне экрана, как вы упомянули в этом ответе, и нарисовал цель рендеринга на сеансе рисования. - person Aniruddha Varma; 29.09.2015