RadGanttView - 扩展嵌套的RecurringTask - 错误

时间:2018-03-02 13:45:25

标签: c# wpf telerik

我对 telerik:RadGanttView 控件有一些问题。我认为这是针对WPF的Telerik工具包UI特有的问题,但我会尽可能详细地解释该问题,以便其他人可以在他们能够想到的情况下建议解决方法。

TLDR;

GanttView可以通过将每次重复作为子项放在单个父事件中来显示重复任务。现在我的项目要求我将这个重复的任务系列嵌套到另一个父事件容器中。

当选择作为嵌套层次结构(至少2级深度)的一部分的定期任务事件时,应用程序将抛出System.NullReferenceException并崩溃。 更具体地说,仅当折叠所有父节点时才会发生此错误。如果仅折叠顶级节点而其他子节点仍然展开,则不会发生此问题。

这是System.NullReferenceException

的StackTrace
  

System.NullReferenceException 被抓住了   在System.Collections.Generic.Dictionary' 2.添加(TKey键,TValue值)
  在Telerik.Windows.Rendering.VirtualizedGridPanel.Handler.SetArrangeRect(Int32列,Int32行,Rect rect)   在Telerik.Windows.Rendering.Internal.GridRenderingHelper.MeasureItemsCore(Rect viewport,IGridContainersHandler handler)
  在Telerik.Windows.Rendering.Internal.GridRenderingHelper.MeasureItems(Rect viewport,IGridContainersHandler handler)
  在Telerik.Windows.Rendering.VirtualizedGridPanel.MeasureContainers(IContainerRecycler recycler,Size availableSize)
  在Telerik.Windows.Rendering.Virtualization.VirtualizedPanel.MeasureOverrideCore(Size availableSize)
  在Telerik.Windows.Rendering.ScrollablePanel.MeasureOverride(尺寸availableSize)
  在System.Windows.FrameworkElement.MeasureCore(Size availableSize)
  在System.Windows.UIElement.Measure(Size availableSize)
  在Telerik.Windows.Controls.GanttPresenterPanel.MeasureContainer(UIElement容器,尺寸measureSize)
  在Telerik.Windows.Controls.GanttPresenterPanel.MeasureOverride(尺寸availableSize)
  在System.Windows.FrameworkElement.MeasureCore(Size availableSize)

详细说明:

我的代码基于RecurringTask_WPF example project。 我能够得到我想要的视觉效果,但我偶然发现导致我的应用程序崩溃的动作。
这使它几乎无法使用,所以我需要找到一个解决方案或至少一种方法来捕获异常并防止它崩溃。

我已经能够确定问题的原因,但我自己无法解决这个问题。

首先让我描述一下我目前的情况/环境。

在默认的 RecurringTask_WPF 示例项目中,如果您折叠" Recurrence Series" (父树节点),那么您可以看到所有孩子重复的任务彼此相邻。
当您单击其中一个事件时,例如:"重复1" 块(在RadGanttView的TimeRuler Part中),然后选择此特定重复任务。这会导致树节点自动展开,并且所选任务/事件将突出显示。

这种行为完全符合预期,我希望保持这样 但是,一旦将重复任务嵌套到一个额外的层次结构级别(这符合我的要求),就会抛出异常并且程序停止工作。

首先,我将为您提供更改示例项目的代码,以便重新创建问题。 (这也有助于进一步解释确切问题)
您应该使用以下代码替换 ViewModel.cs GetTasks()方法:

private ObservableCollection<IGanttTask> GetTasks()
{
    var collection = new ObservableCollection<IGanttTask>();
    var today = DateTime.Today.AddHours(8);
    var child1 = new RecurrenceTask(today, today.AddHours(4), "Recurrence 1");
    var child2 = new RecurrenceTask(today.AddHours(0), today.AddHours(12), "Recurrence 2");
    var child3 = new RecurrenceTask(today.AddHours(13), today.AddHours(20), "Recurrence 3");
    var task2 = new RecurrenceTask(today.AddHours(13), today.AddHours(20), "Recurrence Series2")
        {
            Children = { child3 }
        };
    var task1 = new RecurrenceTask(today, today.AddHours(20), "Recurrence Series1")
    {
        Children = { child1, child2, task2 }
    };
    collection.Add(task1);
    var taskWithoutRecurrence = new GanttTask(today.AddHours(8), today.AddHours(13), "Task Without Recurrence");
    taskWithoutRecurrence.Children.Add(new GanttTask(today.AddHours(9), today.AddHours(12), "Child Task"));
    collection.Add(taskWithoutRecurrence);
    return collection;
}

当您使用这些代码更改运行此示例时,您应该会看到&#34; Recurrence 3&#34; 任务现在被移动到新的&#34; Recurrence Series2& #34;
这个新系列也是原&#34; Recurrence Series1&#34; 的孩子。 因此,当所有节点都崩溃时,您仍然可以看到彼此相邻的所有子节点复发 如果您现在单击&#34; Recurrence 3&#34; 事件(在RadGanttView的TimeRuler部分中),应用程序将抛出System.NullReferenceException(上面的StackTrace)。

以下是一些其他观察结果,可能有助于您找到此问题的确切原因以及可能的解决方案/解决方法:

  • 如果您要点击任何其他重复任务,那么该程序将继续按预期工作。
  • 如果只折叠了顶级节点,那么孩子&#34; Recurrence Series2&#34; 会保持展开状态。然后行为也按预期继续工作。

似乎问题只发生在折叠嵌套节点并且选择了至少2级深度的层次结构的子任务时。

我想找到一种方法来阻止我的程序崩溃。

我已尝试处理点击事件,以防止用户点击RadGanttView的TimeRuler部分中的事件,但我无法弄清楚如何正确执行此操作,我也会仍然喜欢保持自动展开的行为并选择点击的任务。

我还试图实施点击命令,这向我展示了扩展实际上是正常工作的,而事后只会发生例外。

非常感谢任何帮助/建议。

1 个答案:

答案 0 :(得分:1)

我已经在官方的Telerik论坛上报告了这个问题并收到了以下回复:

  

我检查了你的描述,我可以确认有两个   可以使用提供的步骤重现的单独问题。一世   在我们的反馈门户中记录了两个问题并更新了您的Telerik   分。

           

目前我害怕,我无法建议解决方法   这个。这就是为什么我建议你按照中的项目   门户。

     

问候,
  马丁伊万诺夫
  Progress Telerik

我知道回答你自己的问题是不受欢迎的。但是,我会按照开发进行操作,如果有任何变化,我会更新此答案。

如果其他人在修复之前找到了解决方法,请分享。