WPF: Wie wird ein Bild in seiner Originalgröße angezeigt?

98

Ich habe ein Problem mit der Anzeige von Bildern in WPF.

Hier ist mein Code:

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

Ich habe ein Bild mit der Originalgröße 32 * 32, aber wenn ich den obigen Code ausgeführt habe, wird das Bild gedehnt, um den gesamten Raum über die Originalgröße hinaus auszufüllen. Ich habe auch die "Stretch" -Eigenschaft auf "None" gesetzt, aber es scheint, dass es nicht funktioniert.

Wie kann ich dieses Problem beheben? Danke dir!

Jiluo
quelle

Antworten:

127

Hier ist eine ähnliche Frage. Im Allgemeinen ist die Einstellung Stretch="None"ausreichend.

Es ist auch sehr wichtig, für welche DPI das Bild in Metadaten festgelegt ist. Es hat eine Weile gedauert, bis ich herausgefunden habe, dass WPF die Bildgröße automatisch ändert , wenn sich die DPI des Bildes von der DPI des Monitors unterscheidet (normalerweise 96) , da es versucht, DPI-unabhängig zu sein .


BEARBEITEN

Der MSDN-Link ist defekt, hier ist der neue Link: MSDN-Blog - Verschwommene Bitmaps . Lassen Sie uns den alten Link behalten, der für archive.org verwendet werden soll, falls der neue Link auch nicht mehr funktioniert.

Paya
quelle
10
Toller Tipp bezüglich der DPI-Einstellungen, Paja. Einige meiner Symbolleistensymbole wurden auf 72 DPI eingestellt, wodurch sie größer erscheinen, selbst wenn die Pixelabmessungen 16 x 16 betragen.
Dthrasher
Ich verstehe nicht. Wollen Sie damit sagen, dass WPF Ihr Fenster je nach Bildschirmauflösung unterschiedlich gestaltet? Es gibt keine Möglichkeit, die eine gute Sache sein könnte.
Kyle Delaney
@KyleDelaney Hast du den Artikel gelesen, den ich in der Antwort verlinkt habe?
Paya
1
@KyleDelaney Ja, deshalb verwenden Sie auch "Punkte" anstelle von "Pixeln", um Größen, Abstände, Ränder usw. in WPF anzugeben.
Paya
1
@ PawełAudionysos Ich habe den defekten Link behoben
Paya
7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

Dieser arbeitet für mich, für ein Bild mit 600x800 pixelsund 96dpi.

@ rishad2m8 Wenn die Größe unbekannt ist, kann man die Größe zuerst mit https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx ermitteln .

Ulrich-Lorenz Schlüter
quelle
1
Was ist, wenn die Bildgröße unbekannt ist?
Rishad2M8
Du bist ein Retter. Sie möchten nicht wissen, wie lange ich mich mit diesem Thema befasst habe.
David Atkinson
1
UseLayoutRounding auf true gesetzt hat bei mir funktioniert! Vielen Dank!
Blake Thingstad
6

Versuchen Sie, keine Breite oder Höhe anzugeben. Verwenden Sie diese stattdessen wie folgt:

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

Hinzufügen zu Payas Antwort: Um den WPFVersuch zu kompensieren , sich an die Monitorauflösung anzupassen, sollten Sie in der Lage sein, das Widthund Heightdie ursprünglichen Abmessungen und die Verwendung der Datei festzulegen Stretch="Fill". Das hat bei mir funktioniert.

sorrymissjackson
quelle
0

Wenn Sie das Bild in Originalgröße anzeigen möchten, aber die Bildgröße nicht kennen, ist es meiner Meinung nach am besten, das Bild als Hintergrund für UIElement festzulegen. So was:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
Shirley
quelle