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 Blog - พร่ามัวบิตแมป ลองเก็บลิงค์เก่าไว้ใช้สำหรับ archive.org ในกรณีที่ลิงค์ใหม่หยุดทำงานด้วย


10
เคล็ดลับดีๆเกี่ยวกับการตั้งค่า DPI Paja ไอคอนแถบเครื่องมือหลายไอคอนของฉันถูกตั้งค่าเป็น 72 DPI ซึ่งทำให้ไอคอนเหล่านี้ดูใหญ่ขึ้นแม้ว่าขนาดพิกเซลจะเป็น 16x16 ก็ตาม
dthrasher

ฉันไม่เข้าใจ. คุณกำลังบอกว่า WPF จะจัดวางหน้าต่างของคุณแตกต่างกันไปขึ้นอยู่กับความละเอียดของหน้าจอหรือไม่? ไม่มีทางที่จะเป็นเรื่องดีได้
Kyle Delaney

@KyleDelaney คุณอ่านบทความที่ฉันเชื่อมโยงในคำตอบหรือยัง?
ปายา

1
@KyleDelaney ใช่นั่นเป็นเหตุผลที่คุณใช้ "จุด" แทน "พิกเซล" เพื่อระบุขนาดระยะทางระยะขอบ ฯลฯ ใน WPF
พญา

1
@ PawełAudionysosฉันได้แก้ไขลิงก์ที่เสียแล้ว
Paya

7

พยายามไม่ระบุความกว้างหรือความสูงใช้แบบนี้แทน:

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

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

คุณเป็นผู้กอบกู้ คุณคงไม่อยากรู้ว่าฉันเจ็บปวดกับปัญหานี้มานานแค่ไหน
David Atkinson

1
UseLayoutRounding ตั้งค่าเป็น true ใช้ได้กับฉัน! ขอบคุณ!
Blake Thingstad

4

การเพิ่มคำตอบของ Paya: เพื่อชดเชยWPFความพยายามในการปรับให้เข้ากับความละเอียดของจอภาพคุณควรจะสามารถตั้งค่าWidthและHeightขนาดไฟล์ต้นฉบับและใช้งานStretch="Fill"ได้ สิ่งนี้ได้ผลสำหรับฉัน


0

หากคุณต้องการแสดงภาพด้วยขนาดต้นฉบับ แต่ไม่ทราบขนาดภาพฉันคิดว่าวิธีที่ดีที่สุดคือการตั้งค่ารูปภาพเป็นพื้นหลังของ UIElement แบบนี้:

    <Button>
        <Button.Background>
            <ImageBrush ImageSource="/images/user_add.png" Stretch="None"/>
        </Button.Background>
    </Button>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.