在运行时加载 PNG 会创建与使用 XAML 加载的 PNG 不同的高度

Loading a PNG at runtime is creating a different height than the PNG loaded with XAML

我以前从未见过这个。如果我这样设置 canvas 的背景:

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

运行时看起来像这样:

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

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

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

我该如何解决这个问题?

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

您的第一个标记在画笔上设置了 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

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