我已经搜索了这个例子,但是我遇到的那些似乎专注于更简单的东西,比如设置InkCanvas DefaultDrawingAttributes,如Width,Height,Color等。似乎没有很多材料对此。
例如,如果我按住鼠标按钮,我可以看到它画线。如果我想绘制椭圆而不是线条,或者在线条的起点和终点之间的采样点周围绘制椭圆,该怎么办?
我知道我可以通过StrokeCollected活动获得新的积分,但除此之外我不知道该去哪里。 This guy似乎他得到了msdn的代码,但我无法做到。我只知道如何使用XAML构建接口,似乎也没有样本。
修改
创建一个名为thisIsNotNice的StrokeCollection类变量,在构造函数中初始化并执行此操作:
private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
myInkCanvas.Strokes = thisIsNotNice;
foreach (StylusPoint p in e.Stroke.StylusPoints)
{
StylusPointCollection spc = new StylusPointCollection();
spc.Add(p);
Stroke s = new Stroke(spc);
s.DrawingAttributes.Height = 3;
s.DrawingAttributes.Width = 3;
thisIsNotNice.Add(s);
}
e.Handled = true;
}
但它不能正常工作。绘制椭圆,但鼠标绘制的线仍然存在。此外,由于某种原因,第一次它应该工作,只绘制椭圆,但之后它绘制椭圆和线。但是,如果我这样做:
private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
myInkCanvas.Strokes = new System.Windows.Ink.StrokeCollection();
e.Handled = true;
}
线条未保留在屏幕上。所以,我不明白为什么他们没有在上面的代码中被删除。
如果我这样做:
private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
foreach (Stroke s in myInkCanvas.Strokes)
System.Diagnostics.Trace.WriteLine(s);
e.Handled = true;
}
我还可以看到画布包含线条笔划。
虽然在将笔画添加到集合中之后删除笔画远非理想,但它至少可以实现我想要的效果。我可以将线条颜色设置为与背景相同,但之后我将无法仅检索省略号。我也可以把它们复制到一个单独的收藏中,但那太糟糕了。
答案 0 :(得分:1)
听起来您想要自定义笔画在inkCanvas上的显示方式。这里有两个不同的事情需要考虑:
1)当墨水从笔中移开之前,它们看起来的样子(DynamicRenderer,在另一个线程上运行,以确保墨水总是快速的),这是对此负责。听起来你很开心已经解决了这个问题。
2)坐在画布上的最终笔画的样子。要自定义它,您可以尝试子类化Stroke,覆盖: protected override void DrawCore(DrawingContext drawingContext,DrawingAttributes drawingAttributes);
每次你收到一个strokeCollected(这里有你担心的那个可怕的东西,但是你去了),你从画布中删除了传入的笔划并用你的自定义实现替换它,从传入的一个中删除笔划数据
您对DrawCore的实现看起来像(伪代码):
foreach(sp in this.StylusPoints)
drawingContext.DrawEllipse(RADIUS, sp.X, sp.Y)
为了不获取通常发生的行,你不会在任何时候调用base.DrawCore(context,attributes)。