我使用手写笔输入在画布中绘制线条。我想用笔压改变笔画的颜色。所以我用过:
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;
但我发现只有当我抬起笔并将笔修饰到平板电脑表面时,颜色才会发生变化。我不知道如何解决这个问题。
非常感谢任何帮助。
答案 0 :(得分:2)
看看这个问题:InkCanvas Eraser
在MSDN中声明:
如果更改EraserShape,则在InkCanvas上渲染的光标为 直到下一个EditingMode更改才更新。
您正在经历的效果可能是由于当您将笔从画布上拉下并将其放回原位时更改了EditingMode。
如果是这样,您可以按照我在链接答案中的建议切换EditingMode属性。
修改强>
让look at this第三名下来说:
当然,生活从来没有那么简单,所以还有一个 处理的小问题。显然,InkCanvas使用不同的 最终结果的渲染器与笔画的比较 画。根据压力显示透明度 绘图动作仍在进行中,我们需要使用受保护的 名为DyamicRenderer的属性,用于获取/设置用于的对象 在笔划出现时在绘图上下文中渲染笔划 画。此呈现对象必须是DynamicRenderer的后代。 你需要做的就是覆盖OnDraw方法并更改 使用的刷子。为此属性分配新值时, InkCanvas实际上更改了一个被调用的内部“PlugIn列表” 每当使用手写笔输入数据时。
这可能是它。
答案 1 :(得分: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与函数共享范围,当然。否则,您需要将其与画布一起传入对象数组中。