0

この例を検索しましたが、遭遇したものは、Width、Height、Color などの InkCanvas DefaultDrawingAttributes の設定など、より単純なものに焦点を当てているようです。これには多くの資料がないようです。

たとえば、マウス ボタンを押したままにすると、線が描画されます。線の代わりに楕円を描きたい場合、または線の始点と終点の間のサンプル ポイントの周りに楕円を描きたい場合はどうすればよいですか?

StrokeCollected イベントで新しいポイントを取得できることはわかっていますが、それ以上はどこに行けばよいかわかりません。この男は msdn のコードを動かしたように見えましたが、私にはできませんでした。私は XAML を使用してインターフェイスを構築する方法を知っているだけで、サンプルもないようです。

編集

thisIsNotNice という名前の StrokeCollection クラス変数を作成し、コンストラクターで初期化して、次のようにしました。

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
    myInkCanvas.Strokes = thisIsNotNice;

    foreach (StylusPoint p in e.Stroke.StylusPoints)
    {
        StylusPointCollection spc = new StylusPointCollection();
        spc.Add(p);
        Stroke s = new Stroke(spc);
        s.DrawingAttributes.Height = 3;
        s.DrawingAttributes.Width = 3;
        thisIsNotNice.Add(s);
     }
     e.Handled = true;
}

しかし、それはうまくいきません。楕円は描画されますが、マウスで描画された線はまだそこにあります。また、何らかの理由で、最初は楕円だけを描画して正常に動作しますが、その後は楕円と線の両方を描画します。しかし、代わりにこれを行うと:

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
     myInkCanvas.Strokes = new System.Windows.Ink.StrokeCollection();
     e.Handled = true;
}

線は画面に保持されません。したがって、上記のコードでそれらが消去されない理由がわかりません。

私がこれを行う場合:

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
    foreach (Stroke s in myInkCanvas.Strokes)
            System.Diagnostics.Trace.WriteLine(s);
    e.Handled = true;
}

また、キャンバスに線画が含まれていることもわかります。

コレクションに追加された後にストロークを消去することは理想とはほど遠いですが、少なくとも私が望むことはできます. 線の色を背景と同じにすることはできますが、楕円だけを取得することはできません。それらを別のコレクションにコピーすることもできますが、それはひどいものです。

4

1 に答える 1

1

inkCanvasでのストロークの表示方法をカスタマイズしたいようです。ここで考慮すべき2つの別々のことがあります:

1)インクが持ち上げられる前に、インクがペンから流れ出るときの外観(インクが常に高速であることを確認するために別のスレッドで実行されるDynamicRendererが責任を負います。これは、ソリューションに満足しているようです。すでにこれに。

2)キャンバスに座っている最終的なストロークの外観。これをカスタマイズするには、Strokeをサブクラス化して、オーバーライドしてみてください。protected override void DrawCore(DrawingContext drawingContext、DrawingAttributes drawingAttributes);

strokeCollectedを取得するたびに(そして、これはあなたが心配していたのと同じ恐ろしいことですが、そこに行きます)、キャンバスから入力ストロークを削除し、カスタム実装に置き換えて、入力ストロークからストロークデータを盗みます。

DrawCoreの実装は次のようになります(擬似コード):

foreach(sp in this.StylusPoints)
  drawingContext.DrawEllipse(RADIUS, sp.X, sp.Y)

また、通常発生する行を取得しないように、どの時点でもbase.DrawCore(context、attributes)を呼び出さないようにします。

于 2010-11-13T04:13:51.540 に答える