我在Silverlight中创建了一个包含大量房间的地图。所有的房间都是多边形,大多数是矩形。
所以我正在做的是使用房间的x y点坐标创建一个Polygon。像
这样的东西Polygon p = new Polygon
p.points = pointCollection;
MainCanvas.Chilren.Add(p);
这很有效。接下来,我想将每个房间的名称放在地图上。我想我只是在多边形中添加一个textblock子元素。不幸的是,似乎UIElements不能包含子UIElements。我认为这是愚蠢的,但无论如何。
下一个计划:创建一个包含多边形和文本字段的新Silverlight用户控件。用户控件中的多边形中心文本字段。所以我只创建其中一个UserControls“Room”,将属性“RoomShape”设置为多边形并将其添加到画布中。这里的问题是Usercontrol总是被添加到位置(0,0)并且房间形状位于右下角位置。我真正想要的是控件采用我添加的多边形的大小和形状,这样我就可以找到中心并添加文本。这可能吗?
另外,假设我在控件的布局中添加了一个多边形:
LayoutRoot.Children.Add(poly);
为什么
poly.ActualHeight
poly.ActualWidth
poly.height
poly.width
当我能在画布上清楚地看到它们时,都会返回0或NaN吗? 为什么
Canvas.GetTop(poly);
Canvas.GetLeft(poly);
当我能清楚地看到它们不在(0,0)时,都返回0?
对于在多边形中居中文本的任何其他建议表示赞赏。
答案 0 :(得分:2)
首先,您肯定无法将UIElements添加到Polygon。 Polygon不是容器,因此您无法在其中添加元素。
其次,如果要在多边形的中间设置文本,为什么不将多边形包装在网格中。然后在网格中,添加你的多边形和你的文本块:
<Grid x:Name="room1" Background="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center">
<Polygon Stroke="Black" Fill="Beige">
<Polygon.Points >
<Point X="0" Y="0" />
<Point X="20" Y="100" />
<Point X="100" Y="50" />
<Point X="0" Y="0" />
</Polygon.Points>
</Polygon>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">Room Name</TextBlock>
</Grid>
第三,对于始终为0的大小,这可能是因为您在加载时创建/添加usercontrol。我知道它很难过,但你必须在容器的UserControl_SizeChanged
事件中完成工作。