1

我正在使用手写笔输入在画布中绘制线条。我想用笔压改变笔触的颜色。所以我用:

DrawingAttributes dattribute = new DrawingAttributes();
inkcan.EditingMode = InkCanvasEditingMode.Ink;

if (stylusInput.pressureFactor < 0.5)
dattribute.Color = Colors.Red;
else
dattribute.Color = Colors.Blue;

inkcan.DefaultDrawingAttributes = dattribute;

但我发现只有当我抬起笔并将笔修饰到数位板表面时,颜色才会发生变化。我不知道如何解决这个问题。

任何帮助将不胜感激。

4

2 回答 2

3

看这个问题:InkCanvas Eraser

在 MSDN 中它指出:

如果您更改 EraserShape,则在 InkCanvas 上呈现的光标不会更新,直到下一次 EditingMode 更改。

您遇到的效果可能是由于当您将笔从画布上拉下并放回时更改了 EditingMode。

如果是这样,您可以按照我在链接答案中的建议切换 EditingMode 属性。

编辑

看看第三下它说:

当然,生活从来没有这么简单,所以还有一个小问题需要处理。显然,与绘制笔画时相比,InkCanvas 为最终结果使用了不同的渲染器。为了在绘图动作仍在进行时根据压力显示透明度,我们需要使用名为 DynamicRenderer 的受保护属性,该属性获取/设置用于在绘制笔画时在绘图上下文中渲染笔画的对象。此渲染对象必须是 DynamicRenderer 的后代。您需要做的就是覆盖 OnDraw 方法并更改使用的画笔。当您为此属性分配一个新值时,InkCanvas 实际上会更改一个内部“插件列表”,每当使用触控笔输入数据时都会调用该列表。

这可能是它。

于 2011-08-03T15:54:30.973 回答
1

if 条件只计算一次,因此在绘制时没有理由改变颜色。不幸的是,似乎没有“onpressurechanged”事件,因此您可能必须设置一个循环,每 x 毫秒检查一次压力并相应地调整颜色。由于您不想冻结 UI,您需要在另一个线程中运行它并将颜色更改委托回 UI 线程,或者您可以将压力检查排队到具有“applicationIdle”优先级的窗口调度程序上。这看起来像:

void checkPressure(InkCanvas inkcan)
{
//return if touch is lifted code here

DrawingAttributes dattribute = new DrawingAttributes();
if (stylusInput.pressureFactor < 0.5)
dattribute.Color = Colors.Red;
else
dattribute.Color = Colors.Blue;
inkcan.DefaultDrawingAttributes = dattribute;
this.Dispatcher.BeginInvoke(new MyPressureDelegate(checkPressure), DispatcherPriority.ApplicationIdle, inkcan);
}

当然,假设您的 stylusInput 与该函数共享范围。否则,您需要将它与对象数组中的画布一起传递。

于 2011-08-03T15:53:52.823 回答