【发布时间】: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