WPF C # сокращает время рендеринга для разметки пользовательского контроля - PullRequest
0 голосов
/ 07 февраля 2019

Здравствуйте. У меня проблема с загрузкой моей страницы WPF, это заняло более 2 секунд, моя страница содержит 2 просмотра списка, один просмотр списка содержит ~ 70 элементов, а второй содержит ~ 355 элементов, конечно, все скажут, что вы используете виртуализацию, и вы сделали, даон использовался, но не на listview, а на более высоком уровне, так как мое приложение использует один метод scrollviever = одна страница, я считаю, что из-за этого метода виртуализация не работает должным образом, поскольку, если бы она работала, время загрузки было бы намного лучше, одна строка заняла бы между15-25ms для рендеринга

Это мой проблемный код:

<UserControl x:Class="app.OS.Tabs.Controls.SectionATabs"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:helpButton="clr-namespace:app.COMMON.USERCONTROLS.HelpButton"
         xmlns:Buttons="clr-namespace:app.COMMON.USERCONTROLS.Buttons"
         mc:Ignorable="d" 
         Height="Auto"
         Width="Auto"
         MinHeight="120">
<VirtualizingStackPanel IsVirtualizing="True" ScrollViewer.CanContentScroll="True" >
    <TextBlock MaxWidth="948" Text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book." TextWrapping="Wrap" Style="{StaticResource GrayText}" Margin="0,15,0,7"/>
    <ListView x:Name="DataList"
                                    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                                    ScrollViewer.VerticalScrollBarVisibility="Disabled"
                                    VirtualizingPanel.IsVirtualizing="False"
                                    ScrollViewer.CanContentScroll="False"
                                    SelectionMode="Single" ItemContainerStyle="{StaticResource ListViewItemWithGridStandard}" BorderBrush="{x:Null}" Foreground="{x:Null}"
          >
        <ListView.View>
            <GridView ColumnHeaderContainerStyle="{StaticResource HeaderRemover}" AllowsColumnReorder="False">
                <GridViewColumn Width="400">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <DockPanel Height="47">
                                <TextBlock TextTrimming="CharacterEllipsis" ToolTip="{Binding Description,IsAsync=True,Mode=OneWay}"  MaxWidth="360" Style="{StaticResource BlackText}" Height="21" DockPanel.Dock="Top">
                                    <Run Text="{Binding Description,IsAsync=True,Mode=OneWay}"/>
                                    <helpButton:HelpButton KeyToSearch="{Binding KeyToSearch,IsAsync=True,Mode=OneWay}" SectionToUse="sectionA" HeaderButton="False" />
                                </TextBlock>
                                <TextBlock Style="{StaticResource GrayText}" VerticalAlignment="Bottom" >Current: <Run Text="{Binding CurrentValue,IsAsync=True,Mode=OneWay}"/><LineBreak/>Good Value:<Bold>0%</Bold></TextBlock>
                            </DockPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Width="540">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Width="528">
                                <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
                                    <StackPanel>
                                        <Buttons:Buttons x:Name="DefaultValueButton" OnClick="DefaultValueButton_OnOnClick" ButtonContent="Default" ButtonData="{Binding Index,IsAsync=True,Mode=OneWay}" DisabledBorderBrush="{StaticResource SeparatorColor}" DisabledBackgroundBrush="{StaticResource WhiteColor}" DisabledTextForegroundBrush="{StaticResource GrayForText}" ActiveBackgroundBrush="{StaticResource HeaderColor}" ActiveBorderBrush="{StaticResource BorderColor}" ActiveTextForegroundBrush="{StaticResource BorderColor}" IsActive="{Binding IsDefault,IsAsync=True,Mode=OneWay}"/>
                                        <TextBlock HorizontalAlignment="Center" Style="{StaticResource GrayText}">(<Run Text="{Binding DefaultValue,IsAsync=True,Mode=OneWay}"></Run>)</TextBlock>
                                    </StackPanel>
                                    <StackPanel Margin="9,0,0,0">
                                        <Buttons:Buttons x:Name="RecommendedValueButton" OnClick="RecommendedValueButton_Click"  ButtonContent="Recommended" ButtonData="{Binding Index,IsAsync=True,Mode=OneWay}" DisabledBorderBrush="{StaticResource SeparatorColor}" DisabledBackgroundBrush="{StaticResource WhiteColor}" DisabledTextForegroundBrush="{StaticResource GrayForText}" ActiveBackgroundBrush="{StaticResource HddColor}" ActiveBorderBrush="{StaticResource BorderColor}" ActiveTextForegroundBrush="{StaticResource WhiteColor}" IsActive="{Binding IsRecommended,IsAsync=True,Mode=OneWay}"/>
                                        <TextBlock HorizontalAlignment="Center" Style="{StaticResource GrayText}">(<Run Text="{Binding RecommendedValue,IsAsync=True,Mode=OneWay}"></Run>)</TextBlock>
                                    </StackPanel>
                                    <Rectangle Width="1" Fill="{StaticResource SeparatorColor}" Height="24" Margin="16,0" VerticalAlignment="Top" />
                                    <StackPanel Orientation="Horizontal" VerticalAlignment="Top">
                                        <Buttons:Buttons x:Name="EnableCustomValuesButton" OnClick="EnableCustomValuesButton_Click"  ButtonContent="Custom" ButtonData="{Binding Index,IsAsync=True,Mode=OneWay}" DisabledBorderBrush="{StaticResource SeparatorColor}" DisabledBackgroundBrush="{StaticResource WhiteColor}" DisabledTextForegroundBrush="{StaticResource GrayForText}" ActiveBackgroundBrush="{StaticResource CpuColor}" ActiveBorderBrush="{StaticResource BorderColor}" ActiveTextForegroundBrush="{StaticResource WhiteColor}" IsActive="{Binding IsCustom,IsAsync=True,Mode=OneWay}"/>
                                        <StackPanel Orientation="Horizontal" Visibility="{Binding IsCustomEnabled,IsAsync=True,Mode=OneWay}" VerticalAlignment="Top" >
                                            <Border CornerRadius="3" BorderThickness="1" BorderBrush="{StaticResource SeparatorColor}" Width="90" Margin="7,0">
                                                <Border.Clip>
                                                    <RectangleGeometry RadiusX="5" RadiusY="5" Rect="0 0, 90 25"/>
                                                </Border.Clip>
                                                <TextBox Width="86" Height="23"  x:Name="CustomValue" Text="{Binding CustomInputValue,IsAsync=True,Mode=OneWay}" BorderBrush="{x:Null}" HorizontalAlignment="Center" />
                                            </Border>
                                            <Buttons:Buttons x:Name="CustomValueApply" OnClick="CustomValueApply_Click"  ButtonContent="Apply" ButtonData="{Binding Index,IsAsync=True,Mode=OneWay}" DisabledBorderBrush="{StaticResource BorderColor}" DisabledBackgroundBrush="{StaticResource WhiteColor}" DisabledTextForegroundBrush="{StaticResource BorderColor}"/>
                                        </StackPanel>
                                    </StackPanel>
                                </StackPanel>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</VirtualizingStackPanel>

Это может вызвать вопросы. Кнопки: кнопки - это пользовательский контроль, внутри - это граница, а внутри - граница.textblock, helpButton: HelpButton - это пользовательский контроль внутри, это граница, внутри - это холст с текстовым блоком и изображением (через некоторое время изображение отключается и только в первый раз отображается только изображение), headerremover устанавливает видимость GridViewColumnHeader для свернутого, ListViewItemWithGridStandard - это стиль, который изменяет Control.Template добавление внутри Border, а внутри него добавляет GridViewRowPresenter, как вы можете видеть, что SectionATabs является tabcontrol> tabitem child, но tabcontrol находится на странице между страницей, а tabcontrol является scrolviewer.page и scrollviewer имеют фиксированную высоту (maxheight также одинаковая), которая равна 501, также страница создается задолго до того, как пользователь нажимает в первый раз, я думаю, что я все сказал, что теперь можно сделать, чтобы сократить время загрузки?Спасибо.

...