WinRT Listview内容在2 ^ 21像素后变得不可见?

时间:2015-05-03 18:22:56

标签: c# listview windows-runtime windows-8.1

我在显示数据集(大约27k元素)时遇到问题。问题是,在某个点之后,项目将不再显示但仍然可以被点击。实际上,滚动时会显示这些项目,但滚动停止后会立即消失。经过一些测试后,我发现它在2 ^ 21像素后停止渲染。正在渲染的对象的复杂性似乎不会影响此限制。

我制作了一个示例项目来说明这一点:

在空白的Windows商店应用中,将MainPage.xaml默认网格替换为此

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*"></RowDefinition>
        <RowDefinition Height="24"></RowDefinition>
        <RowDefinition Height="24"></RowDefinition>
    </Grid.RowDefinitions>
    <TextBlock x:Name="textblock" Grid.Row="2"></TextBlock>
    <Button Grid.Column="0" Grid.Row="1" Tapped="Button_Tapped"></Button>
    <Button Grid.Column="1" Grid.Row="1" Tapped="Button_Tapped_1"></Button>
    <Button Grid.Column="2" Grid.Row="1" Tapped="Button_Tapped_2"></Button>
    <Button Grid.Column="3" Grid.Row="1" Tapped="Button_Tapped_3"></Button>
    <ListView Grid.Column="0" Background="Red" x:Name="simpleList1" SelectionChanged="list_SelectionChanged">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Left" />
                <Setter Property="VerticalContentAlignment" Value="Center" />
                <Setter Property="Margin" Value="0,0,0,-8" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Height="100">
                    <TextBlock Text="{Binding Index}"></TextBlock>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <ListView Grid.Column="1" Background="DarkGoldenrod" x:Name="simpleList2" SelectionChanged="list_SelectionChanged">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Left" />
                <Setter Property="VerticalContentAlignment" Value="Center" />
                <Setter Property="Margin" Value="0,0,0,-8" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Height="250">
                    <TextBlock Text="{Binding Index}"></TextBlock>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <ListView Grid.Column="2" Background="Blue" x:Name="complexList1" SelectionChanged="list_SelectionChanged">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Left" />
                <Setter Property="VerticalContentAlignment" Value="Center" />
                <Setter Property="Margin" Value="0,0,0,-8" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Height="333">
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <TextBlock Grid.Row="0" Text="{Binding SimpleItem.Index}"></TextBlock>
                    <TextBlock Grid.Row="1" Text="{Binding ShortMsg}"></TextBlock>
                    <TextBlock Grid.Row="2" Text="{Binding RandomNumber}"></TextBlock>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <ListView Grid.Column="3" Background="Violet" x:Name="complexList2" SelectionChanged="list_SelectionChanged">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Left" />
                <Setter Property="VerticalContentAlignment" Value="Center" />
                <Setter Property="Margin" Value="0,0,0,-8" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Height="500">
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <TextBlock Grid.Row="0" Text="{Binding SimpleItem.Index}"></TextBlock>
                    <TextBlock Grid.Row="1" Text="{Binding ShortMsg}"></TextBlock>
                    <TextBlock Grid.Row="2" Text="{Binding RandomNumber}"></TextBlock>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

在MainPage.xaml.cs

    /// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
    public class SimpleItem
    {
        public int Index { get; set; }
        public SimpleItem(int index)
        {
            Index = index;
        }

        public override string ToString()
        {
            return "I am a simple item with index " + Index;
        }
    }

    public class ComplexItem
    {
        static Random rand = new Random();
        public SimpleItem SimpleItem { get; set; }
        public string ShortMsg { get; set; }
        public double RandomNumber { get; set; }
        public ComplexItem(int index)
        {
            SimpleItem = new SimpleItem(index);
            ShortMsg = "My simple item has index " + SimpleItem.Index;
            RandomNumber = rand.NextDouble() * (double)SimpleItem.Index;
        }

        public override string ToString()
        {
            return "I am a complex item with index " + SimpleItem.Index;
        }
    }

    public ObservableCollection<SimpleItem> listSI = new ObservableCollection<SimpleItem>();
    public ObservableCollection<ComplexItem> listCI = new ObservableCollection<ComplexItem>();


    public MainPage()
    {
        this.InitializeComponent();

        this.NavigationCacheMode = NavigationCacheMode.Required;

        InitializeLists();
        simpleList1.ItemsSource = listSI;
        simpleList2.ItemsSource = listSI;
        complexList1.ItemsSource = listCI;
        complexList2.ItemsSource = listCI;
    }

    private void InitializeLists()
    {
        for (int i = 0; i < 2000000; ++i)
        {
            listSI.Add(new SimpleItem(i));
            listCI.Add(new ComplexItem(i));
        }

    }

    private void Button_Tapped(object sender, TappedRoutedEventArgs e)
    {
        int target = (int)Math.Pow(2, 21);
        int heigthPerItem = 100;

        SimpleItem item = listSI[target / heigthPerItem];
        simpleList1.ScrollIntoView(item);

    }

    private void Button_Tapped_1(object sender, TappedRoutedEventArgs e)
    {
        int target = (int)Math.Pow(2, 21);
        int heigthPerItem = 250;

        SimpleItem item = listSI[target / heigthPerItem];
        simpleList2.ScrollIntoView(item);
    }

    private void Button_Tapped_2(object sender, TappedRoutedEventArgs e)
    {
        int target = (int)Math.Pow(2, 21);
        int heigthPerItem = 333;

        ComplexItem item = listCI[target / heigthPerItem];
        complexList1.ScrollIntoView(item);
    }

    private void Button_Tapped_3(object sender, TappedRoutedEventArgs e)
    {
        int target = (int)Math.Pow(2, 21);
        int heigthPerItem = 500;

        ComplexItem item = listCI[target / heigthPerItem];
        complexList2.ScrollIntoView(item);
    }

    private void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.AddedItems.Count > 0)
        {
            string text = e.AddedItems[0].ToString();
            textblock.Text = text;
        }
    }
}

这应该是结果(有一些信息如何使用它):ListViewBugInterface

这个人与我有problem相同,并说它通过使用VirtualizingStackPanel来修复它,但是从Windows 8.1开始就不需要这样做。

我怀疑这是一个UI虚拟化问题,因为ListViews滚动平滑,项目在滚动时开始出现,可以点击/点击。

有人有这种行为吗?我错过了明显的吗? (例如:没有27k项目的数据集)任何人都知道在2 ^ 21像素后渲染项目的解决方案吗?

TLDR: 当在组合的ListViewItem的2 ^ 21个像素之后显示像素时,它们将停止渲染但仍可以单击。我该如何解决这个问题?

0 个答案:

没有答案