0

インクプレゼンターを使用して、新しいストロークが前のストロークの上に置かれるようにして、暗い効果を作成したいと考えています。

毎回新しいインクプレゼンターを作成してキャンバスに追加しようとしましたが、マウスを放した後にのみ不透明効果が表示されます。描いているところをすぐに見せてほしい。インクプレゼンターをターゲット要素のコンテンツに直接設定すると (ブレンドなし)、描画時にストロークが不透明になります。

4

1 に答える 1

0

アプリケーションで現在 InkPresenter をどのように処理しているかを示すコードを投稿していません。WPf で簡単なテスト プログラムを作成しましたが、不透明度で正しく動作するようです。

InkPresenterコントロールを xamlに配置し、PreviewMouseDownメソッドのハンドラーをコード ビハインドに追加しました。これらのイベントを処理するために使用したコードは次のようになります。PreviewMouseMovePreviewMouseUp

System.Windows.Ink.Stroke newStroke = null;

    private void inkPresenterSample_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        inkPresenterSample.CaptureMouse();

        //get mouse position and add first point to a new line to be drawn
        var mousePosition = e.GetPosition(inkPresenterSample);
        var stylusStartPoint = new StylusPointCollection();
        stylusStartPoint.Add(new StylusPoint(mousePosition.X, mousePosition.Y));

        //set line's attributes, it real application this should be probably done outside this method
        var drawingAttributes = new System.Windows.Ink.DrawingAttributes();
        //IMPORTANT: semi-transparent color is used, so the opacity effect is visible
        drawingAttributes.Color = System.Windows.Media.Color.FromArgb(110, 0, 0, 0);
        drawingAttributes.Width = 10;

        //create a new stroke to be drawn
        newStroke = new System.Windows.Ink.Stroke(stylusStartPoint, drawingAttributes);
        newStroke.StylusPoints.Add(new StylusPoint(mousePosition.X, mousePosition.Y));

        //add reference to a new stroke to the InkPresenter control
        inkPresenterSample.Strokes.Add(newStroke);
    }

    private void inkPresenterSample_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        inkPresenterSample.ReleaseMouseCapture();

        if (newStroke != null)
        {
            newStroke = null;
        }
    }

    private void inkPresenterSample_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        //if a stroke is currently drawn in the InkPresenter
        if (newStroke != null)
        {
            //add a new point to the stroke
            var mousePosition = e.GetPosition(inkPresenterSample);
            newStroke.StylusPoints.Add(new StylusPoint(mousePosition.X, mousePosition.Y));
        }
    }

あなたが説明したように機能しているようで、重なっている線の暗い部分を見ることができます。

アップデート

提案された解決策のオーバーラップ効果は、複数のオーバーラップ ラインに対して機能しますが、1 つのラインがオーバーラップしている場合は機能しません。この場合も機能させたい場合は、次のことを試すことができます。

  • その上に要素を使用Canvasして追加します(更新:これは最初に提案されたソリューションのように機能するように見えるため、1行の重複は不透明効果を与えません)Polyline
  • Imageここで説明されている要素を使用して描画する方法を見てくださいDrawingContext。役立つ場合があります
于 2012-05-30T19:23:40.783 に答える