Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 渲染性能:GridView与代码生成的UI_C#_Gridview_Windows Phone 8_Windows Phone 8.1 - Fatal编程技术网

C# 渲染性能:GridView与代码生成的UI

C# 渲染性能:GridView与代码生成的UI,c#,gridview,windows-phone-8,windows-phone-8.1,C#,Gridview,Windows Phone 8,Windows Phone 8.1,回到以前使用WindowsPhone7的时候,我已经成功地编写了一个很长的代码,模仿某种包装,从代码后面生成一个UI,在左边显示小时,在右边列出所有分钟数(用于出发数据)。添加8个条目后,它会创建一个新行 它的结构是这样的: StackPanel(垂直):包含不同小时的所有行 堆叠面板(水平): 文本块:小时 StackPanel(垂直):包含水平StackPanel,每个StackPanel存储8个文本块,其中包含分钟 结果示例: 08 05 10 15 20 25 30 35 40

回到以前使用WindowsPhone7的时候,我已经成功地编写了一个很长的代码,模仿某种包装,从代码后面生成一个UI,在左边显示小时,在右边列出所有分钟数(用于出发数据)。添加8个条目后,它会创建一个新行

它的结构是这样的:

  • StackPanel(垂直):包含不同小时的所有行
  • 堆叠面板(水平):
    • 文本块:小时
    • StackPanel(垂直):包含水平StackPanel,每个StackPanel存储8个文本块,其中包含分钟
结果示例:

08  05 10 15 20 25 30 35 40
    45 50 55
09  10 20 30 40 50
对于WindowsPhone8.1,我想我应该使用一个带有分组的GridView,而不是更新以前的代码。这样我就可以使用绑定的所有强大功能。然而,GridView渲染180-200个文本块大约需要2-3秒,这有点令人失望

<CollectionViewSource x:Name="DepartureData" Source="{Binding DepartureData}" IsSourceGrouped="True" ItemsPath="Entries" />

<GridView x:Name="listTimetable"
          ItemsSource="{Binding Source={StaticResource DepartureData}}"
          Grid.Column="1">
    <GridView.GroupStyle>
        <GroupStyle HidesIfEmpty="True">
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding FormattedHour}" 
                               Foreground="Black" FontSize="20" FontWeight="Bold"
                               HorizontalAlignment="Center"
                               Margin="0,0,15,0" />
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </GridView.GroupStyle>
    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsWrapGrid GroupHeaderPlacement="Left" Orientation="Horizontal" ItemHeight="40" ItemWidth="34" />
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>
    <GridView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding FormattedMinute}"
                       Style="{StaticResource TimetableDataActive}" />
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>


从代码隐藏中生成UI将带来更好的性能,但这无疑会使维护代码变得更加困难。GridView和代码隐藏解决方案在时间上存在巨大差异的原因可能是什么?可能是绑定本身减慢了呈现过程,或者GridViewItems附带了更多的ContentPresenter、Borders等?

好的,当我写这个问题时,最后一句话出现在我的脑海中,似乎它已经回答了这个问题

GridViewItem的样式包含许多(有时是不必要的)元素。边框、占位符、选择框等。您可以在以下位置选中它们:

当您有大量数据希望在不与之交互的情况下显示时,强烈建议减少这些GridViewItems中的UI数据量。下面的代码显示了一个示例:

<GridView.ItemContainerStyle>
    <Style TargetType="GridViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ContentPresenter x:Name="contentPresenter"
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                  Margin="{TemplateBinding Padding}" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</GridView.ItemContainerStyle>
<GridView.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding FormattedMinute}"
                   Style="{StaticResource TimetableDataActive}" />
    </DataTemplate>
</GridView.ItemTemplate>

样式已缩减为仅ContentPresenter-您将需要它,因为这将显示模板中定义的内容-并且使用了相同的模板。这样,UI在半秒钟内呈现。我希望我能用这个例子帮助你们中的一些人