2016-05-28 142 views
1

我在我的WPF应用程序下面的代码:WPF形状矩形边框总是空

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(); 
    } 

我创建了一个多边形形状,并尝试获取其边框几种方法

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; 
    } 

但是,我总是得到{0; 0; 0; 0}。

在调试,我可以看到点,但其规模呈现0:

enter image description here

我应该如何计算正确的方法是什么?

+0

您可能需要调用[Measure](https://msdn.microsoft.com/en-us/library/system.windows.uielement.measure(v = vs.110).aspx)和/或[Arrange ](https://msdn.microsoft.com/en-us/library/system.windows.uielement.arrange(v = vs.110).aspx)在矩形上使其正确呈现 – ChrisF

+0

您的意思是我应该_手动计算_形状需要的尺寸和_then_我得到边界尺寸?由于形状会动态变化,我无法分辨所需空间的大小 - 这正是我期望从WPF框架计算出来的 - 而不是我。根据生命周期事件,在加载事件后没有更多的可视化渲染,所以基本上布局应该已经准备就绪:http://www.codeproject.com/Articles/403418/Lifetime-events-of-a-WPF-application – Nestor

回答

0

按照Measure方法的MSDN言论,称UpdateLayout将获得必要的数据(但应慎重对待),所以这样的测量工作:

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

感谢@ChrisF的提示。