2009-06-05 5 views
4

Ich habe ein Fenster mit mehreren Frame-Steuerelementen und möchte die Grenzen/Rechteck der Steuerelemente zur Laufzeit finden. Sie gehen in ein Raster auf dem Fenster mit XAML mit Höhe/Breite/Rand Attribute.Wie kann ich zur Laufzeit die Grenzen eines WPF-Steuerelements in C# ermitteln?

Das Frame-Steuerelement verfügt nicht über die Eigenschaften Bounds, Rect, Top oder Left.

Der Zweck besteht darin, jeden Rahmen zu testen, um festzustellen, ob sich die Maus im Inneren befindet, wenn andere Ereignisse auftreten. Meine derzeitige Arbeit besteht darin, boolesche Flags in den MouseEnter- und MouseLeave-Handlern zu setzen/zu löschen, aber es muss einen besseren Weg geben. Es könnte offensichtlich sein, weil ich neu in C# WPF und .NET bin.

Antwort

3

Warum gehst du nicht gerade testen Sie die IsMouseOver oder IsMouseDirectlyOver Eigenschaften durchqueren?

+0

Danke - ich habe diese Eigenschaft irgendwie vermisst. – Ken

1

Sie können Ihre Kontrollen durch VisualTreeHelper und sehen, ob sich der Cursor in dem Element durch VisualTreeHelper.HitTest(...) Methode

+0

Das funktionierte auch, aber IsMouseOver schien direkter. – Ken

5

Obwohl andere die Notwendigkeit erfüllt haben, beantwortete niemand wie üblich die gestrahlte Frage. Ich kann mir eine beliebige Anzahl von Szenarios vorstellen, die eine begrenzte Bestimmung erfordern. Beispielsweise kann die Anzeige von HTML mit einem IFRAME auf der Host-HTML-Seite erfolgen, und wenn Sie ihn gemäß den gerenderten Grenzen eines Bereichs positionieren können, können Sie ihn problemlos in Ihre Benutzeroberfläche integrieren.

Sie können den Ursprung eines Steuerelements mithilfe eines GeneralTransform on Point (0,0) zum visuellen Stammkoordinatensystem bestimmen, und ActualHeight und ActualWidth werden direkt angezeigt.

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"); 

In dem obigen Beispiel I verwandelt (-1, -1) und addierten beide 2 Höhe und Breite für das einzelne Pixelgrenzgebiet um einen IFRAME zu kompensieren - wird dieser Code aus einer Arbeitsanwendung angehoben, dass verwendet einen IFRAME zum Rendern von "eingebettetem" HTML, wenn der Browser gehostet wird.

Auch gibt es mehr als eine Möglichkeit, eine Katze zu häuten und für Hit-Tests finden Sie VisualTreeHelper interessant.

Dies gibt jedes UIElement unter einem Punkt (in der Regel von der Maus) zurück. Es gibt eine Überladung, die stattdessen ein Rect verwendet.

Verwandte Themen