Я делаю программу, подобную рисованию, с 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, хотя это не должно иметь значения.
Width
иHeight
элемента управления действительно меняются, но нет никакой очевидной разницы в том, как выглядит элемент управления, т. е. я могу закомментировать последние две строки в приведенном выше коде без какой-либо видимой разницы. - person Aniruddha Varma   schedule 19.09.2015