在设计时访问UserControl的子项

时间:2012-08-21 18:32:56

标签: c# xaml windows-8 microsoft-metro visual-studio-2012

Windows 8 Style Apps(例如“Metro”),Visual Studio 2012,XAML。

我有一个从Canvas派生的UserControl。它有一个子元素 - 一个Polygon,其Data绑定到一个属性(实现了INotifyPropertyChanged):

<Canvas x:Name="MyPolygon">
    <Polygon Points="{Binding ElementName=MyPolygon,Path=MyPoints}" ... />
</Canvas>

如果我在XAML中的其他地方实例化该控件并传入一个字符串,则设置属性并在设计时和运行时正确呈现Polygon:

<local:MyPolygon MyPoints="..." />

但是,更改该字符串中的值非常繁琐。设计人员更喜欢在设计时看到一些UI结(如Ellipses)的集合,但在运行时是不可见的,这样他们就可以在设计器中拖动它们并让Polygon动态重建其几何体:

<local:MyPolygon>
    <Ellipse Canvas.Left="204" Canvas.Top="57" ... />
    <Ellipse Canvas.Left="166" Canvas.Top="30" ... />
    ...
</local:MyPolygon>

基本上我想将几何信息保存在(扩展).Children中。这可能吗?

(可能有一些事件/构造函数,控件可以检查它的.Children(在插入椭圆之后),检索它们的坐标,并构建MyPoints。设计者必须触发该事件才能看到几何体设计时间)

2 个答案:

答案 0 :(得分:0)

您是否查看了this等设计数据。

if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
    GetSampleData();
}
else GetRealData();

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

<CollectionViewSource
  x:Name="groupedItemsViewSource"
  Source="{Binding Groups}"
  IsSourceGrouped="true"
  ItemsPath="Items"
  d:Source="{Binding ItemGroups, 
    Source={d:DesignInstance Type=data:SampleDataSource, 
      IsDesignTimeCreatable=True}}"/>

答案 1 :(得分:0)

所以,我最终在与椭圆相同的水平上创建了一个多边形。

<Polygon Points="{Binding ElementName=MyPoints,Converter={StaticResource PolygonConverter}}" ... />
<Canvas x:Name="MyPoins">
    <Ellipse Canvas.Left="228" Canvas.Top="69" ... />
    <Ellipse Canvas.Left="166" Canvas.Top="30" ... />
    ...
</Canvas>

绑定转换器将对象的所有.Children的坐标转换为字符串。

这适用于设计时和运行时。

不幸的是,必须在移动Ellipses之后重建项目,以便VS设计人员刷新视图并获取更改,这使得设计过程不那么直观。 :/