インクプレゼンターを使用して、新しいストロークが前のストロークの上に置かれるようにして、暗い効果を作成したいと考えています。
毎回新しいインクプレゼンターを作成してキャンバスに追加しようとしましたが、マウスを放した後にのみ不透明効果が表示されます。描いているところをすぐに見せてほしい。インクプレゼンターをターゲット要素のコンテンツに直接設定すると (ブレンドなし)、描画時にストロークが不透明になります。
アプリケーションで現在 InkPresenter をどのように処理しているかを示すコードを投稿していません。WPf で簡単なテスト プログラムを作成しましたが、不透明度で正しく動作するようです。
InkPresenter
コントロールを xamlに配置し、PreviewMouseDown
メソッドのハンドラーをコード ビハインドに追加しました。これらのイベントを処理するために使用したコードは次のようになります。PreviewMouseMove
PreviewMouseUp
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
。役立つ場合があります。