我正在编写一个显示最初居中的图像的WPF应用程序。用户可以放大/缩小并移动图像,这些图像是使用ScaleTransform
和TranslateTransform
实现的。这很有效。
问题是当图像明显大于窗口时,用户移动图像或缩小到足以使整个图像可见。最初隐藏的图像部分不会被渲染,而是仅绘制图像的原始可视部分。
基于某些other questions,如果我将我的图片放在Canvas
内,这将导致整个图像被渲染,并且在移动时它将被正确渲染。问题是我不希望我的图像位于Canvas
,因为这会阻止任何其他布局发生 - HorizontalAlignment
和VerticalAlignment
属性会被忽略(因此图像是不再居中),我需要实现一个选项,它将尽可能大地绘制图像以填充不再有效的窗口的整个区域(将Stretch
属性设置为UniformToFill
不会'做任何事情。)
目前,这两个转换设置为RenderTransform
属性。如果我改为使用LayoutTransform
,则会绘制整个图像,但这也会阻止用户将图像的任何部分移出窗口边缘(这是我想保留的行为)。
如何在不使用Canvas
或LayoutTransform
的情况下告诉WPF始终呈现整个图像?
答案 0 :(得分:1)
我建议不要使用TranslateTransform,而是依赖ScrollViewer。
<ScrollViewer>
<Grid>
<Image Source="blabla">
<Image.LayoutTransform>
<ScaleTransform />
</Image.LayoutTransform>
</Image>
</Grid>
</ScrollViewer>
ScrollViewer为图像提供无限空间展开,整个图像将被渲染。网格强制居中布局,同时仍允许图像扩展。如果您不喜欢滚动条来控制翻译,那么您可以隐藏它们并滚动您自己的解决方案。
LayoutTransform是定义的方式,因此图像的实际大小(以缩放为单位)会正确反映到窗口上。