WPF: как отобразить изображение в исходном размере?

98

У меня проблема с отображением изображений в WPF.

Вот мой код:

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

У меня есть изображение с исходным размером 32 * 32, но когда я запустил приведенный выше код, изображение растянется, чтобы заполнить все пространство, сверх исходного размера. Я также установил свойство «Растянуть» на «Нет», но похоже, что это не работает.

Итак, как я могу решить эту проблему? Спасибо!

цзилуо
источник

Ответы:

126

Вот похожий вопрос. Обычно установкаStretch="None" достаточно.

Также очень важно, какой DPI имеет изображение, установленное в метаданных. Мне потребовалось довольно много времени, прежде чем я понял, что если DPI изображения отличается от DPI монитора (обычно 96), WPF автоматически изменит размер изображения, поскольку он пытается быть независимым от DPI .


РЕДАКТИРОВАТЬ

Ссылка MSDN не работает, вот новая ссылка: Блог MSDN - Blurry Bitmaps . Давайте оставим старую ссылку, чтобы использовать ее для archive.org, на случай, если новая ссылка также перестанет работать.

Пайя
источник
10
Отличный совет относительно настроек DPI, Paja. Для некоторых из моих значков на панели инструментов установлено значение 72 DPI, из-за чего они кажутся больше, даже если размер пикселей составляет 16x16.
dthrasher
Я не понимаю Вы говорите, что WPF будет по-разному размещать ваше окно в зависимости от разрешения экрана? Нет никакого способа, чтобы это могло быть хорошо.
Кайл Делани
@KyleDelaney Вы читали статью, на которую я указал в ответе?
Paya
1
@KyleDelaney Да, именно поэтому вы используете «точки» вместо «пикселей» для указания размеров, расстояний, полей и т. Д. В WPF.
Пайя
1
@ PawełAudionysos Я исправил неработающую ссылку
Пая
7
<Image Source="Images/Background.png" UseLayoutRounding="True" SnapsToDevicePixels="True" Width="600" Height="800" Stretch="Fill" />

Этот подходит мне для изображения с 600x800 pixelsи 96dpi.

@ rishad2m8 Если размер неизвестен, можно сначала определить размер с помощью https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx, я бы предположил.

Ульрих-Лоренц Шлютер
источник
1
что делать, если размер изображения неизвестен?
rishad2m8
Ты спаситель. Вы бы не хотели знать, как долго я мучился над этим вопросом.
Дэвид Аткинсон
1
Для UseLayoutRounding установлено значение true! Спасибо!
Блейк Тингстад
6

Попробуйте не указывать ширину или высоту, вместо этого используйте это так:

<Image Source="/images/user_add.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Center" />
ВудуРебенок
источник
4

Добавление к ответу Пайи: чтобы компенсировать WPFпопытку адаптироваться к разрешению монитора, вы должны иметь возможность установить Widthи Heightдля исходных размеров файла и использования Stretch="Fill". Это сработало для меня.

прости миссджексон
источник
0

Если вы хотите отобразить изображение с исходным размером, но не знаете размер изображения, я думаю, что лучший способ - установить изображение в качестве фона UIElement. Как это:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
Ширли
источник