语义缩放空组的灾难性失败

时间:2013-01-20 10:19:48

标签: windows-8 microsoft-metro

我正在使用带有网格视图和集合视图源的SemanticZoom控件。一切正常,直到我尝试选择('跳转到')一个空组 - 这会导致未处理的灾难性故障。

http://social.msdn.microsoft.com/Forums/nb-NO/winappswithcsharp/thread/6535656e-3293-4e0d-93b5-453864b95601

有没有人知道是否有办法解决这个问题 - 如果可以,我想'允许'空组。

由于

1 个答案:

答案 0 :(得分:0)

好的,所以我遇到了这个问题并修复了它。我知道这是一个很老的线程,但我会回答它以防其他人遇到这个问题。我就是这样做的。

问题似乎是设置为DestinationItem的群组需要包含项目。在该组为空的情况下,这会产生问题。当组在其他已填充的组之间时,会出现问题,因为它的长度为0,因此无法定位。当它结束时(或者可能是开始时,还没有尝试过),这会产生一个问题,因为GridView / ListView 指向列表中的最后一个鼠标时超过视图的结尾

那么,如何解决它:

您需要为OnViewChangeStarted添加事件处理程序。在此处理程序中,您将可以访问SemanticZoomViewChangedEventArgs

您需要做的第一件事是找出targetted组是否为空。我在这里使用自定义Group课程,但已将其投放到IEnumerable,因为我只需知道其中有多少项目。 Linq允许我查找IEnumerable的计数。

using System.Linq;

private void Zoom_OnViewChangeStarted(object sender, SemanticZoomViewChangedEventArgs e)
{
    var group = e.DestinationItem.Item as IEnumerable;
    if (group != null && group.Count() == 0)
    {
        e.DestinationItem.Item = MyViewModel.Groups.Last(itemGroup => itemGroup.Count() > 0);
    }
}

正如您将注意到的,下一步是将DestinationItem.Item设置为包含项目的Last组。您可能还想处理包含项目的First组,但这也很容易。代替MyViewModel,插入ViewModel。代替Groups,插入您的集合属性。

我希望这有助于编码的快乐!