代码之家  ›  专栏  ›  技术社区  ›  zxcvbnm

如何改变InkCanvas的绘图方式?

  •  0
  • zxcvbnm  · 技术社区  · 16 年前

    我已经搜索了一些例子,但是我遇到的那些例子似乎只关注一些简单的东西,比如设置InkCanvas默认的Drawing属性,比如宽度、高度、颜色等,似乎没有太多的素材。

    例如,如果我按住鼠标键,我可以看到它在画线。如果我想画椭圆而不是直线,或者在直线的起点和终点之间的采样点周围画椭圆呢?

    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 回复  |  直到 9 年前
        1
  •  1
  •   Chris Hagan    15 年前

    听起来你想自定义笔划在inkCanvas上的显示方式。这里需要考虑两个不同的问题:

    2) 在画布上的最终笔触看起来。要对此进行自定义,可以尝试将笔划子类化,覆盖: 受保护重写void DrawCore(DrawingContext DrawingContext,DrawingAttributes DrawingAttributes);

    每次你得到一个笔划收集(这里是同样可怕的事情,你担心,但你去),你从画布上删除传入笔划,并取代它与您的自定义实现,窃取了来自传入的笔划数据。

    DrawCore的实现类似于(伪代码):

    foreach(sp in this.StylusPoints)
      drawingContext.DrawEllipse(RADIUS, sp.X, sp.Y)
    

    为了避免接到通常情况下你不会打电话的电话底座.抽芯(上下文、属性)。