【问题标题】:Stretch image to fill available width / height (separately)拉伸图像以填充可用宽度/高度(单独)
【发布时间】:2013-08-15 09:57:35
【问题描述】:

有没有办法用 xaml 中的图像填充可用的宽度/高度? 我需要 UniformToFill 之类的东西,但我可以控制拉伸方向(宽度或高度)

假设我有以下代码:

<UniformGrid Columns="2" Rows="2">        
    <Image Source="Desert1.jpg" Stretch="Uniform"/> //
    <Image Source="Desert2.jpg" Stretch="UniformToFill"/> // 
    <Image Source="Desert3.jpg" />
    <Image Source="Desert4.jpg" />
</UniformGrid>

编辑: 例如(宽度):如果图像是我想要显示的宽度的一半,我不关心高度,只需缩放 x2 图像高度和宽度。所以图像必须适合宽度,而不关心高度。这是理想的行为,但如果不可能 - 好的。因此,如果可能的话,您可以重新考虑问题,我该如何在 xaml 中做到这一点。

所有图片也可能有不同的宽度和高度

【问题讨论】:

  • 需要动态控制吗?
  • @KingKing 是的,我需要界面中的复选框来控制它
  • "static" 解决方案也可以接受,所以我可以加倍 xaml 代码并隐藏不必要的:D。但动态更可取
  • 我真的不明白这里的问题。你是说如果你的图像是你想要显示的宽度的一半,但是正确的高度,你只想水平扩展它?这种行为对我来说毫无意义,所以如果是这种情况,也许你应该重新考虑你的目标。
  • @ZombieSheep 据我了解,他可能想要一些Property 来确定图像是否应该在WidthHeight 上拉伸(当然另一个(非拉伸)将被统一,以便图像的Width/Height与原始图像相同。

标签: c# wpf image


【解决方案1】:

我认为您可能能够在某些条件下获得您想要的效果。如果您的图片都大于它们将要显示的尺寸,您可以使用这个:

<Image Source="Desert.jpg" Stretch="UniformToFill" StretchDirection="DownOnly" />

ViewBoxImage 具有相同的Stretch 属性,并且在 MSDN 上的How to: Apply Stretch Properties to the Contents of a Viewbox 文章中提供了一个很好的示例来说明不同组合之间的差异。

【讨论】:

  • 我已经看到了这些属性,但是它们可以工作的情况应该太具体了。此外,UniformToFill 涵盖了这种情况,而不是它始终需要的高度或宽度。不幸的是,UniformToFill 不允许设置所需的属性
  • 如果您实际上花时间将 MSDN 上链接页面中的示例代码放入一个新的测试 WPF 项目并使用我上面列出的设置运行它,然后你会看到这确实给了你想要的结果。 唯一的条件是原始图像尺寸大于显示的尺寸。尽管如此,如果无法满足该条件,那么我接受这对您没有帮助。
  • 好吧,我把这段代码放了,还是看不懂。对于宽度和高度都较大的图片,它看起来绝对像使用 UniformToFill,但对于小图片,它根本不起作用。而且看起来我无法控制必须使用哪个属性来进行缩放
  • 确实说只有当你的图片比你显示的大时它才会起作用。如果您选择DownOnly,然后在UnifromUniformToFill 设置之间交替,您将看到它正在通过降低高度和显示所需的全宽来工作。如果您想放大图片(例如,使用小于显示尺寸的图片),请不要介意,祝您搜索顺利。
  • 我在 MSDN 示例中仔细测试了更大的图片(和旋转版本)。 Uniform 减小宽度和高度。对于UniformToFill,减小宽度或高度的最小值。再说一次,我似乎无法控制必须使用哪个属性来进行缩放。
【解决方案2】:

这可能就是你要找的……

TransformedBitmap

这是我在 ImageUtility 类中创建的静态方法。

public static TransformedBitmap GetScaledBitmapImageSprite(BitmapSource src, double x_scale, double y_scale)
{
  return (new TransformedBitmap(src, new ScaleTransform(x_scale, y_scale)));
{

x_scale 和 y_scale 是双精度形式:

desired_width / original_width

可能与您正在寻找的内容有所不同,但我认为它可以让您走上正确的道路。

您可以将 TransformedBitmap 存储在内存中并通过以下方式应用新的变换:

TransformedBitmap x = new TransformedBitmap();
x.Transform = new ScaleTransform(x,y);

【讨论】:

  • 我正在寻找基于 XAML 的解决方案,因为它使我不必获取父容器的高度、图片高度,然后在代码中计算缩放率。
【解决方案3】:

你应该使用

<Image Source="{Binding Image}" Stretch="Fill"/>

如果你使用 Stretch="UnifrmtoFill" 那么它会按比例改变长度和宽度,或者我说两者都在一起。

所以如果你使用 Stretch="Fill",它使您有机会一次更改高度或宽度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多