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

标签 silverlight charts silverlight-toolkit

我使用 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/

相关文章:

c# - Silverlight DataGrid 按列排序不会更新以编程方式更改的单元格

android - org.gradle.internal.resolve.ModuleVersionNotFoundException : Could not find com. android.tools.build :gradle:3. 0.1

javascript - 将时间缩放添加到折线图 (Chart.js)

c# - 使用 Toolkit for Windows Phone 中的 ExpanderView 自定义 header

wpf - 如何让 Accordion 区域(垂直)扩展为动态内容?

silverlight - Dynamics CRM 中 Silverlight 的替代品

c# - 如何访问Silverlight客户端和服务器端?

c# - 为什么在为 Silverlight 5 应用程序添加编码 UI 支持时 System.Core 加载失败?

html - 修改谷歌图表

windows-phone-7 - 更改过渡页面持续时间