2017-02-11 95 views
-1

我想在網格上設置圖像。 我用2種方法來做到這一點:WPF綁定圖像不工作

1)使用圖像源:

<Image Source="{Binding MonitoringVM.ImgPath}" 
      Width="1600" Height="1600" /> 

當我做這種方式,圖像獲取顯示。但它只有在寬度/高度爲500時纔有效。當我設置2000時,我只能看到圖像的一小塊。我期望它放大圖像,並只顯示與包含圖像組件的網格大小相對應的部分,但它不起作用。

2)對於這種方法我覆蓋帆布:

public class ImageCanvas : Canvas 
    { 
     public ImageSource CanvasImageSource 
     { 
      get { return (ImageSource)GetValue(CanvasImageSourceProperty); } 
      set { SetValue(CanvasImageSourceProperty, value); } 
     } 

     public static readonly DependencyProperty CanvasImageSourceProperty = 
      DependencyProperty.Register("CanvasImageSource", typeof(ImageSource), 
      typeof(ImageCanvas), new FrameworkPropertyMetadata(default(ImageSource))); 

     protected override void OnRender(System.Windows.Media.DrawingContext dc) 
     { 
      dc.DrawImage(CanvasImageSource, new Rect(this.RenderSize)); 
      base.OnRender(dc); 
     } 
    } 

但 我工作正常(包括大小操作),只有當我靜態指定的路徑:

<helper:ImageCanvas CanvasImageSource="/Images/img1.png" 
          Width="500" Height="500" > 
</helper:ImageCanvas> 

如果我更換它不顯示任何東西:

<helper:ImageCanvas CanvasImageSource="{Binding MonitoringVM.ImgPath}" 
          Width="500" Height="500" > 
</helper:ImageCanvas> 

ViewModel是:ImgPath = @「/ Images/img1.jpg」;

+1

你不需要那麼ImageCanvas。網格(和其他一些面板)已經適當地調整了Image控件的大小。只是不要給它一個固定的大小。你現在擁有的東西沒有多大意義。 – Clemens

+0

除此之外,'img1.jpg'確實是一個方形的圖像?如果沒有,你可以將Image控件的'Stretch'屬性設置爲'UniformToFill'或'Fill',而不是默認的'Uniform'。 – Clemens

+0

用綁定的'CanvasImageSource'測試了你的ImageCanvas。當'/ Images/img1.jpg'實際上是一個有效的資源或內容文件路徑時可以正常工作。 CanvasImageSource屬性應該具有與Image的Source屬性不同的綁定行爲。 – Clemens

回答

0

ImageCanvas是冗餘的,因爲它的行爲類似於Image控件,其中Stretch設置爲Fill

所以才這樣寫:

<Image Source="{Binding MonitoringVM.ImgPath}" Stretch="Fill" Width="500" Height="500" /> 
+0

我不能使用這個,因爲這會使500x500的圖像。我需要的是像5000x5000那樣放大圖像,但同時我只想顯示500x500這張放大圖像。 –

+0

然後根據需要設置大小。使用Stretch =填充圖像控件的行爲*完全像*您的ImageCanvas。 – Clemens

+0

對不起,請忽略我以前的評論。我錯了,它不是固定的。我仍然無法放大圖像5000x5000並只顯示一小部分,例如400x400 –