2013-02-26 69 views
4

我在写一个WPF应用程序,它显示最初居中的图像。用户可以放大/缩小并移动图像,这些图像使用ScaleTransformTranslateTransform实现。这很好。如何防止WPF裁剪我的图像?

问题是当图像明显大于窗口,并且用户移动图像或缩小到足以使整个图像可见时。最初隐藏的图像部分不会被渲染,而只会绘制图像最初可见的部分。基于一些otherquestions

,如果我把我的形象Canvas,这将导致整个图像渲染,并在移动时它会被正确地渲染的内部。问题是我不希望我的图像位于Canvas中,因为这会阻止发生任何其他布局 - HorizontalAlignmentVerticalAlignment属性会被忽略(因此图像不再居中),而且我需要实现一个选项这将尽可能大地绘制图像以填充不再起作用的窗口的整个区域(将Stretch属性设置为UniformToFill不做任何事情)。

目前这两个转换设置为RenderTransform属性。如果我使用LayoutTransform来代替整个图像,但这也会阻止用户将图像的任何部分从窗口边缘移出(这是我想保留的行为)。

如何让WPF始终呈现整个图像而不使用CanvasLayoutTransform

回答

1

我建议不要使用TranslateTransform,而应该依靠ScrollViewer。

<ScrollViewer> 
    <Grid> 
     <Image Source="blabla"> 
      <Image.LayoutTransform> 
       <ScaleTransform /> 
      </Image.LayoutTransform> 
     </Image> 
    </Grid> 
</ScrollViewer> 

的的ScrollViewer给出了图像的无限空间扩大,整个图像将被渲染。网格强制居中布局,同时仍然允许图像展开。如果你不喜欢滚动条来控制翻译,那么你可以隐藏它们并推出你自己的解决方案。

LayoutTransform是definetely的路要走,所以在像素(基于变焦),图像的实际尺寸是否正确反映到你的窗口。

+0

这似乎确实工作得很好。有一件不起作用的东西(我承认在这个问题中忘了提及 - 对不起!)是因为我的图像有一个'RenderTransformOrigin'设置为'0.5,0.5'​​,因此缩放操作在图像的中心。使用ScrollViewer放大图像,最后聚焦在图像的左上角。在这种情况下,是否有某种方法可以强制缩放操作在图像的中心? – Andy 2013-02-26 17:15:52

+0

Andy:http://stackoverflow.com/questions/6447114/how-to-keep-area-of-canvas-centered-in-a-scrollviewer-when-zoomed-in-or-out-and回答你的问题。 – Bas 2013-02-27 16:16:55

+0

是的,这似乎工作得很好。我必须做出的唯一改变是为了响应ScrollViewer的OnScrollChanged()而改变滚动偏移量,因为在我的情况下滚动信息还没有更新,并且我得到了一些奇怪的结果。谢谢您的帮助。 :) – Andy 2013-02-27 17:44:35