动态改变笔画颜色

本文关键字:颜色 笔画 改变 动态 | 更新日期: 2023-09-27 18:04:36

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

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;

,但我发现只有当我拿起并重新触摸笔到平板电脑表面时,颜色才会改变。我不知道如何解决这个问题。

动态改变笔画颜色

看这个问题:InkCanvas橡皮擦

在MSDN中它声明:

如果您更改了橡皮擦形状,则在InkCanvas上呈现的光标为在下次编辑模式更改之前不会更新。

你所经历的效果可能是由于当你把笔从画布上拉下来并把它放回去时,EditingMode被改变了。

如果是,你可以切换EditingMode属性,我在链接的答案中建议。

编辑

看一下这个,第三下写着:

当然,生活从来没有那么简单,所以还有一个小问题要处理。显然,InkCanvas使用的是不同的将渲染器的最终结果与笔画进行比较画。以显示透明度为基础的压力,而绘图动作还在进行中,我们需要使用保护属性DyamicRenderer,它获取/设置用于的对象在绘图上下文中渲染笔画画。这个渲染对象必须是DynamicRenderer的后代。你需要做的就是重写OnDraw方法并改变使用的刷子。将新值赋给此属性时InkCanvas实际上改变了一个内部的'PlugIn list'当使用触控笔输入数据时

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与函数共享作用域。否则,您需要将其与画布一起传递到对象数组中。