Значительное снижение производительности при создании конкретных пользовательских контролей - PullRequest
0 голосов
/ 24 августа 2018

Я разрабатываю приложение WPF из 2-х мест: у одного на Windows 10 сложный компьютер, у другого - гораздо более старый ПК с худшим оборудованием, работающий под управлением Windows 7.

на ПК с windows 10, я никогда не замечал проблемы, это воспроизводимо только на машине с Windows 7.

В моем Окне у меня есть ContentControl, который связан со свойством UserControl в модели окна.

Я могу показать различные пользовательские элементы управления, и большинство из них ведет себя хорошо. Однако у меня есть 2, которые, когда я пытаюсь загрузить их, занимают буквально 3-5 секунд, в течение которых поток пользовательского интерфейса зависает.

В xaml ничего особенного не происходит, у меня есть более сложные вещи в xaml в других элементах управления, поэтому я не думаю, что проблема в этом.

Единственное, что эти 2 элемента управления делают по-разному, чего не делают другие элементы управления, у которых нет этой проблемы, - это конструктор для usercontrol в файле .xaml.cs, они устанавливают свой datacontext.

InitializeComponent();
DataContext = new CreateGroupPanelViewModel();

Конструктор для модели представления, просто устанавливает некоторые свойства в значения. Главным образом некоторая строка в строку. Пустая, создает экземпляр 2 ObservableCollections, устанавливает bool в true и устанавливает строку в «Создать игру».

В первый раз, когда я открываю этот элемент управления, у меня возникает проблема, но во второй раз он вообще не создает задержки. Кроме того, если я запустил программу в течение минуты или около того и ТОГДА попробую открыть ее в первый раз, все будет в порядке.

Я не могу понять, почему создание этого пользовательского элемента управления может привести к такому огромному падению производительности или почему оно будет действовать по-разному на двух разных компьютерах.

EDIT Замедление происходит внутри InitializeComponent (); пользовательского контроля.

Вот XAML такого элемента управления:

<UserControl x:Class="CasinoDB.UserControls.ModifyPanels.UCModifyGamePanel"
             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:local="clr-namespace:CasinoDB.UserControls.ModifyPanels"
             xmlns:vm="clr-namespace:CasinoDB.ViewModels"
             mc:Ignorable="d"
             d:DesignHeight="500" d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="{Binding Header}" HorizontalAlignment="Center" Margin="5" FontWeight="Bold" FontSize="20" />

        <StackPanel Grid.Row="1" HorizontalAlignment="Center">
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <TextBlock Text="Name:" Margin="5" />
                <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" Margin="5" MinWidth="150" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <TextBlock Text="RTP:" Margin="5" />
                <TextBox Text="{Binding RTP, UpdateSourceTrigger=PropertyChanged}" Margin="5" MinWidth="50" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <TextBlock Text="Variance:" Margin="5" />
                <TextBox Text="{Binding Variance, UpdateSourceTrigger=PropertyChanged}" Margin="5" MinWidth="150" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <TextBlock Text="Lines:" Margin="5" />
                <TextBox Text="{Binding Lines, UpdateSourceTrigger=PropertyChanged}" Margin="5" MinWidth="100" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <TextBlock Text="Min Bet:" Margin="5" />
                <TextBox Text="{Binding MinBet, UpdateSourceTrigger=PropertyChanged}" Margin="5" MinWidth="50" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <TextBlock Text="Max Win:" Margin="5" />
                <TextBox Text="{Binding MaxWin, UpdateSourceTrigger=PropertyChanged}" Margin="5" MinWidth="75" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <TextBlock Text="Vendor:" Margin="5" />
                <TextBox Text="{Binding Vendor, UpdateSourceTrigger=PropertyChanged}" Margin="5" MinWidth="150" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <TextBlock Text="Notes:" Margin="5" />
                <TextBox Text="{Binding Notes}" Margin="5" Width="250" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" SpellCheck.IsEnabled="True" Height="75" VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True" />
            </StackPanel>
            <CheckBox Content="Create Another" IsChecked="{Binding CreateAnother}" Margin="5" Visibility="{Binding ShowCreateAnother, Converter={StaticResource BooleanToVisibilityConverter}}" HorizontalAlignment="Center" HorizontalContentAlignment="Center" />
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="5">
                <Button Content="SAVE" Command="{Binding Save}" Margin="5" Style="{StaticResource ConfirmButton}" />
                <Button Content="CLOSE" Command="{Binding Close}" Margin="5" />
            </StackPanel>
        </StackPanel>
    </Grid>
</UserControl>

1 Ответ

0 голосов
/ 04 сентября 2018

ОК, поэтому после попытки изолировать проблему я наконец нашел свою проблему. Он находится в SpellCheck.IsEnabled="True" на TextBoxes. Я обнаружил это, закомментировав большие разделы, протестировав производительность, а затем раскомментировав небольшое количество, пока он не работал медленно на машине, а на медленной.

После выяснения этой причины я обнаружил аналогичный пост в SO с информацией, касающейся записи в реестре, заполняемой словарями. Похоже, у меня нет записи в этом месте в реестре, поэтому, возможно, моя проблема была похожей, но она выглядела и ничего не могла найти.

В любом случае, я могу жить без проверки орфографии в этих полях, я просто уберу это.

...