0

Windows 8 样式应用程序(例如“Metro”)、Visual Studio 2012、XAML。

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

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

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

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

但是,更改该字符串中的值是乏味的。设计师更愿意收集一些在设计时可见但在运行时不可见的 UI 结(如椭圆),以便他们可以将它们拖到设计器中并让 Polygon 动态重建其几何形状:

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

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

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

4

2 回答 2

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 的坐标转换为字符串。

这在设计时和运行时都有效。

不幸的是,必须在移动椭圆后重新构建项目,以便 VS 设计器刷新视图并获取更改,这使得设计过程远不如原本的直观。:/

于 2012-08-22T02:32:58.510 回答
0

你有没有看过这样的设计数据

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}}"/>
于 2012-08-21T20:29:26.140 回答