Как продолжить масштабирование изображения визуально? - PullRequest
1 голос
/ 06 марта 2019

У меня есть 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>

Обновление: Первоначально я спрашивал, как продолжить визуальное масштабирование или внутреннюю остановку, но я обнаружил, что последний шаг уменьшения масштаба, когда изображение достигает состояния «соответствует родительскому элементу», уже не синхронизирован внутренне. визуально. Например, положение мыши не правильно декодируется над таким изображением при перемещении мыши. Только когда я немного увеличил изображение, позиции верны. Таким образом, я вижу только правильное масштабирование.

1 Ответ

2 голосов
/ 06 марта 2019

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

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

Таким образом, решение лежит в xaml:

<DockPanel>
  <StackPanel>
    ...
  </StackPanel>
</DockPanel>
...