gpt4 book ai didi

Silverlight 4 工具包、图表和 lineSeries 为空

转载 作者:行者123 更新时间:2023-12-05 00:41:44 28 4
gpt4 key购买 nike

我使用 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 时,它似乎为空。
picture

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 的“对象树”中究竟应该包含哪些内容,系列集合项不会立即成为“对象树”的一部分,因此还有很多额外的工作。结果是 FindNameInitializeComponent根本找不到它们。

解决方法 - 选项 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com