2016-05-28 14 views
1

Ich habe den folgenden Code in meiner WPF-Anwendung:WPF Form Begrenzungsrechteck ist immer leer

public MainWindow() 
    { 
     InitializeComponent(); 
     p1 = new Point(50, 50); 
     p2 = new Point(355, 50); 
     p3 = new Point(50, 355); 
     p4 = new Point(355, 355); 

     Loaded += (x, y) => Draw(); 
     //ContentRendered += (x, y) => Draw(); 
    } 

ich eine Polygonform erstellen und versuchen, sein Begrenzungsrechteck mehr Möglichkeiten, um:

private void Draw() 
    { 
     Polygon polygon = new Polygon(); 
     polygon.Stroke = System.Windows.Media.Brushes.White; 
     polygon.Points.Add(p1); 
     polygon.Points.Add(p2); 
     polygon.Points.Add(p3); 
     polygon.Points.Add(p4); 
     canvas.Children.Add(polygon); 
     boundingRect = polygon.TransformToVisual(canvas).TransformBounds(new Rect(polygon.RenderSize)); 
     boundingRect = polygon.TransformToVisual(polygon).TransformBounds(System.Windows.Controls.Primitives.LayoutInformation.GetLayoutSlot(polygon)); 
     boundingRect = polygon.RenderTransform.TransformBounds(new Rect(polygon.RenderSize)); 
     boundingRect = GetRectOfObject(polygon); 
     boundingRect = polygon.RenderedGeometry.Bounds; 
    } 

private Rect GetRectOfObject(FrameworkElement _element) 
    { 
     Rect rectangleBounds = new Rect(); 
     rectangleBounds = _element.RenderTransform.TransformBounds(new Rect(0, 0, _element.ActualWidth, _element.ActualHeight)); 
     return rectangleBounds; 
    } 

Allerdings bekomme ich immer {0; 0; 0; 0}.

Auf debug, kann ich die Punkte sehen, aber seine Größe ist 0 gemacht:

enter image description here

Wie soll ich die richtige Art und Weise zu berechnen?

+0

Sie müssen wahrscheinlich [Measure] (https://msdn.microsoft.com/en-us/library/system.windows.uielement.measure (v = vs.110) .aspx) und/oder [Anordnen] aufrufen ] (https://msdn.microsoft.com/en-us/library/system.windows.uielement.arrange (v = vs.110) .aspx) auf dem Rechteck, um es richtig zu rendern – ChrisF

+0

Sie meinen, dass ich sollte _manuell berechnen_ die Größe dessen, was die Form benötigt, und _dann_ bekomme ich die Begrenzungsgröße? Da sich die Form dynamisch ändert, kann ich nicht die Größe des benötigten Platzes angeben - das ist es, was ich von dem WPF-Framework erwarte - anstatt von mir. Gemäß den Lebenszyklusereignissen gibt es kein visuelles Rendering nach dem geladenen Ereignis, also sollte das Layout im Grunde bereit sein: http://www.codeproject.com/Articles/403418/Lifetime-events-of-a-WPF-application – Nestor

Antwort

0

Nach den MSDN Bemerkungen der Measure Methode, UpdateLayout Aufruf wird die notwendigen Daten erhalten (obwohl es sorgfältig behandelt werden soll), so dass diese Art und Weise der Mess funktioniert:

private void Draw() 
{ 
    Polygon polygon = new Polygon(); 
    polygon.Stroke = System.Windows.Media.Brushes.White; 
    polygon.Points.Add(p1); 
    polygon.Points.Add(p2); 
    polygon.Points.Add(p3); 
    polygon.Points.Add(p4); 
    canvas.Children.Add(polygon); 
    polygon.UpdateLayout(); 
    boundingRect = polygon.TransformToVisual(canvas).TransformBounds(new Rect(polygon.RenderSize));  
} 

Dank @ChrisF für die Hinweise .