2016-09-01 17 views
0

FlipViewコントロールで選択されたアイテムをロードする方法はありますか?XAML FlipViewで選択したアイテムのみをロードする

FlipViewのデフォルトのスタイルは、Microsoftのスタイルから、VirtualizingStackPanelを使用しています。

<Setter Property="ItemsPanel"> 
     <Setter.Value> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel AreScrollSnapPointsRegular="True" Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 

何が発生すると、現在の要素と隣接する要素をロードするために開始することです。私がFlipViewを実行したいのは、アイテムが表示されているとき(つまり選択アイテムになったとき)のみロードすることです。

これは可能ですか?私は非同期的に画像をロードするカスタムコントロールで構成されて項目が含まれているflipviewを使用してい

+0

私の問題は次のとおりです。 画像を非同期に読み込むカスタムコントロールで構成される項目が含まれているフリップビューを使用しています。私は選択したインデックスのイメージを読み込みたいだけです。したがって、フリップビューが読み込まれると、最初の項目が読み込まれます。ユーザーが左にスワイプすると、2番目の画像が読み込まれます。 – Maximus

答えて

0

は、ここに私の問題です。私は選択したインデックスのイメージを読み込みたいだけです。したがって、フリップビューが読み込まれると、最初の項目が読み込まれます。ユーザーが左にスワイプすると、2番目の画像が読み込まれます。

1

あなたのカスタムクラスを作ることができる:

public class ImageGallery : FlipView 
{ 
    public ImageGallery() 
    { 
     SelectionChanged += (s, a) => 
     { 
      ((ImageItem)Items[SelectedIndex]).Load() 
     } 
    } 
} 

public class ImageItem : FlipViewItem 
{ 
    public ImageItem(SomeType yourImageInfo) 
    { 
     Content = new YourControl(yourImageInfo); 
    } 

    public void Load() 
    { 
     //load your image 
    } 
} 
0

あなたはデータバインドImageSourceを持っている場合は、あなたがするときの選択を手動で現在の項目の負荷を強制することは、そのような方法でそれを行うことができますFlipViewが変更されます。

カスタムアイテムクラスを作成できます。 XAMLで

public class FlipViewItemViewModel : INotifyPropertyChanged 
{ 
    private bool _isLoaded = false; 

    private ImageSource _imageSource = null; 

    public ImageSource ImageSource 
    { 
     get 
     { 
      return _imageSource; 
     } 
     set 
     { 
      _imageSource = value; 
      OnPropertyChanged(); 
     } 
    } 

    /// <summary> 
    /// Forces the loading of the item 
    /// </summary> 
    public void ForceLoad() 
    { 
     //prevent loading twice 
     if (!_isLoaded) 
     {   
      _isLoaded = true;  
      //load the image (probably from network?) 
      ImageSource = new BitmapImage( 
       new Uri("ms-appx:///Assets/StoreLogo.png")); 
     } 
    } 

    /// <summary> 
    /// INotifyPropertyChanged implementation 
    /// </summary> 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged( 
     [CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

を、あなたはItemsSourceを使用してFlipViewにデータソースをバインドし、SelectionChangedイベントを処理する必要があります:イメージがロードされたとき、それはコントロールを通知するように、それはINotifyPropertyChangedインタフェースを実装することに注意してください

<FlipView x:Name="FlipControl" 
      ItemsSource="{x:Bind Items}" 
      SelectionChanged="Selector_OnSelectionChanged"> 

ハンドブックSelectionChangedハンドラの内部で、現在のアイテムのForceLoadメソッドを手動で呼び出します。

private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    //get the currently selected item 
    var currentItem = FlipControl.SelectedItem as FlipViewItemViewModel; 
    //force-load it 
    currentItem?.ForceLoad(); 
} 

GitHub sample with this solution and exampleを作成しました。

+0

ああ、良いアイデア!できるだけ早く試してみるよ、ありがとう! :) – Maximus

関連する問題