Хорошо, я выяснил, как заставить мою Сетку элементов UI масштабировать, при помощи LayoutTransform и ScaleTransform. То, что я не понимаю, - то, как я могу заставить свое Представление отвечать на CTRL+MouseWheelUp\Down, чтобы сделать это, и как вместить код в шаблон MVVM.
Моя первая идея состояла в том, чтобы сохранить ZoomFactor как свойство и связать с командой для корректировки его.
Я смотрел на что-то как:
<UserControl.InputBindings>
<MouseBinding Command="{Binding ZoomGrid}" Gesture="Control+WheelClick"/>
</UserControl.InputBindings>
но я вижу 2 проблемы:
1) Я не думаю, что существует способ сказать, было ли колесо перемещено вверх или вниз, и при этом я не могу видеть, как определить сколько. Я видел MouseWheelEventArgs. Delta, но понятия не имеют, как получить ее.
2) Привязка к команде на viewmodel не кажется правильным, поскольку это - строго вещь Представления.
Так как масштабированием является строго Представление UI только, я думаю, что фактический код должен войти в код - позади.
Как был бы Вы парни реализовывать это?
p.s., я использую .net\wpf 4.0 с помощью Подпруги для MVVM.
Я бы предложил вам реализовать общую команду масштабирования в вашей VM. Команда может быть параметризована новым уровнем масштабирования, или (возможно, еще проще) вы можете реализовать IncreaseZoomCommand и DecreaseZoomCommand. Затем использовать код представления позади для вызова этих команд после обработки аргументов события Mouse Wheel. Если дельта положительна, увеличьте масштаб, если отрицательна - уменьшите.
Нет ничего плохого в том, чтобы решить эту проблему с помощью нескольких строк кода позади. Основная идея MVVM заключается в том, что вы можете отслеживать и изменять почти полное состояние вашего представления в объекте, который не зависит от пользовательского интерфейса (повышает тестируемость). Следовательно, расчет нового видового экрана, который является результатом масштабирования, должен выполняться в виртуальной машине, а не в коде позади.
Небольшой пробел в тестируемости, который существует в коде позади, может быть либо проигнорирован, либо покрыт автоматическими UI-тестами. Автоматические тесты пользовательского интерфейса, однако, могут быть очень дорогими.
Вместо этого можно использовать os.remove ()
, поскольку это намного менее опасно, чем то, что вы пытаетесь.
Ответы здесь команды микки-мыши типичны для онлайн-сообщества PHP! Вместо того, чтобы поделиться ответом, они спрашивают, зачем вам это нужно. Не имейте в виду тот факт, что соломонгабия задает действительный вопрос и это довольно нормальная функция, чтобы иметь в стандартных IDE и более профессиональных языках, таких как Java и Objective-C.
Соломонгаби, это самый простой способ получить то, что вам нужно:
$bt = debug_backtrace();
$end = end($bt);
var_dump($end['class']); //or var_dump($end['file']);
-121--4819956- Я думаю, что то, что вы пытаетесь сделать, очень связано с видом, так что нет никакого вреда в том, чтобы поместить код в ваш код позади (на мой взгляд, по крайней мере), хотя я уверен, что есть элегантные способы справиться с этим, так что это более модель, основанная на видении.
Вы должны иметь возможность зарегистрироваться в событии OnPreviewMouseWheel, проверить, нажата ли клавиша управления, и соответственно изменить коэффициент масштабирования, чтобы получить искомый эффект масштабирования.
Я согласен с обоими ответами и хотел бы только добавить, что использование кода позади - единственный способ в данном случае, так что вам даже не нужно думать о том, нарушает ли он какие-либо хорошие практики или нет.
На самом деле, единственный способ получить MouseEventArgs (и, следовательно, Delta) находится в коде позади, поэтому возьмите там то, что вам нужно (для этого не требуется никакой логики) и передайте это своей модели представления как olli предложенный.
С другой стороны, вы можете захотеть использовать более общую дельту (например, разделить ее на 120, прежде чем передавать ее в качестве шага в модель представления), чтобы она не знала каких-либо соглашений, связанных с представлением или ОС. . Это позволит максимально повторно использовать ваш код в модели представления.