2014-04-09 105 views
0

我有一個簡單的網格顯示圖像的一部分。WPF圖像裁剪和綁定

<Grid x:Name="back_side" Margin="-1" RenderTransformOrigin="0.5,0.5" RenderTransform="{Binding ScaleTransformBack}" Width="Auto"> 
     <Image Source="/NameSpace;component/Resources/image.jpg" Stretch="Fill"> 
      <Image.Clip> 
       <RectangleGeometry Rect="{Binding RectGeo}"/> 
      </Image.Clip> 
     </Image> 
    </Grid> 

我已經嘗試直接綁定到代碼後面的RectangleGeometry以及。剪輯似乎不想工作。有什麼建議麼?任何人都有將剪輯綁定到圖像的經驗嗎?

我需要能夠以編程方式在多個控件中分割特定圖像。將剪輯用作要顯示的每個控件的計算部分。

回答

4

如果你想顯示圖像的只有一部分,你可以使用CroppedBitmapImage.Source

<Image> 
    <Image.Source> 
     <CroppedBitmap Source="/NameSpace;component/Resources/image.jpg" SourceRect="{Binding RectGeo}"/> 
    </Image.Source> 
</Image> 

可以綁定CroppedBitmap.SourceRect但你需要確保RectGeoInt32Rect

編輯

不幸的是,如果你打算在運行時改變SourceRect這將不會w掃爲:

初始化後,屬性的更改都將被忽略

所以你可以做的是創建自定義IValueConverter,這將創造CropperBitmap

public class CropBitmapConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return new CroppedBitmap(new BitmapImage(new Uri((string)parameter, UriKind.RelativeOrAbsolute)), (Int32Rect)value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

,並與您的結合使用:

<Image ... Source="{Binding Path=RectGeo, Converter={StaticResource CropBitmapConverter}, ConverterParameter='pack://application:,,,/NameSpace;component/Resources/image.jpg'}" /> 
+0

謝謝,使用CroppedBitmap但是,只有在InitializeComponent()之前手動設置RectangleGeometry時才起作用。 – JordanTDN

+0

之後改變RectangleGeometry時不起作用。 – JordanTDN

+0

當矩形尺寸發生變化時,您是否爲'RectGeo'提升'INotifyPropertyChanged.PropertyChanged'事件? – dkozl