我使用 Silverlight 4 工具包(4 月版)创建了一个 Silverlight 图表。
考虑以下图表:
<Grid x:Name="LayoutRoot" Background="White">
<Charting:Chart Title="Chart to test" Name="MySuperChart">
<Charting:LineSeries x:Name="MyLineSeries" Title="Something" />
</Charting:Chart>
</Grid>
到现在为止还挺好。我可以通过
MySuperChart.Series[0]
访问图表中的系列但是当我尝试引用 MyLineSeries 时,它似乎为空。Full view
最佳答案
这是一个有趣的小问题。如果您深入了解变量 MyLineSeries
被创建和分配。导航到 InitializeComponent
的定义方法。您将最终看到 MainPage.g.cs 生成的文件。它将包含此字段:-
internal System.Windows.Controls.DataVisualization.Charting.LineSeries MyLineSeries;
并在
InitializeComponent
你会发现这一行:-this.MyLineSeries = ((System.Windows.Controls.DataVisualization.Charting.LineSeries)(this.FindName("MyLineSeries")));
所以表面上看它的时候打电话到
InitializeComponent
在你的构造函数中已经完成了 MyLineSeries
应该被赋值。然而,正如你所看到的,它仍然为空,因此可以得出结论 FindName("MyLineSeries")
未能找到该系列。那么问题来了,为什么会失败呢?为什么 FindName 不起作用?
FindName
搜索文档中称为“对象树”的内容,查找具有指定名称的对象(存在称为名称范围的附加复杂性,但此处并未起作用)。通常,对象通过常见的基本类型(如 Panel
)最终出现在“对象树”中。或 ContentControl
具有诸如 Children
之类的属性和 Child
分别。这些属性在 ContentProperty
中指定允许更自然地描述 UI 结构的类上的属性。例如。:-<Button x:Name="MyButton">
<Image x:Name="MyImage" ... />
</Button>
代替
<Button x:Name="MyButton">
<Button.Child>
<Image x:Name="MyImage" ... />
</Button.Child>
</Button>
Chart
另一方面,控制不是一个简单的Panel
派生,还有很多工作要做来构建它的用户界面。在 Chart
的情况下ContentPropertyAttribute
指定 Series
集合参数。这允许您更自然的 Xaml:-<Charting:Chart Title="Chart to test" Name="MySuperChart">
<Charting:LineSeries x:Name="MyLineSeries" Title="Something" />
</Charting:Chart>
然而因为
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];
}
}
解决方法 - 选项 2
您可以等到该系列在“对象树”中可用,一旦包含
UserControl
就为真。已经解雇了它的 Loaded
事件:-public partial MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
Loaded += (s, args) =>
{
MyLineSeries = (LineSeries)FindName("MyLineSeries");
}
}
}
关于Silverlight 4 工具包、图表和 lineSeries 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2753559/