FlipView在调整大小时创建额外的FlipViewItem

时间:2016-09-21 12:44:46

标签: xaml windows-runtime uwp

我有FlipView项目和项目模板。最初加载控件时,会创建三个FlipView项。我注意到,如果我在此之后调整窗口大小,FlipView决定创建另外的第四个项目。为了证明这种奇怪的行为,我创建了以下小例子:

<Page
x:Class="Test.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Test"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid>
    <FlipView x:Name="items">
        <FlipView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" Loaded="TextBlock_Loaded"/>
            </DataTemplate>
        </FlipView.ItemTemplate>
    </FlipView>
</Grid>

这就是代码隐藏:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        items.ItemsSource = new string[] { "Text 1", "Text 2", "Text 3", "Text 4" };
    }

    private void TextBlock_Loaded(object sender, RoutedEventArgs e)
    {
        var textBlock = sender as TextBlock;
        System.Diagnostics.Debug.WriteLine(textBlock.Text);
    }
}

加载页面后,您将看到&#34;文字1&#34;,&#34;文字2&#34;,&#34;文字3&#34;在程序输出中。然后,如果您仍然在第一个项目上尝试调整窗口大小,&#34;文本4&#34;也将出现在输出中。

我的问题是:为什么会发生这种情况,我可以做些什么来阻止它吗?

1 个答案:

答案 0 :(得分:0)

  

加载页面后,您将在程序输出中看到“文本1”,“文本2”,“文本3”。然后,如果您仍然在第一个项目上尝试调整窗口大小,则“文本4”也将出现在输出中。

此行为的根本原因:FlipView使用VirtualizingStackPanel作为其itemsPanel。如果您有很多项目VirtualizingStackPanel将根据需要加载项目,这将提高性能。

要防止它,您只需要将itemsPanel替换为其他“非虚拟化面板”:

<FlipView x:Name="items" Style="{StaticResource FlipViewStyle1}">
        <FlipView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"></StackPanel>
            </ItemsPanelTemplate>
        </FlipView.ItemsPanel>
        <FlipView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" Loaded="TextBlock_Loaded"/>
            </DataTemplate>
        </FlipView.ItemTemplate>
</FlipView>

注意:请注意,禁用FlipView的UI虚拟化可能会对性能产生负面影响,尤其是在存在大量项目的情况下。