我如何虚拟化一个;类似datagrid的;在XAML/C#(Windows 8.1-WinRT)上水平和垂直控制 问题

我如何虚拟化一个;类似datagrid的;在XAML/C#(Windows 8.1-WinRT)上水平和垂直控制 问题,c#,xaml,windows-runtime,winrt-xaml,win-universal-app,C#,Xaml,Windows Runtime,Winrt Xaml,Win Universal App,我正在尝试在通用应用程序(WinRT)上创建一个“类似datagrid”的控件。 该控件必须显示很多元素(单元),但只有一个小的视图区域,因此它是虚拟化的完美候选,这是它绝对需要的 我如何在水平和垂直方向上实现这种虚拟化? 我尝试的(单向虚拟化) 我尝试过同时使用ListView、GridView和ItemsControl。 很明显,我只能在垂直方向或水平方向上虚拟化这些内容 要实现单向虚拟化并使其看起来像一个表,我必须做的最重要的事情是将其中任何一个(ListView/GridView/It

我正在尝试在通用应用程序(WinRT)上创建一个“类似datagrid”的控件。
该控件必须显示很多元素(单元),但只有一个小的视图区域,因此它是虚拟化的完美候选,这是它绝对需要的

我如何在水平和垂直方向上实现这种虚拟化?

我尝试的(单向虚拟化) 我尝试过同时使用ListView、GridView和ItemsControl。 很明显,我只能在垂直方向或水平方向上虚拟化这些内容

要实现单向虚拟化并使其看起来像一个表,我必须做的最重要的事情是将其中任何一个(ListView/GridView/ItemsControl)的ItemsPanel更改为如下内容:

<ScrollViewer           
       VerticalScrollBarVisibility="Auto" 
       HorizontalScrollBarVisibility="Auto" 
       HorizontalScrollMode ="Auto"
       VerticalScrollMode ="Auto"
       ZoomMode="Disabled"
       ViewChanged="DataGridView_OnViewChanged"
       Width="700">
    <ItemsControl 
            VerticalAlignment="Top"
            HorizontalAlignment="Left"
            ItemsSource="{Binding Cells}"
            Width="{Binding DataGridWidth}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsWrapGrid MaximumRowsOrColumns="{Binding NumberOfColumns}"
                            VirtualizingStackPanel.VirtualizationMode="Recycling"
                            ItemWidth="{Binding CellWidth}"
                            ItemHeight="{Binding CellHeight}"
                            CacheLength="2.0"
                            VerticalAlignment="Top" 
                            HorizontalAlignment="Left" 
                            Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        ...
    </ItemsControl>
</ScrollViewer>

...
注意:“virtualzingstackpanel.VirtualizationMode”和“CacheLenght”在这里并不是必需的。但是请注意,我正在设置ScrollViewer和ItemsControl的宽度。我认为这是唯一一个方向虚拟化的罪魁祸首。因为我给ItemsControl足够的空间来显示项目。问题是,这是使MaximumRowsOrColumns工作并实现“类似DataGrid”控制的唯一方法

此解决方案在大约100 x 100个元素时开始变慢/损坏,因为即使它只显示10行,仍需要绘制10x100个单元格。

所有单元格都具有相同的外观,因此共享相同的数据模板,这有助于获得解决方案

我可以使用任何控件,我只提到ListView、GridView和ItemsControl,因为它们对我来说更明显(解决这个问题)

关于如何在使用XAML/C#的Windows通用应用程序上通过“类似数据网格”的控件实现双向(水平和垂直)虚拟化的想法?

注2:WPF解决方案可能无法与WinRT XAML/C#一起使用。在发布WPF解决方案之前,请检查这一点


我没有这样做,但发现了一些有趣的文章:

1) 您的网格位于ScrollViewer中,尝试使用诸如VirtualzingStackPanel.VirtualizationMode之类的附加属性如何

链接:

2) 如果前面的文章不适合您,我想您可以使用增量虚拟化文章来编写自己的虚拟化机制(我真的认为它们可以用于此)


链接:

我建议一种完全不同的方法:不要将大量数据放入任何形式的UI控件中,只需将GridView(或任何您喜欢的控件)约束为视图区域的大小。当用户“移动数据上方”时,她会有效地将隐藏区域移动到视图区域上方。这意味着您只需相应地更改固定视图区域内单元格的内容。例如,当用户向右移动数据10列时,将视图区域中的内容移动10列,并用10个新数据列填充左侧

您必须将隐藏区域的数据保存在类似于表的数据结构中,以便行/列可以轻松访问

在实现方面,我将使可视数据成为视图模型的一个属性。GridView绑定到此属性。当用户“移动数据”时,只需将数据从类似表的数据缓存复制到视图模型中的该视图区域属性


关于您的实际用例以及您的控件的预期外观和感觉,我几乎没有什么信息,因此我的建议可能很难实现。然而,考虑到您必须显示的大量数据,可能值得一试。

我还没有像我想说的那样在RT中工作,但是否已经没有数据网格可用?您可以去掉列/行标题?不,不幸的是,没有这样的事。显然有一个网格,但它用于布局,而不是数据(并且没有虚拟化功能)控件:PS:我实际上需要标题,我只是简化了我的问题。:)看起来像Teleriks这样的供应商提供了一些通过认证的产品,但我不知道这需要什么,如果我有更多的时间,我会回到这一点上,因为我相信它在某个时候也会出现。同时+1,希望我能帮上更大的忙,哈哈。#1:试过了,什么都没做#2:增量虚拟化只适用于ListView/GridView,我想我不能在我的情况下使用它们(我知道我没有解释)。无论如何,我最大的问题不是ViewModel虚拟化,而是视图虚拟化。我知道这个答案不是最好的。我刚刚更新了更多信息。通常,ItemsWrapGrid会虚拟化每个项目。问题是我正在设置ItemsControl的宽度,所以它不会虚拟化它们,因为它认为它们是可见的。我必须这样做才能使MaximumRowsOrColumns正常工作,并实现一个“类似表格”的控件?在根据设置的列的宽度设置MaximumRowsOrColumns时,是否进行一些计算?为什么不使用ActualWidth/actualheighti如果我没有在Items控件上添加确切的宽度,虚拟化将起作用,因为ItemsWrapGrid将忽略MaximumRowsOrColumns,并在ItemsControl宽度的末尾实际“换行”,因此我不再有水平滚动查看器。但“数据网格”不再有意义,因为第1行的单元格被推送到第2行,以此类推。(这有意义吗?)ActualWidth没有setter,您希望我如何使用它?我已经删除了指向DataGridView的链接。Hoewever,如果你把我的帖子读到最后,在第一段之后不要停下来,我会很感激的。谢谢..不幸的是,我知道HighCore为什么这样评论。:)虽然我不喜欢那样