У меня есть ScrollViewer
с Image
в нем. Я прикрепил слушателя к событию MouseWheel
, чтобы можно было увеличивать / уменьшать изображение. Код выглядит так:
private void ImageMouseWheel(object sender, MouseWheelEventArgs e)
{
Matrix matrix = image.LayoutTransform.Value;
if (e.Delta > 0)
matrix.ScaleAt(1.5, 1.5, e.GetPosition(image).X, e.GetPosition(image).Y);
else
matrix.ScaleAt(1.0 / 1.5, 1.0 / 1.5, e.GetPosition(image).X, e.GetPosition(image).Y);
image.LayoutTransform = new MatrixTransform(matrix);
}
Это в значительной степени работает, но имеет странную причуду - когда изображение настолько уменьшено, что визуально находится в состоянии «соответствует родительскому элементу», я не могу уменьшить его больше (визуально), но матрица все еще масштабируется.
Это плохо в том смысле, что любое вычисление после этой точки является неправильным, а также имеет странный эффект в пользовательском интерфейсе, скажем, пользователь начинает с «примирения с родителем» zoom:
- уменьшить -> визуально без изменений, внутренняя матрица уменьшена
- увеличение -> неожиданность, визуально без изменений, внутренняя матрица увеличена до
- увеличение -> визуальное увеличение, матрица также изменяется (ОК)
Из-за этих проблем я хотел бы либо продолжать уменьшать изображение визуально, чтобы синхронизировать обе вещи (внутреннюю и визуальную).
Как этого добиться?
Xaml:
<DockPanel>
<ScrollViewer Name="imageScrollViewer" Grid.Column="1" MouseWheel="ImageMouseWheel"
CanContentScroll="true" HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<Image MouseWheel="ImageMouseWheel" Name="image" Source="{Binding Path=Bitmap}"
MouseMove="Image_MouseMove"></Image>
</ScrollViewer>
</DockPanel>
Обновление: Первоначально я спрашивал, как продолжить визуальное масштабирование или внутреннюю остановку, но я обнаружил, что последний шаг уменьшения масштаба, когда изображение достигает состояния «соответствует родительскому элементу», уже не синхронизирован внутренне. визуально. Например, положение мыши не правильно декодируется над таким изображением при перемещении мыши. Только когда я немного увеличил изображение, позиции верны. Таким образом, я вижу только правильное масштабирование.