我从哪里开始设计包含子对象的自定义控件?

时间:2008-09-08 12:22:31

标签: wpf xaml

我认为这是一个有趣的工程级问题。

我需要设计一个显示折线图的控件。我希望能够做的是使用设计器添加多个Pens,它实际上描述了数据和表示,以便最终使用Xaml这些内容:

<Chart>
  <Pen Name="SalesData" Color="Green" Data="..."/>
  <Pen Name="CostData" Color="Red" Data="..." />
  ...
</chart>

我的第一个想法是为ItemsControl课程延长Chart。这会让我想要去哪里,还是应该从不同的方向看待它,例如延伸Panel

主要要求是能够在设计器中使用它而无需添加任何C#代码。为了使其可行,它需要在树视图模型中保留其结构。换句话说,如果我在Expression Blend或Mobiform Aurora中使用它,我将能够从逻辑树中选择图表或选择任何单独的笔来编辑它们的属性。

3 个答案:

答案 0 :(得分:2)

我会使用Chart作为ItemsControl,其ItemsPanel是一个Canvas(对于一些轻量级用途我将使用Grid作为ItemsPanel)。每个Pen都是一个源自PolyLine类的CustomControl。这有什么意义吗?

答案 1 :(得分:1)

对于那些有兴趣从个人发展的角度进行自己控制的人(如原始问题中所述),那么我建议使用这种格式的结构。

<Chart>
  <Chart.Pens>
    <Pen Name="SalesData" Data="{Binding Name=SalesData}" />        
    <Pen Name="CostData">
      <Pen.Data>
        <PenData Y="12" X="Jan" />
        <PenData Y="34" X="Feb" />
      </Pen.Data>
    </Pen>
  </Chart.Pens>
</Chart>

为此,您需要在用户控件中公开一个Pens集合(我不会将其视为派生的ItemsControl控件)。此派生用户控件将封装其他控件(通常为网格以放置标题的标签,轴名称的标签,可能为绘图区域的Canvas)和ItemsControl以显示图例中的项目。


对于那些正在寻求准备解决方案的人

对于那些寻找准备好的解决方案的人,我会查看CodePlex以进行VisiFire's WPF图表控制。它与WPF和Silverlight兼容,它甚至可以Silverlight app输入您的数据&amp;样式并让它生成XAML(或HTML)以粘贴到您的应用程序中。

答案 2 :(得分:0)

另一种选择是为图表扩展Canvas并为Pens扩展Shape。然后根据颜色/数据属性动态绘制形状。