如何防止WPF裁剪我的图像?

4
我正在编写一个WPF应用程序,该应用程序显示最初位于中心的图像。用户可以使用ScaleTransformTranslateTransform来实现缩放和移动图像。这很好用。
问题是当图像比窗口大得多,用户移动图像或缩小到整个图像应该可见时。原本隐藏的部分不会被渲染,而只会绘制原始可视部分的图像。
根据一些其他问题,如果我将我的图像放在Canvas内,那么整个图像将被渲染,并且移动时将被正确地渲染。问题是我不想让我的图像处于Canvas中,因为这会阻止发生任何其他布局 - HorizontalAlignmentVerticalAlignment属性被忽略(因此图像不再居中),而且我需要实现一个选项,使图像尽可能大地填充整个窗口区域,但不起作用(将Stretch属性设置为UniformToFill不起作用)。
目前,两个变换都设置为RenderTransform属性。如果我改用LayoutTransform,整个图像将被绘制,但这也会阻止用户将图像的任何部分移动到窗口的边缘之外(这是我想要保留的行为)。
如何告诉WPF始终渲染整个图像而不使用CanvasLayoutTransform
1个回答

1
我建议不要使用TranslateTransform,而是依赖于ScrollViewer。
<ScrollViewer>
   <Grid>
      <Image Source="blabla">
          <Image.LayoutTransform>
              <ScaleTransform />
          </Image.LayoutTransform>
      </Image>
   </Grid>
</ScrollViewer>

ScrollViewer可以为图像提供无限的扩展空间,整个图像将被渲染。Grid强制使用居中布局,同时仍允许图像扩展。如果您不喜欢滚动条控制平移,则可以隐藏它们并自己编写解决方案。

LayoutTransform绝对是正确的选择,这样图像的实际像素大小(基于缩放)将正确地反映在您的窗口上。


似乎确实运行得很好。有一件事情不工作(我承认在问题中忘记提到了 - 抱歉!)是我的图像设置了RenderTransformOrigin为0.5,0.5,这样缩放就可以在图像的中心进行操作。使用ScrollViewer缩放会聚焦于图像的左上角。在这种情况下有没有办法强制缩放在图像中心进行操作? - Andy
Andy:https://dev59.com/questions/HljUa4cB1Zd3GeqPSIjA 这个链接应该能解决你的问题。 - Bas
是的,这似乎非常有效。我唯一需要做出的更改是在ScrollViewer的OnScrollChanged()响应中更改滚动偏移量,因为在我的情况下,滚动信息尚未更新,我得到了一些奇怪的结果。感谢您的帮助。 :) - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接