2011-03-11 35 views
5

我有一個畫布作爲圖像查看器。它的背景用於放置圖像,我想在其上放置另一張圖像。所以,這種情況是這樣的:WPF:如何避免圖像脫離畫布的邊界?

<Canvas Name="VisorCanvas" Height="514" Width="720"> 
    <Canvas.Background> 
    <ImageBrush /> 
    </Canvas.Background> 
    <Image Name="foreground" /> 
</Canvas> 

我在後面的代碼(C#)中動態插入圖像。

問題是,如果圖像太大,則圖像超出畫布的邊界。例如:我有一個不相關的背景圖像和我想要展示通過以下方式畫布面板(在其背景之上)內的廣場:

  • 在廣場上的圖像將被調整任何情況下。
  • 如果它小於畫布的尺寸,我只是展示它。
  • 如果它在任何尺寸(寬度或高度)上都更大,我需要將其裁剪或將透明設置爲圖像的一部分。這樣做,我實現了電視模式或類似的東西,因爲這個數字總是會在畫布的「內部」(儘管一部分被裁剪)

我該怎麼做?我試過了:

  • 通過使用CroppedBitmap裁剪圖像,但它不準確。
  • 要通過額外的opacityMask圖像使用透明度,但我需要從原始圖像創建一個遮罩位圖(具有透明度),我不知道該怎麼做。
  • 要使用RenderTargetBitmap創建「照片」並用此方法的結果替換圖像,但我不能。

我將不勝感激如果有人能夠闡明它。

回答

24

在您的Canvas元素中設置ClipToBounds="True",這樣會停止圖像超出畫布邊界。

您可能還想考慮不使用Image元素。您可以使用Rectangle,並將Fill設置爲ImageBrush,因爲您可以使用ViewboxViewport屬性來選擇所需的源圖像的哪一部分以及所需輸出的大小。 (設置ViewportUnitsAbsolute,以精確控制着色區域的尺寸。)

+0

ClipToBounds!修復了我遇到的一些Z訂單問題。 – 2015-09-24 02:42:10

+0

爲我工作。爲了澄清,應該在父對象上設置ClipToBounds。 – 2016-01-01 02:47:30

+0

@TylerPantuso by'parent'你的意思是'Canvas'嗎?如果是這樣,那就是我在第一句中所說的。如果不是,你是什麼意思?你是否發現你需要將它設置在畫布的父級?如果是這樣,這是不正常的。 – 2016-01-01 14:16:46