2015-08-24 33 views
1

我已经简化了的情况下以下几点:应用资源SemanticZoom ZoomedInView抛出异常

<Page> 

<Page.Resources> 

<GridView x:Key="TestGrid"/> 
<ListView x:Key="TestList"/> 

</Page.Resources> 

</Page> 

<Grid >... 

<VisualStateManager.VisualStateGroups > 
    <VisualStateGroup x:Name="VisualStateGroup" CurrentStateChanged="VisualStateGroup_CurrentStateChanged"> 
    <VisualState x:Name="WideView"> 
    <VisualState.StateTriggers> 
    <AdaptiveTrigger MinWindowWidth="720" /> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    </VisualState.Setters> 
    </VisualState> 
    <VisualState x:Name="NarrowView"> 
    <VisualState.StateTriggers> 
    <AdaptiveTrigger MinWindowWidth="0" /> 
    </VisualState.StateTriggers> 
    <VisualState.Setters> 
    </VisualState.Setters> 
    </VisualState> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

<SemanticZoom...> 

<SemanticZoom.ZoomedInView> 
    <GridView/> 
</SemanticZoom.ZoomedInView> 

<SemanticZoom.ZoomedOutView> 

<GridView/> 

</SemanticZoom.ZoomedOutView> 

且事件跟踪的过程:

private void VisualStateGroup_CurrentStateChanged(object sender, VisualStateChangedEventArgs e) 
{ 
    if (e.NewState.Name == "NarrowView") 
    { 
     ZoomView.ZoomedInView = (ListView)this.Resources["TestList"]; //new ListView(); 
    } 
    else 
    { 
     ZoomView.ZoomedInView = (GridView)this.Resources["TestGrid"]; //new GridView(); 
    } 
} 

抛出异常信息:System.ArgumentException价值不在预期范围内。

但是,如果我删除了评论,我设置了一个新的实例,那是有效的。那么区别是什么呢?为什么我无法将资源应用于语义缩放zoomedinview?

回答

1

问题发生在这一部分,而不是将ListView/Gridview应用于ZoomInView/ZoomOutView。

(ListView)this.Resources["TestList"]; 

我不认为我们可以把GirdView或ListView这里,因为他们是不共享的,请参阅“XAML资源必须共享”的ResourceDictionary and XAML resource references的部分,可以的UIElement绝不可共享

无论如何,最佳做法不是简单地将当前的GirdView替换为另一个现有的GirdView,而是应该修改绑定到另一个数据源。

private void VisualStateGroup_CurrentStateChanged(object sender, VisualStateChangedEventArgs e) 
    { 
     if (e.NewState.Name == "NarrowView") 
     { 
      //assign the new data source to ZoomedInView 
      (zoomview.ZoomedInView as ListView).ItemsSource = xxxxx; 
     } 
     else 
     { 
      //assign the new data source to ZoomedOutView 
      (zoomview.ZoomedOutView as GridView).ItemsSource = xxxxx; 
     } 
    } 
+0

你是对资源,有时一个认为是快,我所做的是让他们的资源,例如另外两个,并通过代码和 –

+0

我具有样式的资源,他们的结合同样的问题,我不明白这是如何与新的数据源。目标应该是根据屏幕大小在“ListView”和“GridView”之间切换,而不是更改数据源, – StepTNT