Применить ресурс к 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 Value не попадает в ожидаемый диапазон.

НО, если я удалю комментарии и установлю новый экземпляр, это сработает. Так в чем разница? Почему я не могу применить ресурс к semanticzoom zoomedinview?


person Juan Pablo Garcia Coello    schedule 24.08.2015    source источник


Ответы (1)


Проблема возникает в этой части вместо применения ListView / Gridview к ZoomInView / ZoomOutView.

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

Я не думаю, что мы можем разместить здесь GirdView или ListView, потому что они не являются общими, см. Раздел «Ресурсы XAML должны быть общими» в ResourceDictionary и ссылки на ресурсы XAML, UIElement никогда не станет общедоступным

В любом случае лучше всего не просто заменить текущий 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;
        }
    }
person James He    schedule 25.08.2015
comment
Вы были правы насчет ресурсов, иногда кажется, что это быстро, что я сделал, так это сохранил их как ресурсы, например, еще два и сделал привязку по коду и стилям ресурсов к ним. - person Juan Pablo Garcia Coello; 25.08.2015
comment
У меня такая же проблема, и я не понимаю, как это связано с новым источником данных. Целью должно быть переключение между ListView и GridView в зависимости от размера экрана, а не изменение источника данных, - person StepTNT; 09.04.2016