Sna*_*ake 4 silverlight charts silverlight-toolkit
我使用Silverlight 4工具包创建了Silverlight图表,即4月发布.
请考虑以下图表:
<Grid x:Name="LayoutRoot" Background="White">
<Charting:Chart Title="Chart to test" Name="MySuperChart">
<Charting:LineSeries x:Name="MyLineSeries" Title="Something" />
</Charting:Chart>
</Grid>
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我可以访问图表中的系列MySuperChart.Series[0]但是当我尝试引用MyLineSeries时,它似乎是空的.
图片http://i41.tinypic.com/9k4h7t.png
完整视图
这是一个有趣的小问题.如果你看一下变量MyLineSeries的创建和分配方式,我们会有所帮助.导航到InitializeComponent方法的定义.您将最终在MainPage.g.cs生成的文件中.它将包含此字段: -
internal System.Windows.Controls.DataVisualization.Charting.LineSeries MyLineSeries;
Run Code Online (Sandbox Code Playgroud)
在InitializeComponent你会发现这一行: -
this.MyLineSeries = ((System.Windows.Controls.DataVisualization.Charting.LineSeries)(this.FindName("MyLineSeries")));
Run Code Online (Sandbox Code Playgroud)
因此,InitializeComponent在构造函数中的调用完成时,表面上MyLineSeries应该已经赋值.但是你可以看到它仍然是null,因此可以得出结论,FindName("MyLineSeries")未能找到该系列.所以问题是它为什么失败了?
为什么FindName不起作用?
FindName将文档中提到的内容作为"对象树"进行搜索,寻找具有指定名称的对象(增加了名称范围的复杂性,但这里并没有发挥作用).通常,对象通过诸如Panel或ContentControl具有诸如Children和之类的属性的共同基类型最终在"对象树"中Child.这些ContentProperty属性在类的属性中指定,允许更自然地描述UI结构.例如:-
<Button x:Name="MyButton">
<Image x:Name="MyImage" ... />
</Button>
Run Code Online (Sandbox Code Playgroud)
代替
<Button x:Name="MyButton">
<Button.Child>
<Image x:Name="MyImage" ... />
</Button.Child>
</Button>
Run Code Online (Sandbox Code Playgroud)
的Chart控制,而另一方面,不是一个简单的Panel衍生物,有很多工作要做,以建立自己的UI.在的情况下,Chart在ContentPropertyAttribute指定的Series收集参数.这允许你更自然的Xaml: -
<Charting:Chart Title="Chart to test" Name="MySuperChart">
<Charting:LineSeries x:Name="MyLineSeries" Title="Something" />
</Charting:Chart>
Run Code Online (Sandbox Code Playgroud)
但是因为Chart有很多额外的工作要确定在"对象树"中究竟应该是什么,它将代表它的最终UI,系列集合项不会立即成为"对象树"的一部分.结果FindName在InitializeComponent简单地找不到它们.
解决方法 - 选项1
您可以使用图表中"MyLineSeries"的序数位置的知识来处理MyLineSeries构造函数中变量的赋值.x:Name="MyLineSeries"然后在代码中删除Xaml: -
public partial MainPage : UserControl
{
private LineSeries MyLineSeries;
public MainPage()
{
InitializeComponent();
MyLineSeries = (LineSeries)MySuperChart.Series[0];
}
}
Run Code Online (Sandbox Code Playgroud)
解决方法 - 选项2
您可以等到系列在"对象树"中可用,一旦包含它UserControl已触发其Loaded事件,该系列就是真的: -
public partial MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
Loaded += (s, args) =>
{
MyLineSeries = (LineSeries)FindName("MyLineSeries");
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2572 次 |
| 最近记录: |