0

我已经搜索了这方面的示例,但我遇到的那些似乎专注于更简单的东西,比如设置 InkCanvas DefaultDrawingAttributes,如宽度、高度、颜色等。似乎没有很多材料。

例如,如果我按住鼠标按钮,我可以看到它画线。如果我想绘制椭圆而不是线条,或者在线条起点和终点之间的采样点周围绘制椭圆怎么办?

我知道我可以通过 StrokeCollected 活动获得新积分,但除此之外我不知道该去哪里。这家伙似乎让 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;
}

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

虽然在将笔画添加到集合后擦除笔画远非理想,但它至少可以满足我的要求。我可以将线条颜色设置为与背景相同,但是我将无法仅检索椭圆。我也可以将它们复制到单独的集合中,但这太糟糕了。

4

1 回答 1

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

于 2010-11-13T04:13:51.540 回答