WPF绑定图像宽度和高度与依赖属性

时间:2016-05-19 15:16:59

标签: c# wpf

我有一个WPF .xaml文件,其中包含一个图像框架元素,该元素绑定到我的C#代码中的BitmapSource。目前,我正在对我的位图(即512px)的图像宽度和高度进行硬编码,并且我已经指定了框架元素不会拉伸图像。因此,如果我的窗口大于位图,则图像似乎浮动在窗口的边界内。但是,我喜欢的是位图宽度和高度自动绑定到.xaml窗口的宽度和高度。因此,当我调整窗口大小时,位图会随之重新调整大小。我不希望图像被拉伸......而是,我希望位图的宽度和高度与包含它的窗口相匹配。我不完全确定如何做到这一点,但我会发布到目前为止的设置。

在我的.xaml文件中,我有我的Image框架元素(注意:渲染转换只是沿着水平轴翻转图像):

<Image Source="{Binding WpfPreview}" Name="VectorPreview" Stretch="None" Width="{Binding Xres}" Height="{Binding Yres}" RenderTransformOrigin="0.5,0.5">
    <Image.RenderTransform>
        <ScaleTransform ScaleY="-1"/>
    </Image.RenderTransform>
</Image>

我的C#代码中包含以下代码:

protected BitmapSource wpfPreview;
public BitmapSource WpfPreview
{
    get { return wpfPreview; }
    set
    {
        wpfPreview = value;
        NotifyPropertyChanged("WpfPreview");
    }
}

protected static int xres = 512;
public int Xres
{
    get { return xres; }
    set
    {
        xres = value;
        NotifyPropertyChanged("Xres");
        UpdateBitmapPreview();
    }
}

protected static int yres = 512;
public int Yres
{
    get { return yres; }
    set
    {
       yres = value;
       NotifyPropertyChanged("Yres");
       UpdateBitmapPreview();
    }
}

protected GDI.Bitmap gdiPreviewImage = new GDI.Bitmap(xres, yres);

public void UpdateBitmapPreview()
{
    if(gdiPreviewImage.Width != xres || gdiPreviewImage.Height != yres) gdiPreviewSurface = new GDI.Bitmap(xres, yres);
    using (var graphics = GDI.Graphics.FromImage(gdiPreviewImage))
    {
        graphics.Clear(Color.White);
        graphics.ResetTransform();

        currentSlicer.DrawBitmapPreview(graphics, PreviewOptions);
     }

     WpfPreview = Imaging.CreateBitmapSourceFromHBitmap(
            gdiPreviewImage.GetHbitmap(), 
            IntPtr.Zero, 
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions()
            );
}

2 个答案:

答案 0 :(得分:0)

你基本上想在调整大小时保持纵横比吗?我认为这些属性可以解决这个问题。将 ClipToBounds设为true,将 Stretch设为Uniform

<Image Stretch="Uniform" ...

答案 1 :(得分:-1)

  

然而,我喜欢的是位图宽度和高度自动绑定到.xaml窗口的宽度和高度。

所以,此时将宽度和高度直接绑定到窗口的宽度和高度是不是更简单?

<Image Source="{Binding WpfPreview}"
       Stretch="None" 
       Width="{Binding Width, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
       Height="{Binding Height, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />