2010-02-14 28 views
0

我已经搜索了这个例子,但我跑过的人似乎专注于更简单的东西,如设置InkCanvas DefaultDrawingAttributes,如宽度,高度,颜色等。似乎没有很多的材料这个。如何更改InkCanvas的绘制方式?

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

我知道我可以通过StrokeCollected事件获得新的点,但除此之外,我不知道要去哪里。 This guy好像他有msdn的代码工作,但我做不到。我只知道如何使用XAML来构建界面,而且似乎也没有样例。

编辑

创建一个StrokeCollection中类变量称为thisIsNotNice,在构造函数初始化,这样做:

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

这听起来像你想定制笔画出现在你的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(背景下,属性)在任何一点的线。