WPF: Làm thế nào để hiển thị hình ảnh ở kích thước ban đầu?


98

Tôi gặp sự cố với việc hiển thị hình ảnh trong WPF.

Đây là mã của tôi:

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

Tôi có một hình ảnh với kích thước gốc 32 * 32, nhưng khi tôi chạy đoạn mã trên, hình ảnh sẽ bị giãn ra để lấp đầy không gian, vượt quá kích thước ban đầu. Tôi cũng đặt thuộc tính "Stretch" thành "None", nhưng có vẻ như nó không hoạt động.

Vì vậy, làm thế nào tôi có thể khắc phục sự cố này? Cảm ơn bạn!

Câu trả lời:


127

Đây là một câu hỏi tương tự. Nói chung thiết lập Stretch="None"là đủ.

Điều rất quan trọng là DPI có hình ảnh được đặt trong siêu dữ liệu. Tôi mất khá nhiều thời gian trước khi tìm ra rằng nếu DPI của hình ảnh khác với DPI của màn hình (thường là 96), WPF sẽ tự động thay đổi kích thước hình ảnh, vì nó cố gắng độc lập với DPI .


BIÊN TẬP

Liên kết MSDN bị hỏng, đây là liên kết mới: MSDN Blog - Blurry Bitmaps . Hãy giữ lại liên kết cũ để được sử dụng cho archive.org, trong trường hợp liên kết mới cũng ngừng hoạt động.


10
Mẹo hay về cài đặt DPI, Paja. Một số biểu tượng trên thanh công cụ của tôi đã được đặt thành 72 DPI, điều này khiến chúng có vẻ lớn hơn ngay cả khi kích thước pixel là 16x16.
dthrasher

Tôi không hiểu. Bạn đang nói WPF sẽ bố trí cửa sổ của bạn khác nhau tùy thuộc vào độ phân giải của màn hình? Không có cách nào có thể là một điều tốt.
Kyle Delaney

@KyleDelaney Bạn đã đọc bài báo tôi liên kết trong câu trả lời chưa?
Paya

1
@KyleDelaney Có, đó cũng là lý do tại sao bạn sử dụng "điểm" thay vì "pixel" để chỉ định kích thước, khoảng cách, lề, v.v. trong WPF.
Paya

1
@ PawełAudionysos Tôi đã sửa liên kết bị hỏng
Paya

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

Cái này phù hợp với tôi, cho một hình ảnh với 600x800 pixels96dpi.

@ rishad2m8 Nếu kích thước không xác định, người ta có thể phát hiện kích thước trước tiên bằng https://msdn.microsoft.com/en-us/library/system.drawing.image.size(v=vs.110).aspx Tôi đoán vậy.


1
nếu kích thước hình ảnh không xác định thì sao?
rishad2m8,

Bạn là một vị cứu tinh. Bạn sẽ không muốn biết tôi đã đau đầu với vấn đề này bao lâu.
David Atkinson

1
UseLayoutRounds được đặt thành true phù hợp với tôi! Cảm ơn!
Blake Thingstad

6

Hãy thử không chỉ định chiều rộng hoặc chiều cao, hãy sử dụng nó như sau:

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

4

Thêm vào câu trả lời của Paya: để bù đắp WPFnỗ lực 's để thích ứng với độ phân giải màn hình bạn sẽ có thể thiết lập WidthHeightđến kích thước và sử dụng ban đầu của tập tin Stretch="Fill". Điều này đã làm việc cho tôi.


0

Nếu bạn muốn hiển thị hình ảnh với kích thước gốc, nhưng không biết kích thước hình ảnh, tôi nghĩ cách tốt nhất là đặt hình ảnh làm nền của UIElement. Như thế này:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.