2017-02-11 76 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 –