2017-11-07 51 views
0

選択した要素に境界ボックスをマークする単純なAdornerを作成します。私はそれが鋭く、ちょうどターゲットコンテンツの外に1ピクセルであることを望んでいます。便利なコードがいくつか見つかりましたが、私が望んだコードと正確には動作しません。WPFとGuidelineSetとのアラインメント

私SelectAdornerのOnRender方法は次のとおりです。

Rect adornedElementRect = new Rect(AdornedElement.DesiredSize); 

SolidColorBrush renderBrush = new SolidColorBrush(Colors.Transparent); 
Pen renderPen = new Pen(new SolidColorBrush(Colors.LightBlue), 1); 
double halfPenWidth = renderPen.Thickness/2; 

// Create a guidelines set 
GuidelineSet guidelines = new GuidelineSet(); 
guidelines.GuidelinesX.Add(adornedElementRect.Left + halfPenWidth); 
guidelines.GuidelinesX.Add(adornedElementRect.Right + halfPenWidth); 
guidelines.GuidelinesY.Add(adornedElementRect.Top + halfPenWidth); 
guidelines.GuidelinesY.Add(adornedElementRect.Bottom + halfPenWidth); 
drawingContext.PushGuidelineSet(guidelines); 

drawingContext.DrawRectangle(renderBrush, renderPen, adornedElementRect); 

問題は、(第2及び第3項を参照)バウンディングボックスは、コンテンツの周りに適切に配置されていないということです。私はその結果を下の写真の一番下の項目からのものにします。

enter image description here

任意のアイデアをどのように私は私が望むものを達成することができますか?

また、私が必要な場合は、renderPen.Thicknessが1より大きい場合と同じ方法でAdornerを動作させるといいでしょう。

ありがとうございます。

+0

なぜボーダー要素を使用してみませんか?実際の問題のレポを提供してください:https://stackoverflow.com/help/mcve – mm8

答えて

0

次のコードは、GuidelineSetを作成する前に追加する必要があります

adornedElementRect = new Rect(
    adornedElementRect.Left - halfPenWidth, 
    adornedElementRect.Top - halfPenWidth, 
    adornedElementRect.Width + renderPen.Thickness, 
    adornedElementRect.Height + renderPen.Thickness 
); 

問題は、ペンの太さを考慮した場合adornedElementRectがAdornedElementと重なるという事実から来ています。 AdornedElement.DesiredSizeの値は、境界の外側の辺に対応します。つまり、Adornerは境界線の半分と境界線の半分に描画されます。ガイドラインセットでは、水平エッジの右側と垂直エッジの下側をピクセル境界に揃えます(エッジは幅を持ちます)。これにより、図面が鮮明に見えますが、エッジは内側、またはAdornedElementの外側のいずれかに移動されます。これがアーティファクトを作り出すものです。

adornedElementRectに指定した変更を追加すると、AdornerのGuidelineSetとBorderコントロールで使用されるガイドラインが揃うAdornedElementの余白に正確に描画されます(ペンの幅を考慮)。 WPFがコンテンツを画面上に描画する方法の詳細については、linkを参照してください。

関連する問題