【问题标题】:Loading a PNG at runtime is creating a different height than the PNG loaded with XAML在运行时加载 PNG 会创建与使用 XAML 加载的 PNG 不同的高度
【发布时间】:2020-04-14 07:00:27
【问题描述】:

我以前从未见过这种情况。如果我这样设置画布的背景:

<Canvas.Background>
    <ImageBrush  ImageSource="Combined Victorian.png"  Stretch="None" AlignmentX="Left" AlignmentY="Top" />
</Canvas.Background> 

在运行时看起来像这样:

太棒了!正是我想要的。但后来,按下按钮,我在 2 张画布背景图像之间切换。当我像这样加载完全相同的图像时:

ImageBrush brush = new ImageBrush();
brush.ImageSource = new BitmapImage(new Uri(@"Images\Combined Victorian.png", UriKind.Relative));
MainCanvas.Background = brush;

它被压扁了,看起来像这样:

我该如何解决这个问题?

【问题讨论】:

  • 您是否尝试使用BitmapCache.None 禁用BitmapCache 选项
  • 没有。我会在哪里做呢?加载之前还是之后?
  • 尝试使用此示例:stackoverflow.com/questions/32456183/… 没有变化。

标签: c# wpf canvas background png


【解决方案1】:

这解决了问题:我剪切了图像,使其与要进入的画布大小完全相同。发生的事情是将 PNG 从磁盘加载到 Canvas 将拉伸图像以适合目标矩形。无论如何似乎都没有改变它,所以它只会像通过 XAML 那样裁剪或“不拉伸”。如果有办法指定“不拉伸”,我还没有找到。

【讨论】:

    【解决方案2】:

    您的第一段标记在图像刷上设置了 Stretch="None"。

    您的代码没有。

    这就是区别。

    Imagebrush 继承自 tilebrush,您可以在其上看到拉伸属性:

    https://docs.microsoft.com/en-us/dotnet/api/system.windows.media.tilebrush.stretch?view=netframework-4.8#System_Windows_Media_TileBrush_Stretch

    如果您想在用户调整窗口大小时保持纵横比,您可能应该将拉伸设置为统一。就像他们开始时最大化一样。

    【讨论】:

    • 我从未找到将图像刷加载设置为剪辑的方法。你知道怎么做吗?否则,我在下面的解决方案有效。
    • Viewbox 允许您选择要使用的位图部分。 docs.microsoft.com/en-us/dotnet/api/…
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2013-01-30
    • 2012-08-06
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多