如何在XAML中显示图片的实际大小?

13

我有一张27 x 27像素的图片,我在WPF中显示它,但是它显示的比窗口大小还要大。

我怎样才能让它以实际尺寸显示?

alt text http://www.deviantsart.com/upload/m20dk6.png

XAML:

<Window x:Class="TestImage23434.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel x:Name="MainStackPanel"/>
</Window>

后台代码:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System;

namespace TestImage23434
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            TextBlock tb = new TextBlock();
            tb.Text = "above image ";
            MainStackPanel.Children.Add(tb);

            Image img = new Image();
            img.Source = new BitmapImage(new Uri(@"C:\test\circle.png"));
            img.HorizontalAlignment = HorizontalAlignment.Left;
            img.VerticalAlignment = VerticalAlignment.Top;
            MainStackPanel.HorizontalAlignment = HorizontalAlignment.Left;
            MainStackPanel.VerticalAlignment = VerticalAlignment.Top;
            MainStackPanel.Children.Add(img);

            TextBlock tb2 = new TextBlock();
            tb2.Text = "below image";
            MainStackPanel.Children.Add(tb2);
        }
    }
}

这个回答解决了你的问题吗?WPF:如何以原始大小显示图像? - StayOnTarget
4个回答

23

img.Stretch = Stretch.None

默认情况下,Stretch 属性的值为 Uniform,这会使图像拉伸以填充所有可用空间。若设置为None,则不会拉伸该图像。


2
我从未以这种方式使用过图像,需要使用Stretch属性...我甚至忘记它的存在。 - Nathan Wheeler
2
如果我们设置 "img.Stretch = Stretch.None",当图像太大时,部分图像将无法显示。有什么解决办法吗? - achukrishnan

8

这些提示对我都没有用。一些绑定技巧才是让我继续前进的关键。

<Image Source="yourPic.png" Stretch="UniformToFill"
Width="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelWidth}"
Height="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelHeight}" />

你可能可以将Stretch设置为None,但这对于我使用的.NET 4.5.1应用程序有效。

将宽度和高度绑定与静态的MaxWidthMaxHeightStretch="Uniform"相结合,可以使原始大小在一定限制内保持良好。在这种情况下,接受的答案仅显示图像的一部分。 - grek40
如果你想让这个工作,就不能使用 Stretch="None"!在我意识到之前,我浪费了将近一个小时。 - Paweł Audionysos

2
img.HorizontalAlignment = HorizontalAlignment.Left;
img.VerticalAlignment = VerticalAlignment.Top;
img.Stretch = Stretch.None;

StackPanel将会填充并溢出其所在的容器,除非指定了其大小。由于您没有在任何元素上设置边距或对齐方式,因此一切的默认行为都是Margin="0,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch",或者简单地说是“拉伸以填充”。对您的元素进行对齐/定位将解决此问题。
编辑:添加img.Stretch = Stretch.None;,同时我构建了一个示例应用并进行了测试……它可以工作。

对齐方式如何影响显示图像的大小? - dtb
标准对齐方式是“Stretch”,它确实会影响大小。 - Heinzi
我尝试过了,但它仍然会扩展到其可能的区域大小。我也尝试将这些设置放在 StackPanel 上,但它仍然会扩展。 - Edward Tanguay
@Heinzi - 谢谢,我一直在想为什么它会被踩,直到看到你的编辑... :D - Nathan Wheeler

2

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