2009-06-05 27 views
4

私はいくつかのフレームコントロールを持つウィンドウを持っており、実行時にコントロールの境界/矩形を探したいと思います。 Height/Width/Margin属性を持つXAMLを使用して、ウィンドウ上のグリッドに移動します。実行時にC#でWPFコントロールの境界を特定するにはどうすればよいですか?

フレームコントロールには、境界、矩形、上部または左のプロパティがありません。

目的は、他のイベントが発生したときにマウスが内部にあるかどうかを確認するために各フレームをテストすることです。私の現在の回避策は、MouseEnterハンドラとMouseLeaveハンドラでブール値フラグを設定/クリアすることですが、より良い方法が必要です。私はC#WPFと.NETの初心者であるため、明らかかもしれません。

答えて

3

によって要素にカーソルがなぜあなたはちょうどIsMouseOverまたはIsMouseDirectlyOver特性を試験していないかどうかを確認することができますか?

+0

ありがとう - 私はそのプロパティをどうにか見逃しました。 – Ken

1

あなたはVisualTreeHelperによって、あなたのコントロールを横断し、VisualTreeHelper.HitTest(...)方法

+0

これも機能しましたが、IsMouseOverはより直接的なようでした。 – Ken

5

他の人たちは、いつものように誰もが怒った質問に答えなかったが、その必要性を満たしている。境界の決定が必要なシナリオはいくつでも考えられます。たとえば、HTMLを表示するには、ホストのHTMLページにIFRAMEを使用し、パネルのレンダリングされた境界に従って配置することができれば、UIにうまく統合できます。

ポイント(0,0)のルート座標系に対するGeneralTransformを使用して、コントロールの起点を特定できます。また、ActualHeightとActualWidthは直接浮上します。このコードは、その作業アプリケーションから持ち上げられる - Iは、形質転換(-1、-1)及びIFRAMEの周りに1つの画素の境界領域を補償するために、高さと幅の両方に2を追加した上記のサンプルにおいて

GeneralTransform gt = 
    TransformToVisual(Application.Current.RootVisual as UIElement); 
Point offset = gt.Transform(new Point(-1, -1)); 
myFrame.SetStyleAttribute("width", (ActualWidth + 2).ToString()); 
myFrame.SetStyleAttribute("height", (ActualHeight + 2).ToString()); 
myFrame.SetStyleAttribute("left", offset.X.ToString()); 
myFrame.SetStyleAttribute("top", offset.Y.ToString()); 
myFrame.SetStyleAttribute("visibility", "visible"); 

ブラウザがホストされているときにIFRAMEを使用して埋め込みHTMLを表示します。

また、ネコをスキンするヒットテストには、面白いVisualTreeHelperがあるかもしれません。

IEnumerable<UIElement> VisualTreeHelper 
    .FindElementsInHostCoordinates(Point intersectingPoint, UIElement subtree) 

これは、ポイント(通常はマウスから)の下にあるすべてのUIElementを返します。代わりにRectを使用するオーバーロードがあります。

関連する問題