MouseBinding mousewheel для увеличивания WPF и MVVM

Хорошо, я выяснил, как заставить мою Сетку элементов 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.

8
задан Zamboni 15 January 2011 в 16:20
поделиться

3 ответа

Я бы предложил вам реализовать общую команду масштабирования в вашей VM. Команда может быть параметризована новым уровнем масштабирования, или (возможно, еще проще) вы можете реализовать IncreaseZoomCommand и DecreaseZoomCommand. Затем использовать код представления позади для вызова этих команд после обработки аргументов события Mouse Wheel. Если дельта положительна, увеличьте масштаб, если отрицательна - уменьшите.

Нет ничего плохого в том, чтобы решить эту проблему с помощью нескольких строк кода позади. Основная идея MVVM заключается в том, что вы можете отслеживать и изменять почти полное состояние вашего представления в объекте, который не зависит от пользовательского интерфейса (повышает тестируемость). Следовательно, расчет нового видового экрана, который является результатом масштабирования, должен выполняться в виртуальной машине, а не в коде позади.

Небольшой пробел в тестируемости, который существует в коде позади, может быть либо проигнорирован, либо покрыт автоматическими UI-тестами. Автоматические тесты пользовательского интерфейса, однако, могут быть очень дорогими.

4
ответ дан 5 December 2019 в 11:24
поделиться

Вместо этого можно использовать os.remove () , поскольку это намного менее опасно, чем то, что вы пытаетесь.

-121--2488488-

Ответы здесь команды микки-мыши типичны для онлайн-сообщества PHP! Вместо того, чтобы поделиться ответом, они спрашивают, зачем вам это нужно. Не имейте в виду тот факт, что соломонгабия задает действительный вопрос и это довольно нормальная функция, чтобы иметь в стандартных IDE и более профессиональных языках, таких как Java и Objective-C.

Соломонгаби, это самый простой способ получить то, что вам нужно:

$bt = debug_backtrace();
$end = end($bt);
var_dump($end['class']); //or var_dump($end['file']);
-121--4819956-

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

Вы должны иметь возможность зарегистрироваться в событии OnPreviewMouseWheel, проверить, нажата ли клавиша управления, и соответственно изменить коэффициент масштабирования, чтобы получить искомый эффект масштабирования.

0
ответ дан 5 December 2019 в 11:24
поделиться

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

На самом деле, единственный способ получить MouseEventArgs (и, следовательно, Delta) находится в коде позади, поэтому возьмите там то, что вам нужно (для этого не требуется никакой логики) и передайте это своей модели представления как olli предложенный.

С другой стороны, вы можете захотеть использовать более общую дельту (например, разделить ее на 120, прежде чем передавать ее в качестве шага в модель представления), чтобы она не знала каких-либо соглашений, связанных с представлением или ОС. . Это позволит максимально повторно использовать ваш код в модели представления.

0
ответ дан 5 December 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: