在画布内拉伸图像

9
我希望在Canvas中放入图片并使其适应窗口大小。当Canvas为空时,它可以正常工作(Canvas会调整为窗口大小),但是当我将图片添加到其中时,即使我将Stretch="Uniform" 应用于图片,Canvas也不再适应窗口大小。我在下面描述了这种行为。很遗憾,因为我需要在上面画形状,所以必须使用Canvas。请问有什么想法吗?
<Window x:Class="ImageCropper.Window3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window3" Height="300" Width="300">
    <Border BorderThickness="3" BorderBrush="Red">
        <Canvas Background="Blue">
        </Canvas>
    </Border>
</Window>

enter image description here

Bad

<Window x:Class="ImageCropper.Window3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window3" Height="300" Width="300">
    <Border BorderThickness="3" BorderBrush="Red">
        <Canvas Background="Blue">
            <Image Source="asd.png" Stretch="Uniform" />
        </Canvas>
    </Border>
</Window>

enter image description here


你的图像比区域大,可以将Canvas换成ViewBox,或者既然它似乎只是作为背景使用,为什么不直接使用Border.Background和ImageBrush呢? - Chris W.
我尝试用ViewBox包装图像,但这并没有帮助,而且Border只是为了说明问题,在正常情况下我不使用它。不幸的是,图像并不仅仅是背景。 - user1121956
所以你放弃了canvas,改用viewbox,并将viewbox的stretch设置为uniform或uniform to fill?那应该可以正常工作,我猜我们可能需要一个更真实的例子来说明你想要实现什么。 - Chris W.
不,我只是用ViewBox包装了Image。我不能舍弃画布,因为我在问题中写过——它是一个名为SelectionCanvas的画布,当用户移动鼠标时绘制矩形——仅仅是一个选择工具(但是该类中没有关于位置或大小的代码,所以与此无关) :) - user1121956
1个回答

20

我认为在canvas中,stretch效果并不是很好。请参考这个答案:https://dev59.com/1VfUa4cB1Zd3GeqPFzcK#6010270

然而,我使用以下方法成功实现了stretch效果:

<Border BorderThickness="3" BorderBrush="Red">
    <Canvas Background="Blue" Name="canvas1">
        <Image Source="asd.png" Width="{Binding Path=ActualWidth, ElementName=canvas1}" Height="{Binding Path=ActualHeight, ElementName=canvas1}" Stretch="Uniform"/>
    </Canvas>
</Border>

太好了,许多帖子都说这是不可能的。太棒了! - Hans

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