我从哪里开始设计包含子对象的自定义控件?
我认为这是一个有趣的工程级问题。
我需要设计一个显示折线图的控件。我想要做的是使用设计器添加多个Pen
,它们实际上描述了数据和表示形式,因此最终以Xaml的形式出现在这些方面:
<Chart> <Pen Name="SalesData" Color="Green" Data="..."/> <Pen Name="CostData" Color="Red" Data="..." /> ... </chart>
我的第一个想法是为Chart
类扩展ItemsControl
。那会把我带到我想去的地方吗?还是我应该从另一个方向(例如扩展" Panel")来看呢?
主要要求是能够在设计器中使用它而无需添加任何Ccode。为了使其可行,它需要在树视图模型中保留其结构。换句话说,如果我在Expression Blend或者Mobiform Aurora中使用它,则可以从逻辑树中选择图表或者选择任何一支独立的笔来编辑其属性。
解决方案
回答
另一种选择是为图表扩展"画布",为笔扩展"形状"。然后根据"颜色/数据"属性动态绘制形状。
回答
我将把Chart作为ItemsControl使用,将它的ItemsPanel作为Canvas(对于一些轻巧的使用,我将把Grid作为ItemsPanel使用)。每个Pen都是从PolyLine类派生的CustomControl。这有任何意义吗?
回答
对于那些有兴趣从个人发展的角度进行控制的人(如原始问题所述),我建议采用这种格式的结构。
<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 for VisiFire的WPF图表控件。它与WPF和Silverlight兼容,甚至还有一个Silverlight应用程序供我们输入数据和样式,并使其生成XAML(或者HTML)以粘贴到应用程序中。