私が扱っているビジュアルオブジェクトが実際にユーザーに視覚的に見えるかどうかを判断する必要があるという問題に直面しています。
私が試したこと(組み合わせたもの)ですが、私のアプローチはまだ完全には機能していません。
1) Object.IsVisible が false の場合、ユーザーはオブジェクトを見ることができません
2) 変換できない場合、表示されません:
Rect bounds = AssociatedObject.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, AssociatedObject.ActualWidth, AssociatedObject.ActualHeight));
Rect rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight);
if (!rect.Contains(bounds.TopLeft) || !rect.Contains(bounds.BottomRight))
return;
これです。ただし、私がしたいことの1つのケースを処理しません:
次のようなものがあるとします。
<Grid>
<Grid Background="Purple" />
<Grid Background="Green" />
</Grid>
私の「ユーザーに視覚的に見える」アルゴリズムは、はい、「紫色」のグリッドが表示されていることを示しています。これは正しいですが、私には合いません。
私は最終的に理想的に動作するものを手作りしましたが、そうではありません. それは正しいことをしません。
//last check !!
var positionTransform = AssociatedObject.TransformToAncestor(container);
var areaPosition = positionTransform.Transform(new Point(0, 0));
bool dontcreate = false;
VisualTreeHelper.HitTest(AssociatedObject, null, new HitTestResultCallback(
delegate(HitTestResult result)
{
FrameworkElement xs = result.VisualHit as FrameworkElement;
if (xs != null)
{
FrameworkElement cv = VisualHelper.FindChild<FrameworkElement>(AssociatedObject, xs.Name);
if (cv == null)
{
if (_customPopup != null)
{
ReleasePopupIfNeeded();
dontcreate = true;
}
}
}
return HitTestResultBehavior.Stop;
}), new PointHitTestParameters(areaPosition));
if (dontcreate)
return;
アイデアは、VisualObject の座標を見つけることです。次に、Z-Order HitTesting を使用して、座標上にある最初の要素を受け取ります。そして、そのオブジェクトが VisualObject または VisualObject の一部ではない場合、ユーザーには見えないように聞こえます。なぜ私が望んでいる結果が得られないのだろうか?
アイデアはありますか?ありがとう。