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消しゴム

MSDNには、次のように記載されています。

EraserShapeを変更すると、InkCanvasにレンダリングされたカーソルは、次のEditingModeが変更されるまで更新されません。

発生している効果は、ペンをキャンバスから引き離して元に戻すときに、EditingModeが変更されたことが原因である可能性があります。

もしそうなら、私がリンクされた答えで提案したように、EditingModeプロパティを切り替えることができます。

編集

これを3番目に見てください

もちろん、人生はそれほど単純ではないので、対処すべきもう1つの小さな問題があります。どうやら、InkCanvasは、ストロークが描画されている間と比較して、最終結果に異なるレンダラーを使用します。描画アクションの進行中に圧力に基づいて透明度を表示するには、DyamicRendererと呼ばれる保護されたプロパティを使用する必要があります。このプロパティは、ストロークの描画中に描画コンテキストでストロークをレンダリングするために使用されるオブジェクトを取得/設定します。このレンダリングオブジェクトは、DynamicRendererの子孫である必要があります。ここで行う必要があるのは、OnDrawメソッドをオーバーライドし、使用するブラシを変更することだけです。このプロパティに新しい値を割り当てると、InkCanvasは、スタイラスを使用してデータが入力されるたびに呼び出される内部の「プラグインリスト」を実際に変更します。

これかもしれません。

于 2011-08-03T15:54:30.973 に答える
1

if 条件は 1 回だけ評価されるため、描画中に色が変わる理由はありません。残念ながら、「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 に答える