gpt4 book ai didi

c# - WPF InkCanvas : Draw line with DynamicRenderer

转载 作者:太空宇宙 更新时间:2023-11-03 16:10:27 27 4
gpt4 key购买 nike

我正在使用 InkCanvas 在 WPF 中编写基本图形编辑器。我制作了一些自定义形状(继承自 Stroke)。当我在 InkCanvas 上画线时,我会取第一个点和最后一个点并画一条线。这很好用,但现在我不喜欢默认的“笔划”,所以我决定重写 DynamicRenderer 以实时渲染线条。

问题是,DynamicRenderer 从原点到笔划的每个点画线,我显然不希望那样,因为它使 "fan"代替线路。

有我的自定义代码,如果可能的话,我正在寻找从原点到最后一点画线的解决方案。

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 ,其中:

Clears rendering on the current stroke and redraws it.

重绘将重新进入 OnDraw 方法,因此 _isManipulating 提供了一个简单的标志来停止循环。

关于c# - WPF InkCanvas : Draw line with DynamicRenderer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17676185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com