WPF: Jak wyświetlić obraz w jego oryginalnym rozmiarze?

98

Mam problem z wyświetlaniem obrazów w WPF.

Oto mój kod:

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

Mam obraz o oryginalnym rozmiarze 32 * 32, ale kiedy uruchomię powyższy kod, obraz rozciągnie się, aby wypełnić całą przestrzeń, poza jego oryginalny rozmiar. Ustawiłem również właściwość „Stretch” na „None”, ale wygląda na to, że to nie działa.

Jak więc mogę rozwiązać ten problem? Dziękuję Ci!

jiluo
źródło

Odpowiedzi:

127

Oto podobne pytanie. Ogólnie ustawienie Stretch="None"jest wystarczające.

Bardzo ważne jest również to, jakie DPI ma obraz ustawiony w metadanych. Zajęło mi trochę czasu, zanim zorientowałem się, że jeśli DPI obrazu różni się od DPI monitora (zwykle 96), WPF automatycznie zmieni rozmiar obrazu, ponieważ próbuje być niezależny od DPI .


EDYTOWAĆ

Łącze MSDN jest uszkodzone, oto nowe łącze: Blog MSDN - Rozmyte mapy bitowe . Zachowajmy stary link do wykorzystania w archive.org, na wypadek gdyby nowy link również przestał działać.

Paya
źródło
10
Świetna wskazówka dotycząca ustawień DPI, Paja. Kilka ikon mojego paska narzędzi zostało ustawionych na 72 DPI, co powoduje, że wydają się większe, nawet jeśli wymiary w pikselach wynoszą 16x16.
dthrasher
Nie rozumiem. Czy mówisz, że WPF będzie układać twoje okno inaczej w zależności od rozdzielczości ekranu? Nie ma mowy, żeby to mogło być dobre.
Kyle Delaney
@KyleDelaney Czy przeczytałeś artykuł, do którego umieściłem link w odpowiedzi?
Paya
1
@KyleDelaney Tak, dlatego też używasz „punktów” zamiast „pikseli” do określania rozmiarów, odległości, marginesów itp. W WPF.
Paya
1
@ PawełAudionysos Naprawiłem zepsuty link
Paya
7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

Ten działa dla mnie, dla obrazu z 600x800 pixelsi 96dpi.

@ rishad2m8 Jeśli rozmiar jest nieznany, można najpierw wykryć rozmiar za pomocą https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx , jak sądzę.

Ulrich-Lorenz Schlüter
źródło
1
co jeśli rozmiar obrazu jest nieznany?
rishad2m8
Jesteś zbawicielem. Nie chciałbyś wiedzieć, jak długo męczyłem się z tym problemem.
David Atkinson
1
UseLayoutRounding ustawiony na true zadziałał dla mnie! Dzięki!
Blake Thingstad
6

Spróbuj nie określać szerokości ani wysokości, zamiast tego użyj tego w ten sposób:

<Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" />
VoodooChild
źródło
4

Dodając do odpowiedzi Paya: aby zrekompensować WPFpróbę dostosowania się do rozdzielczości monitorów, powinieneś być w stanie ustawić Widthi Heightdo oryginalnych wymiarów i wykorzystania pliku Stretch="Fill". To zadziałało dla mnie.

sorrymissjackson
źródło
0

Jeśli chcesz wyświetlić obraz w oryginalnym rozmiarze, ale nie znasz rozmiaru obrazu, myślę, że najlepszym sposobem jest ustawienie obrazu jako tła elementu UIElement. Lubię to:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
shirley
źródło