如何更改InkCanvas的绘制方式?

时间:2010-02-14 01:09:51

标签: wpf xaml drawing inkcanvas

我已经搜索了这个例子,但是我遇到的那些似乎专注于更简单的东西,比如设置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;
}

我还可以看到画布包含线条笔划。

虽然在将笔画添加到集合中之后删除笔画远非理想,但它至少可以实现我想要的效果。我可以将线条颜色设置为与背景相同,但之后我将无法仅检索省略号。我也可以把它们复制到一个单独的收藏中,但那太糟糕了。

1 个答案:

答案 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)。