对于FlipView控件,是否只有一种方法可以加载所选项目?
来自Microsoft风格的FlipView的默认样式使用VirtualizingStackPanel:
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<VirtualizingStackPanel AreScrollSnapPointsRegular="True" Orientation="Horizontal" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
发生的是当前元素和相邻元素将开始加载。我想要FlipView做的只是在项目显示时加载项目(换句话说,当它成为所选项目时)。
这可能吗?
答案 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();
}