WPF: Bir görüntü orijinal boyutunda nasıl görüntülenir?


98

WPF'de resimleri görüntülemeyle ilgili bir sorun yaşıyorum.

İşte kodum:

<Button HorizontalAlignment="Left" Grid.Column="1" Grid.Row="5" Margin="0,5">
        <Button.Content>
            <StackPanel Orientation="Horizontal" Margin="10,0">
                <Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" />
                <TextBlock Text="添加" />
            </StackPanel>
        </Button.Content>
    </Button>

Orijinal boyutu 32 * 32 olan bir resmim var, ancak yukarıdaki kodu çalıştırdığımda, resim orijinal boyutunun ötesinde tüm alanı dolduracak şekilde genişleyecektir. Ayrıca "Stretch" özelliğini "None" olarak ayarladım, ancak çalışmıyor gibi görünüyor.

Peki bu sorunu nasıl çözebilirim? Teşekkür ederim!

Yanıtlar:


127

İşte benzer bir soru. Genelde ayar Stretch="None"yeterlidir.

Ayrıca, DPI'nın meta verilerde hangi görüntü ayarına sahip olduğu da çok önemlidir. Görüntünün DPI değerinin monitörün DPI'ından (genellikle 96) farklı olması durumunda, WPF'nin DPI'dan bağımsız olmaya çalıştığı için görüntüyü otomatik olarak yeniden boyutlandıracağını anlamam epey zaman aldı .


DÜZENLE

MSDN bağlantısı bozuk, işte yeni bağlantı: MSDN Blog - Blurry Bitmaps . Yeni bağlantının da çalışmayı durdurması durumunda, eski bağlantıyı archive.org için kullanalım.


10
DPI ayarlarıyla ilgili harika bir ipucu, Paja. Araç çubuğu simgelerimden birkaçı 72 DPI olarak ayarlanmıştı, bu da piksel boyutları 16x16 olsa bile daha büyük görünmelerine neden oluyor.
dthrasher

Ben anlamadım WPF'nin ekranın çözünürlüğüne bağlı olarak pencerenizi farklı şekilde düzenleyeceğini mi söylüyorsunuz? Bunun iyi bir şey olmasının hiçbir yolu yok.
Kyle Delaney

@KyleDelaney Cevaba bağladığım makaleyi okudunuz mu?
Paya

1
@KyleDelaney Evet, bu nedenle WPF'de boyutları, mesafeleri, kenar boşluklarını vb. Belirtmek için "pikseller" yerine "noktalar" kullanıyorsunuz.
Paya

1
@ PawełAudionysos Bozuk bağlantıyı düzelttim
Paya

7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

Bu seferki bir görüntü için, benim için çalışıyor 600x800 pixelsve 96dpi.

@ rishad2m8 Boyut bilinmiyorsa, önce boyutu https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx ile algılayabilirim .


1
ya resim boyutu bilinmiyorsa?
rishad2m8

Sen bir kurtarıcısın. Bu konuda ne kadar acı çektiğimi bilmek istemezsin.
David Atkinson

1
UseLayoutRounding true olarak ayarlanmış benim için çalıştı! Teşekkürler!
Blake Thingstad

6

Genişliği veya yüksekliği belirtmemeye çalışın, bunun yerine şu şekilde kullanın:

<Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" />

4

Paya'nın cevabına ek olarak: WPFmonitörün çözünürlüğüne uyum sağlama girişimini telafi etmek için, Widthve Heightdosyasının orijinal boyutlarını ayarlayabilmeli ve kullanabilmelisiniz Stretch="Fill". Bu benim için çalıştı.


0

Görüntüyü orijinal boyutta görüntülemek istiyorsanız, ancak görüntü boyutunu bilmiyorsanız, bence en iyi yol görüntüyü UIElement'in arka planı olarak ayarlamaktır. Bunun gibi:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.