WPF: come visualizzare un'immagine nella sua dimensione originale?


98

Ho un problema con la visualizzazione delle immagini in WPF.

Ecco il mio codice:

<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>

Ho un'immagine con dimensione originale 32 * 32, ma quando ho eseguito il codice sopra, l'immagine si allungherà per riempire tutto lo spazio, oltre la sua dimensione originale. Ho anche impostato la proprietà "Stretch" su "None", ma sembra che non funzioni.

Allora, come posso risolvere questo problema? Grazie!

Risposte:


127

Ecco una domanda simile. Generalmente l'impostazione Stretch="None"è sufficiente.

È anche molto importante quale DPI ha l'immagine impostata nei metadati. Mi ci è voluto un po 'prima di capire che se il DPI dell'immagine è diverso dal DPI del monitor (di solito 96), WPF ridimensionerà automaticamente l'immagine, poiché cerca di essere indipendente dal DPI .


MODIFICARE

Il collegamento MSDN è interrotto, ecco il nuovo collegamento: MSDN Blog - Blurry Bitmaps . Manteniamo il vecchio collegamento in giro da utilizzare per archive.org, nel caso anche il nuovo collegamento smetta di funzionare.


10
Ottimo consiglio per quanto riguarda le impostazioni DPI, Paja. Molte delle mie icone della barra degli strumenti erano state impostate su 72 DPI, il che le fa apparire più grandi anche se le dimensioni dei pixel sono 16x16.
dthrasher

Non capisco. Stai dicendo che WPF imposterà la tua finestra in modo diverso a seconda della risoluzione dello schermo? Non c'è modo che possa essere una buona cosa.
Kyle Delaney

@KyleDelaney Hai letto l'articolo che ho linkato nella risposta?
Paya

1
@KyleDelaney Sì, è anche per questo che usi "punti" invece di "pixel" per specificare dimensioni, distanze, margini ecc. In WPF.
Paya

1
@ PawełAudionysos Ho corretto il collegamento interrotto
Paya

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

Questo funziona per me, per un'immagine con 600x800 pixelse 96dpi.

@ rishad2m8 Se la dimensione è sconosciuta, è possibile rilevare prima la dimensione con https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx immagino.


1
cosa succede se la dimensione dell'immagine è sconosciuta?
rishad2m8

Sei un salvatore. Non vorresti sapere per quanto tempo stavo agonizzando per questo problema.
David Atkinson

1
UseLayoutRounding impostato su true ha funzionato per me! Grazie!
Blake Thingstad

6

Prova a non specificare larghezza o altezza, usalo invece in questo modo:

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

4

Aggiungendo alla risposta di Paya: per compensare WPF's tentativo di adattare alla risoluzione monitor si dovrebbe essere in grado di impostare la Widthe Heightalle dimensioni originali del file e utilizzare Stretch="Fill". Questo ha funzionato per me.


0

Se vuoi visualizzare l'immagine con la dimensione originale, ma non conosci la dimensione dell'immagine, penso che il modo migliore sia impostare l'immagine come sfondo di UIElement. Come questo:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.