【问题标题】:How to continue scaling the image visually?如何在视觉上继续缩放图像?
【发布时间】:2019-03-06 13:43:57
【问题描述】:

我有一个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);
}

它几乎可以工作,但它有一个奇怪的怪癖——当图像被缩小到视觉上处于“适合父级”状态时,我无法再缩小(视觉上),但矩阵仍然被缩放。

从某种意义上说,这之后的任何计算都是错误的,而且它在 UI 中也有奇怪的效果,比如用户从“适合父级”缩放开始:

  • 缩小 --> 视觉上没有变化,内部矩阵被缩小了
  • 放大 --> 惊喜,视觉上没有变化,内部矩阵被放大了
  • 放大 --> 视觉放大,矩阵也改变了(OK)

由于这些问题,我想继续在视觉上缩小,以保持两者(内部和视觉)同步。

如何做到这一点?

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>

更新:最初我询问如何在视觉上继续缩放或在内部停止,但我发现缩小的最后一步,当图像达到“适合父级”状态时,内部已经不同步-视觉上。例如,当鼠标四处移动时,鼠标的位置在此类图像上方未正确解码。只有当我放大一点时,位置才是正确的。所以我看到的唯一方法是在视觉上正确地缩放它。

【问题讨论】:

  • 能否将 xaml 代码添加到问题中?
  • @Ackdari,确定,添加。

标签: c# wpf image scrollviewer


【解决方案1】:

嗯,我很想删除这个尴尬的问题,但另一方面,也许将来有人会遇到同样的问题。

问题是图像被缩小,但后来停靠面板将其放大。图像不知道它,所以数学误入歧途。解决方案是添加一些不会对其自身进行额外缩放的容器,例如堆栈面板。

因此解决方案在于 xaml:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多