我正在玩分形作为私人项目来练习(离开初级水平^^)。我有一个包含图像的画布,该图像绑定到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>
我的viewmodel类目前看起来像这样:
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设置为Background
,其内部是WriteableBitmap
的黑色方块,并且在其中我更新了白色方块:
_renderbitmap
。但是,我希望它具有RenderImage
的大小,该大小绑定到BitmapWidth
和BitmapHeight
。但我显然不能使用它们,因为它们不是静态的 - 如果我将它们设置为静态,我可以使用它们,但它们在实例化期间仍然具有值0。答案 0 :(得分:2)
红色边框的原因是验证错误,这是由于非工作Bindings
造成的Width="{Binding Path=BitmapWidth, Mode=OneWayToSource}"
和
Height="{Binding Path=BitmapHeight, Mode=OneWayToSource}"
这些绑定产生错误,因为Width
和Height
属性的值在double.NaN
未明确设置时为0 .. 1
。
你根本不应该有这些绑定。不要让视图模型知道图像的渲染大小,最好将逻辑坐标(例如在区间delayElements
中)传递给视图模型。