2015-09-18 2 views
0

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

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

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

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. Тем не менее, я мог видеть на выходе отладки, что значение Height/Width было изменено с значения по умолчанию от 5000 до 6000.13 ~.

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

+0

Вы уверены, что это не работает правильно? Я бы предположил, что если вы измените масштаб рендеринга на какую-то сумму, а затем уменьшите контроль до такой же суммы, вы получите то же, что и на экране. – Damyan

+0

Да значения управления 'Width' и' Height' меняются, но не имеют явной разницы в том, как выглядит элемент управления. Я могу прокомментировать последние две строки в приведенном выше коде без какой-либо видимой разницы. –

ответ

1

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

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

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

+0

Я предполагаю, что это должно сработать, но в итоге я использовал экранный рендер, как вы упомянули в [этом ответе] (http://stackoverflow.com/a/32573648/3431319), и рисовать rendertarget в сеансе рисования. –

Смежные вопросы