Xaml 将资源应用于SemanticZoom ZoomedInView引发异常
我已将该案件简化为以下内容:Xaml 将资源应用于SemanticZoom ZoomedInView引发异常,xaml,windows-10,uwp,Xaml,Windows 10,Uwp,我已将该案件简化为以下内容: <Page> <Page.Resources> <GridView x:Key="TestGrid"/> <ListView x:Key="TestList"/> </Page.Resources> </Page> <Grid >... <VisualStateManager.VisualStateGroups > <VisualStateGrou
<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>
引发异常的:System.ArgumentException值不在预期范围内
但是如果我删除了注释并设置了一个新实例,那就行了。那么有什么区别呢?为什么我不能将资源应用于semanticzoom ZoomMedinView?问题发生在这一部分,而不是将ListView/Gridview应用于ZoomInView/ZoomOutView
(ListView)this.Resources["TestList"];
我不认为我们可以将GirdView或ListView放在这里,因为它们不可共享,请参见UIElement的“XAML资源必须可共享”部分,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;
}
}
你对资源的看法是对的,有时人们认为这很快,我所做的是将它们作为资源保留,再引用两个实例,并通过代码和资源的样式进行绑定。我也有同样的问题,我不明白这与新的数据源有什么关系。目标应该是根据屏幕大小在
列表视图
和网格视图
之间切换,而不是更改数据源,
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;
}
}