WPF: Comment afficher une image à sa taille d'origine?

98

J'ai un problème avec l'affichage des images dans WPF.

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

J'ai une image avec la taille originale 32 * 32, mais quand j'ai exécuté le code ci-dessus, l'image s'étirera pour remplir tout l'espace, au-delà de sa taille originale. J'ai également défini la propriété "Stretch" sur "None", mais il semble que cela ne fonctionne pas.

Alors, comment puis-je résoudre ce problème? Je vous remercie!

jiluo
la source

Réponses:

127

Voici une question similaire. Généralement, le réglage Stretch="None"suffit.

Il est également très important de définir le DPI dans les métadonnées. Il m'a fallu un certain temps avant de comprendre que si le DPI de l'image est différent du DPI du moniteur (généralement 96), WPF redimensionnera automatiquement l'image, car il essaie d'être indépendant du DPI .


ÉDITER

Le lien MSDN est rompu, voici le nouveau lien: Blog MSDN - Bitmaps flous . Gardons l'ancien lien pour qu'il soit utilisé pour archive.org, au cas où le nouveau lien cesserait de fonctionner également.

Paya
la source
10
Bon conseil concernant les paramètres DPI, Paja. Plusieurs de mes icônes de barre d'outils avaient été définies sur 72 DPI, ce qui les fait paraître plus grandes même si les dimensions des pixels sont 16x16.
dthrasher
Je ne comprends pas. Êtes-vous en train de dire que WPF agencera votre fenêtre différemment en fonction de la résolution de l'écran? Il n'y a aucun moyen que cela puisse être une bonne chose.
Kyle Delaney
@KyleDelaney Avez-vous lu l'article que j'ai lié dans la réponse?
Paya le
1
@KyleDelaney Oui, c'est aussi pourquoi vous utilisez des "points" au lieu de "pixels" pour spécifier les tailles, les distances, les marges, etc. dans WPF.
Paya
1
@ PawełAudionysos J'ai corrigé le lien brisé
Paya
7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

Celui-ci fonctionne pour moi, pour une image avec 600x800 pixelset 96dpi.

@ rishad2m8 Si la taille est inconnue, on peut d'abord détecter la taille avec https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx je suppose.

Ulrich-Lorenz Schlüter
la source
1
et si la taille de l'image est inconnue?
rishad2m8
Tu es un sauveur. Vous ne voudriez pas savoir depuis combien de temps j'ai été angoissé par ce problème.
David Atkinson
1
UseLayoutRounding réglé sur true a fonctionné pour moi! Merci!
Blake Thingstad
6

Essayez de ne pas spécifier la largeur ou la hauteur, utilisez-le comme ceci à la place:

<Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" />
Bébé vaudou
la source
4

Ajout à la réponse de Paya: pour compenser WPFla tentative de s'adapter à la résolution des moniteurs, vous devriez être en mesure de régler Widthet Heightaux dimensions et à l'utilisation d'origine du fichier Stretch="Fill". Cela a fonctionné pour moi.

désolé missjackson
la source
0

Si vous souhaitez afficher l'image avec la taille d'origine, mais que vous ne connaissez pas la taille de l'image, je pense que le meilleur moyen est de définir l'image comme arrière-plan de UIElement. Comme ça:

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