自定义控件中的集合属性如何实现

15376895 2010-04-13 09:11:24
class 1:
public class Chart : Control
{
public Chart() {
this.DefaultStyleKey = typeof(Chart);
this._series = new Collection<LineItem>();
}
private Collection<LineItem> _series;
public Collection<LineItem> Lines
{
get
{
return _series;
}
set
{
throw new NotSupportedException("NotSupportedException");
}
}
}
class 2:
public class LineItem : Control //draw a line
{
public LineItem()
{
this.DefaultStyleKey = typeof(LineItem);
}
}
测试XAML
<custom1:Chart>
<custom1:Chart.Lines>
<custom1:LineItem />
<custom1:LineItem />
<custom1:LineItem />
</custom1:Chart.Lines>
</custom1:Chart>
没有错误,但不出东西
如果单独使用

<custom1:LineItem />
<custom1:LineItem />
<custom1:LineItem />
则能画出三条线
...全文
287 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackbeat 2011-01-06
  • 打赏
  • 举报
回复
楼主...我还是不知道你的答案啊!求解!
15376895 2010-04-14
  • 打赏
  • 举报
回复
我已经找到答案了,能给自己给分吗?哈哈
websco 2010-04-14
  • 打赏
  • 举报
回复
是,我一开始光看代码误解了你的意思,以为你只要想要把多个LineItem显示出来。
后来一想你的class名称是Chart,Chart里面肯定还有Legend、Series等Collection,不可能都作为Chart的ItemsSource来使用~~~~

楼主以后有心得发个博分享一下咯。
15376895 2010-04-14
  • 打赏
  • 举报
回复
嗯,我最近在研究toolkit的chart代码
websco 2010-04-13
  • 打赏
  • 举报
回复
Silverlight Toolkit 中的 Chart 还真的不是从 ItemsControl 继承的,而是从 Control 继承的,样式中也没有出现 ItemsControl 。

哪位能人给分析指点一下?


<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="charting:Chart">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>

<datavis:Title Content="{TemplateBinding Title}" Style="{TemplateBinding TitleStyle}" />

<!-- Use a nested Grid to avoid possible clipping behavior resulting from ColumnSpan+Width=Auto -->
<Grid Grid.Row="1" Margin="0,15,0,15">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<datavis:Legend x:Name="Legend" Header="{TemplateBinding LegendTitle}" Style="{TemplateBinding LegendStyle}" Grid.Column="1" />
<chartingprimitives:EdgePanel x:Name="ChartArea" Style="{TemplateBinding ChartAreaStyle}">
<Grid Canvas.ZIndex="-1" Style="{TemplateBinding PlotAreaStyle}" />
<Border Canvas.ZIndex="10" BorderBrush="#FF919191" BorderThickness="1" />
</chartingprimitives:EdgePanel>
</Grid>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
websco 2010-04-13
  • 打赏
  • 举报
回复
引用Silverlight 3.0中的说明:
一般而言,ItemsControl 具有两个角色:可用于呈现一个固定的项集,或者用于显示从指向某个对象的数据绑定中获取的列表。有一些可在应用程序中使用的从 ItemsControl 继承的控件,但是您也可以直接使用 ItemsControl。

ItemsPresenter则是指定项在控件(通常是 ItemsControl)中的放置位置。 ps,ItemsPresenter 和 ContentPresenter 相对应,后者表示单个控件的占位符。

至于具体的说明,就要请冷大大来解释了~~~~
websco 2010-04-13
  • 打赏
  • 举报
回复

public class Chart : ItemsControl
{
public Chart()
{
this.DefaultStyleKey = typeof(Chart);
}
}
public class LineItem : Control
{
public LineItem()
{
this.DefaultStyleKey = typeof(LineItem);
}
}


Generic.xaml中的样式(仅作测试效果用)

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SilverlightApplication15">


<Style TargetType="local:LineItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:LineItem">
<Border BorderBrush="Red" BorderThickness="1"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

<Style TargetType="local:Chart">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:Chart">
<ScrollViewer Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="0" >
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>




在 XAML 中直接指定 LineItem 即可,

<custom1:Chart HorizontalAlignment="Left" Margin="70,124,0,0" x:Name="chart1" VerticalAlignment="Top" Height="123" Width="192" BorderBrush="#FF000019" Background="#FFECECF5">
<custom1:LineItem Height="1" Width="148" Margin="8"/>
<custom1:LineItem Height="1" Width="148" Margin="8"/>
<custom1:LineItem Height="1" Width="148" Margin="8"/>
</custom1:Chart>


也可以通过在 XAML 中绑定 ItemsSource 来显示。
15376895 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 websco 的回复:]
楼主, Chart 要从 ItemsControl 继承,而不是 Control ,还有,直接使用 ItemsSource 属性,不用应外再写
[/Quote]
为什么非要从itemscontrol来显示呢?这个有什么关系吗
websco 2010-04-13
  • 打赏
  • 举报
回复
楼主, Chart 要从 ItemsControl 继承,而不是 Control ,还有,直接使用 ItemsSource 属性,不用应外再写
websco 2010-04-13
  • 打赏
  • 举报
回复
我试了下代码,在后台通过 Button_Click 也显示不了,可能应是Generic.xaml的样式的问题,
我用的是 ItemsPresenter ,显示不了,正好等高手来解决如何显示带 ItemsPresenter 的控件,学习一下。

我的测试代码:

private void button1_Click(object sender, RoutedEventArgs e)
{
this.chart1.Lines.Add(new LineItem() {
BorderThickness= new Thickness(1) ,
BorderBrush = new SolidColorBrush( Colors.Purple)
});
}



<Style TargetType="local:LineItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:LineItem">
<Border BorderBrush="Red" BorderThickness="1"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

<Style TargetType="local:Chart">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:Chart">
<ScrollViewer Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="0" >
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
websco 2010-04-13
  • 打赏
  • 举报
回复
楼主把 Chart 在 Generic.xaml 中的样式发出来看看
15376895 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 websco 的回复:]
怎么没有使用 DependencyProperty ?
[/Quote]
加了DP也不管用啊,我加了
public static readonly DependencyProperty LinesProperty =
DependencyProperty.Register(
"Lines",
typeof(ObservableCollection<LineItem>),
typeof(Chart),
null);
还是老样子,不出东西
websco 2010-04-13
  • 打赏
  • 举报
回复
怎么没有使用 DependencyProperty ?
xingjunli 2010-04-13
  • 打赏
  • 举报
回复
看起来在Chart中只在内存中实例化了并没有将Lineitem加到children中所以不能显示

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧