WPF InkCanvas:使用DynamicRenderer绘制线条
本文关键字:绘制 DynamicRenderer 使用 InkCanvas WPF | 更新日期: 2023-09-27 18:22:39
我正在使用InkCanvas在WPF中编写基本的图形编辑器。我制作了一些自定义形状(继承自Stroke)。当我在InkCanvas上画线条时,我取第一点和最后一点,画一条线。这很好,但现在我不喜欢默认的"笔划",所以我决定重写DynamicRenderer以实时渲染线条。
问题是,DynamicRenderer从原点到笔划的每个点都画一条线,我显然不希望这样,因为它会让"扇形"代替线。
这是我的自定义代码,如果可能的话,我正在寻找只从原点到最后一点画线的解决方案。
class LineRenderer : DynamicRenderer
{
private Point firstPoint;
private Pen pen = new Pen(new SolidColorBrush(Colors.Gray),1);
public LineRenderer()
{
firstPoint = new Point(double.PositiveInfinity, double.PositiveInfinity);
}
protected override void OnStylusDown(RawStylusInput rawStylusInput)
{
firstPoint = new Point(rawStylusInput.GetStylusPoints().First().ToPoint().X, rawStylusInput.GetStylusPoints().First().ToPoint().Y);
base.OnStylusDown(rawStylusInput);
}
protected override void OnDraw(DrawingContext drawingContext,
StylusPointCollection stylusPoints,
Geometry geometry, Brush fillBrush)
{
drawingContext.DrawLine(pen, firstPoint, stylusPoints.First().ToPoint());
}
protected override void OnStylusUp(RawStylusInput rawStylusInput)
{
firstPoint = new Point(double.PositiveInfinity, double.PositiveInfinity);
base.OnStylusUp(rawStylusInput);
}
}
这太晚了。为了避免在绘制笔划时出现"扇形",请尝试以下操作:
protected override void OnDraw(DrawingContext drawingContext,
StylusPointCollection stylusPoints,
Geometry geometry, Brush fillBrush)
{
if (!_isManipulating)
{
_isManipulating = true;
StylusDevice currentStylus = Stylus.CurrentStylusDevice;
this.Reset(currentStylus, stylusPoints);
}
_isManipulating = false;
var pen = new Pen(brush, 2);
drawingContext.DrawLine(pen, startPoint,stylusPoints.First().ToPoint());
}
protected override void OnStylusDown(RawStylusInput rawStylusInput)
{
StylusPointCollection y = rawStylusInput.GetStylusPoints();
startPoint = (Point)y.First();
// Allocate memory to store the previous point to draw from.
prevPoint = new Point(double.NegativeInfinity, double.NegativeInfinity);
base.OnStylusDown(rawStylusInput);
}
这里的技巧是使用DynamicRenderer.Reset,它:
清除当前笔划上的渲染并重新绘制。
重绘将重新进入OnDraw方法,因此_isManipulating提供了一个简单的标志来停止循环。
我认为在你的ondraw函数中,你的第一个点是固定的,所以它总是以它为原点,所以你可以尝试连续绘制。
protected override void OnDraw(DrawingContext drawingContext,
StylusPointCollection stylusPoints,
Geometry geometry, Brush fillBrush)
{
drawingContext.DrawLine(pen, firstPoint, stylusPoints.First().ToPoint());
firstPoint = stylusPoints.First().ToPoint();
}
如果你得到相同的点异常,它会更新你的第一个点。检查一下(或者你可以将新的点名称定义为前一个点,最初使其等于第一个点,并在你的ondraw方法中保持更新,就像我对第一个点所做的那样。
如果你想要从第一点到最后一点的直线,你可以在从onstylup方法得到最后一点后,在draw方法上调用你。。希望这能对你有所帮助。。