【问题标题】:Accessing children of UserControl at design time在设计时访问 UserControl 的子项
【发布时间】:2012-08-21 18:32:55
【问题描述】:

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。设计者必须触发该事件才能使几何图形在设计时间)

【问题讨论】:

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


    【解决方案1】:

    你看过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}}"/>
    

    【讨论】:

    • 这里的问题是不知道什么时候能拿到样本数据。例如,在 MyPoints 的属性设置器中(或在构造函数中),如果我访问 MyPolygon 对象的 .Children 属性,它只包含 1 个子对象 - 它自己的多边形 - 椭圆尚未添加到画布中。我尝试从 LayoutUpdated 事件中访问 .Children,我成功地看到了它们,但是设计器似乎没有触发该事件,这使得它只能在运行时工作。
    • 您可以将第一个选项放在您的子属性的属性 getter 中,或者您可以使用第二个选项并拥有一个 CollectionViewSource,其设计时数据包含其中的内容(请参阅d:Source 行。
    【解决方案2】:

    所以,我最终在我拥有椭圆的同一级别上创建了一个多边形。

    <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 设计器刷新视图并获取更改,这使得设计过程远不如原本的直观。 :/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-06
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多