C# 动态更改笔划颜色

C# 动态更改笔划颜色,c#,drawing,stylus-pen,C#,Drawing,Stylus Pen,我正在使用手写笔输入在画布上绘制线条。我想用笔压改变笔画的颜色。所以我用了: DrawingAttributes dattribute = new DrawingAttributes(); inkcan.EditingMode = InkCanvasEditingMode.Ink; if (stylusInput.pressureFactor < 0.5) dattribute.Color = Colors.Red; else dattribute.Color = Colors.Blue

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

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;
DrawingAttributes dattribute=新的DrawingAttributes();
inkcan.EditingMode=InkCanvasEditingMode.Ink;
如果(stylusInput.pressureFactor<0.5)
dattribute.Color=Colors.Red;
其他的
dattribute.Color=Colors.Blue;
inkcan.DefaultDrawingAttribute=DatAttribute;
但我发现,只有当我把笔取下并重新触摸到平板电脑表面时,颜色才会改变。我不知道如何解决这个问题


任何帮助都将不胜感激。

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);
}
void checkPressure(墨水罐)
{
//如果触摸被解除,则返回此代码
DrawingAttributes DatAttribute=新DrawingAttributes();
如果(stylusInput.pressureFactor<0.5)
dattribute.Color=Colors.Red;
其他的
dattribute.Color=Colors.Blue;
inkcan.DefaultDrawingAttribute=DatAttribute;
this.Dispatcher.BeginInvoke(新的MyPressureDelegate(checkPressure)、DispatcherPriority.ApplicationIdle、inkcan);
}

当然,假设stylusInput与函数共享作用域。否则,您需要将其与画布一起传递到对象数组中。

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);
}
void checkPressure(墨水罐)
{
//如果触摸被解除,则返回此代码
DrawingAttributes DatAttribute=新DrawingAttributes();
如果(stylusInput.pressureFactor<0.5)
dattribute.Color=Colors.Red;
其他的
dattribute.Color=Colors.Blue;
inkcan.DefaultDrawingAttribute=DatAttribute;
this.Dispatcher.BeginInvoke(新的MyPressureDelegate(checkPressure)、DispatcherPriority.ApplicationIdle、inkcan);
}
当然,假设stylusInput与函数共享作用域。否则,您需要将其与画布一起传递到对象数组中。

看看这个问题:

MSDN中指出:

如果更改橡皮擦形状,则在InkCanvas上渲染的光标将被删除 在下一次编辑模式更改之前未更新

您正在体验的效果可能是由于您将笔从画布上拔下并放回原处时编辑模式发生了更改

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

编辑

第三个字母写着:

当然,生活从来没有这么简单,所以还有一个 没什么问题要处理。显然,InkCanvas使用不同的 最终结果的渲染器,与正在执行笔划时的渲染器进行比较 绘制。显示基于压力的透明度,同时 绘图操作仍在进行中,我们需要使用受保护的 属性,该属性获取/设置用于 在绘制笔划时在图形上下文中渲染笔划 绘制。此渲染对象必须是DynamicRenderer的后代。 这里需要做的就是重写OnDraw方法并更改 使用的刷子。将新值指定给此属性时 InkCanvas实际上更改了一个名为 无论何时使用手写笔输入数据

可能就是这样。

看看这个问题:

MSDN中指出:

如果更改橡皮擦形状,则在InkCanvas上渲染的光标将被删除 在下一次编辑模式更改之前未更新

您正在体验的效果可能是由于您将笔从画布上拔下并放回原处时编辑模式发生了更改

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

编辑

第三个字母写着:

当然,生活从来没有这么简单,所以还有一个 没什么问题要处理。显然,InkCanvas使用不同的 最终结果的渲染器,与正在执行笔划时的渲染器进行比较 绘制。显示基于压力的透明度,同时 绘图操作仍在进行中,我们需要使用受保护的 属性,该属性获取/设置用于 在绘制笔划时在图形上下文中渲染笔划 绘制。此渲染对象必须是DynamicRenderer的后代。 这里需要做的就是重写OnDraw方法并更改 使用的刷子。将新值指定给此属性时 InkCanvas实际上更改了一个名为 无论何时使用手写笔输入数据


可能就是这样。

条件在哪种方法中?我在keyup Event中添加了这些代码,为什么不将其放在key down中?我刚刚尝试了key down,但is也有同样的问题。只有当我把笔拿开,重新放进平板电脑时,颜色才会改变。它不会随压力而动态变化。条件采用什么方法?我在keyup Event中添加这些代码,为什么不将其放入key down中?我只是尝试了key down,但是