如何在XAML/C#上虚拟化"像数据网格一样"水平和垂直控制(Windows 8.1 - WinRT)

Din*_*ira 9 c# xaml windows-runtime winrt-xaml win-universal-app

问题

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

对于这样的事情,我如何能够横向和纵向进行虚拟化?

示例

我尝试了什么(单向虚拟化)

我尝试过使用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>
Run Code Online (Sandbox Code Playgroud)

注意:"VirtualizingStackPanel.VirtualizationMode"和"CacheLenght"在那里并不是必需的.但请注意,我在ScrollViewer和ItemsControl上设置了Width.我认为这是使虚拟化仅在一个方向上的罪魁祸首.因为我给ItemsControl足够的空间来显示项目.问题是,这是使MaximumRowsOrColumns工作并实现"DataGrid like"控件的唯一方法.

这个解决方案开始变得缓慢/破碎,大约100 x 100个元素,因为即使它只显示10行,它仍然是10x100个单元格.

Cell都具有相同的外观和感觉,因此共享相同的DataTemplate,这应该有助于获得解决方案.

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

关于如何使用XAML/C#在Windows Universal Apps上使用"DataGrid like"控件实现双向(水平和垂直)虚拟化的任何想法?

注2:WPF解决方案可能不适用于WinRT XAML/C#.请在发布WPF解决方案之前检查一下.

Che*_*ese 1

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

1)您的网格位于 ScrollViewer 中,尝试使用 VirtualizingStackPanel.VirtualizationMode 等附加属性怎么样?

链接:https://msdn.microsoft.com/en-us/library/system.windows.controls.virtualizingstackpanel.virtualizationmode%28v=vs.110%29.aspx

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

链接:https ://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh780657.aspx