c# - WriteableBitmap 周围出现不需要的红色边框

标签 c# wpf writeablebitmap

我正在把分形作为一个私有(private)项目来练习(离开初学者水平^^)。我有一个 Canvas ,其中包含一个图像,该图像绑定(bind)到 WriteableBitmap:

<Canvas Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="1" Grid.RowSpan="1" Name="RenderCanvas" Background="LightCyan">
  <Image Name="RenderImage" Source="{Binding Path=RenderBitmap}" Stretch="Fill" Height="{Binding Path=BitmapHeight, Mode=OneWayToSource}" Width="{Binding Path=BitmapWidth, Mode=OneWayToSource}"/>
</Canvas>

我的 View 模型类当前如下所示:

public class MainViewModel : ViewModelBase  
{
  #region private fields
  private int _bitmapheight;
  private int _bitmapwidth;
  private WriteableBitmap _renderbitmap = new WriteableBitmap(500, 500, 96, 96, PixelFormats.Bgr32, null);
  #endregion

  #region public properties
  public int BitmapHeight
  {
  get { return _bitmapheight; }
  set { SetProperty<int>(ref _bitmapheight, value); }
  }
  public int BitmapWidth
  {
    get { return _bitmapwidth; }
    set { SetProperty<int>(ref _bitmapwidth, value); }
  }
  public WriteableBitmap RenderBitmap
  {
    get { return _renderbitmap; }
    set { SetProperty<WriteableBitmap>(ref _renderbitmap, value); }
  }
  #endregion

  #region Constructors
  public MainViewModel ()
  {
  }
  #endregion

  #region public Methods
  public void updateRenderBitmap(int size, int destX, int destY)
  {
    Int32Rect rect = new Int32Rect(0, 0, size, size);
    byte[] sourcebuffer = new byte[size * size * 4];
    for(int currentbyte = 0; currentbyte < sourcebuffer.Length;   currentbyte++)
    {
      sourcebuffer[currentbyte] = 255;
    }
    int stride = size * 4;
    _renderbitmap.WritePixels(rect, sourcebuffer, stride, destX, destY);
  }
  #endregion
}

因此,为了测试到目前为止一切是否正常,我从 MainWindow.xaml.cs 调用了更新方法:

  public MainWindow()
  {
    InitializeComponent();
    MainViewModel vm = (MainViewModel)this.DataContext;
    vm.updateRenderBitmap(250, 125, 125);
  }

事实证明,一切都按预期进行,我的 Canvas 设置了背景,其中有一个来自WriteableBitmap的黑色方 block ,其中有一个白色方 block 我更新了:

Screenshot 但是,到目前为止我有两个问题:

  1. 如您所见,图像周围有红色边框。我真的不知道它从哪里来,但我想删除它。
  2. 目前,我使用固定的设置编号初始化 _renderbitmap。但是,我希望它具有 RenderImage 的大小,该大小绑定(bind)到 BitmapWidthBitmapHeight。但我显然不能使用它们,因为它们不是静态的 - 如果我将它们设为静态,我可以使用它们,但它们在实例化期间仍然具有值 0。

最佳答案

红色边框的原因是验证错误,由无效的绑定(bind)导致

Width="{Binding Path=BitmapWidth, Mode=OneWayToSource}"

Height="{Binding Path=BitmapHeight, Mode=OneWayToSource}" 

这些绑定(bind)会产生错误,因为如果未显式设置,WidthHeight 属性的值为 double.NaN

您根本不应该拥有这些绑定(bind)。与其让 View 模型了解图像的渲染大小,不如将逻辑坐标(例如在 0 .. 1 区间内)传递给 View 模型。

关于c# - WriteableBitmap 周围出现不需要的红色边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50211091/

相关文章:

c# asp.net mvc5,在c# dll中嵌入js

c# - 使用最小起订量多次调用相同的方法并获得不同的返回

c# - 如何使用其 CanExecute 方法启用按钮

.net - 如何在 WPF DataGrid 中显示数组元素?

winrt-xaml - 为什么我的图像有时会在恢复时重新加载(并且 WriteableBitmap 消失)?

c# - 使用 iTextSharp 禁用扩展功能

c# - 通过引用传递 c# 结构?

c# - 我对 MVVM 模式有一些疑问

c# - Alpha channel 无法按预期使用 WriteableBitmap

c# - WPF WriteableBitmap 到字节数组