仅加载XAML FlipView中的选定项目

时间:2016-09-01 17:01:38

标签: xaml uwp uwp-xaml

对于FlipView控件,是否只有一种方法可以加载所选项目?

来自Microsoft风格的FlipView的默认样式使用VirtualizingStackPanel:

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

发生的是当前元素和相邻元素将开始加载。我想要FlipView做的只是在项目显示时加载项目(换句话说,当它成为所选项目时)。

这可能吗?

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

这是我的问题:

我正在使用一个flipview,其中包含由异步加载图像的自定义控件组成的项目。我只想加载所选索引的图像。因此,当flipview加载时,第一个项目加载。如果用户向左滑动,则现在加载第二个图像,依此类推。

答案 2 :(得分:0)

如果您有数据绑定ImageSource,则可以通过这种方式执行此操作,以便在选择FlipView时手动强制加载当前项目。

您可以创建自定义项目类。请注意,它实现了INotifyPropertyChanged接口,以便在加载图像时通知控件:

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 ) );
    }
}

在XAML中,您必须使用FlipView将数据源绑定到ItemsSource并处理SelectionChanged事件:

 <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