【问题标题】:Where do I start designing a Custom Control that contains child objects?从哪里开始设计包含子对象的自定义控件?
【发布时间】:2008-09-08 12:22:31
【问题描述】:

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

我需要设计一个显示折线图的控件。我想要做的是使用设计器添加多个Pens,它们实际上描述了数据和演示文稿,以便最终以 Xaml 结尾:

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

我的第一个想法是为 Chart 类扩展 ItemsControl。这会带我去我想去的地方,还是应该从不同的方向看它,例如扩展Panel?

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

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    我会将 Chart 用作 ItemsControl,并将其 ItemsPanel 用作 Canvas(对于一些轻型用途,我会将 Grid 用作 ItemsPanel)。每个 Pen 都是从 PolyLine 类派生的 CustomControl。这有意义吗?

    【讨论】:

    • 谢谢,伙计。这正是我最终实现它的方式。
    【解决方案2】:

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

    <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 供您输入数据和样式并让它生成 XAML(或 HTML)以粘贴到您的应用程序中。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

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