Я хочу создать простую программу просмотра изображений в WPF, которая позволит пользователю:
- Панорамирование (перетаскивание изображения мышью).
- Масштаб (с ползунком).
- Показать наложения (например, выделение прямоугольником).
- Показать исходное изображение (при необходимости с полосами прокрутки).
Вы можете объяснить, как это сделать?
Я не нашел хорошего образца в сети. Стоит ли использовать ViewBox? Или ImageBrush? Нужен ли мне ScrollViewer?
Ответы:
Способ, которым я решил эту проблему, заключался в том, чтобы поместить изображение в границу с его свойством ClipToBounds, установленным на True. RenderTransformOrigin на изображении затем устанавливается на 0,5,0,5, поэтому изображение начнет увеличиваться в центре изображения. RenderTransform также устанавливается в TransformGroup, содержащую ScaleTransform и TranslateTransform.
Затем я обработал событие MouseWheel на изображении, чтобы реализовать масштабирование.
Чтобы обработать панорамирование, первое, что я сделал, - обработал событие MouseLeftButtonDown на изображении, чтобы захватить мышь и записать ее местоположение, я также сохраняю текущее значение TranslateTransform, это то, что обновлено для реализации панорамирования.
Затем я обработал событие MouseMove, чтобы обновить TranslateTransform.
Наконец, не забудьте отпустить кнопку мыши.
Что касается маркеров выбора для изменения размера, это можно сделать с помощью средства украшения, ознакомьтесь с этой статьей для получения дополнительной информации.
источник
После использования образцов из этого вопроса я сделал полную версию приложения панорамирования и масштабирования с правильным масштабированием относительно указателя мыши. Весь код панорамирования и масштабирования перенесен в отдельный класс под названием ZoomBorder.
ZoomBorder.cs
MainWindow.xaml
MainWindow.xaml.cs
источник
double zoomCorrected = zoom*st.ScaleX; st.ScaleX += zoomCorrected; st.ScaleY += zoomCorrected;
Ответ был опубликован выше, но не был полным. вот завершенная версия:
XAML
Код позади
У меня есть пример полного проекта wpf с использованием этого кода на моем веб-сайте: Запишите приложение для заметок .
источник
Попробуйте этот элемент управления масштабированием: http://wpfextensions.codeplex.com
использование элемента управления очень простое, ссылка на сборку wpfextensions, чем:
Полосы прокрутки в данный момент не поддерживаются. (Это будет в следующем выпуске, который будет доступен через одну или две недели).
источник
источник
@Anothen и @ Number8 - класс Vector недоступен в Silverlight, поэтому, чтобы он работал, нам просто нужно сохранить запись последней позиции, обнаруженной в последний раз, когда было вызвано событие MouseMove, и сравнить две точки, чтобы найти разницу. ; затем настройте преобразование.
XAML:
Код-за:
Также обратите внимание, что вам не нужны TransformGroup или коллекция для реализации панорамирования и масштабирования; вместо этого CompositeTransform сделает трюк с меньшими хлопотами.
Я почти уверен, что это действительно неэффективно с точки зрения использования ресурсов, но, по крайней мере, работает :)
источник
Все, что вам нужно для увеличения относительно положения мыши, это:
источник
@ Merk
Для решения ur с лямбда-выражением вы можете использовать следующий код:
этот код можно использовать как для .Net Frame work 3.0 или 2.0
Надеюсь, это поможет вам :-)
источник
Еще одна версия такого же контроля. Он имеет те же функции, что и другие, но добавляет:
Использование простое:
И код:
источник
if (image.ActualWidth*(st.ScaleX + zoom) < 200 || image.ActualHeight*(st.ScaleY + zoom) < 200) //don't zoom out too small. return;
в image.MouseWheelЭто приведет к увеличению и уменьшению масштаба, а также к панорамированию, но при этом изображение останется в пределах контейнера. Написан как элемент управления, поэтому добавьте стиль в
App.xaml
файл напрямую или черезThemes/Viewport.xaml
.Для удобства чтения я также загрузил это на gist и github.
Я также запаковал это на nuget
./Controls/Viewport.cs:
./Themes/Viewport.xaml:
./App.xaml
Использование:
Любые проблемы, дайте мне крик.
Удачного кодирования :)
источник