实例化特定用户控件时性能显着下降

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实例化特定用户控件时性能显着下降相关的知识,希望对你有一定的参考价值。

我正在从2个位置开发一个WPF应用程序,一个在Windows 10上有一个强大的PC,另一个有更旧的PC,硬件更差,运行Windows 7。

在Windows 10 PC上,我从未注意到有问题,这只能在Windows 7机器上重现。

在我的Window中,我有一个ContentControl,它绑定到窗口viewmodel中的UserControl属性。

我可以在那里显示不同的用户控件,并且大多数都表现得很好。然而,我有2个,当我尝试加载它们时,它们需要3-5秒,在此期间UI线程挂起。

他们在xaml中没有太多进展,我在其他控件中的xaml中有更复杂的东西,所以我不认为问题就在那里。

这两个控件做的不同之处是,没有这个问题的其他控件没有做的是在.xaml.cs文件中的usercontrol的构造函数中,他们设置了他们的datacontext。

InitializeComponent();
DataContext = new CreateGroupPanelViewModel();

viewmodel的构造函数,只是将一些属性设置为值。主要是字符串到string.Empty,实例化2 ObservableCollection,将bool设置为true并将字符串设置为“Create Game”。

我第一次打开这个控件,我遇到了问题,但第二次它没有任何延迟。此外,如果我运行该程序一分钟左右,然后尝试第一次打开它也没关系。

我无法理解为什么实例化这个用户控件会产生如此巨大的性能损失,或者为什么它会在2台不同的机器上表现得如此不同。

编辑减速发生在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>
答案

好的,所以在试图找出问题之后,我终于找到了我的问题。它位于TextBoxes上的SpellCheck.IsEnabled="True"中。我发现这一点是通过评论大部分,测试性能,然后取消注释少量,直到它在机器上行动缓慢,它行动缓慢。

在确定这是原因之后,我在SO上发现了一个类似的帖子,其中包含有关注册表项填充字典的信息。我似乎没有在注册表中的该位置有一个条目,所以也许我的问题类似,但它看起来,根本找不到任何东西。

无论如何,我可以在这些领域没有拼写检查,我会删除它。

以上是关于实例化特定用户控件时性能显着下降的主要内容,如果未能解决你的问题,请参考以下文章

使用标头而不是 Cookie 定位特定的 Azure Web 应用实例

以编程方式添加控件时未实例化占位符

如何在不使用数据库的情况下重新实例化动态 ASP.NET 用户控件?

在 ARM / Raspberry PI 上的多个内核上运行 Eigen 密集矩阵乘法时性能下降

创建片段而不从 java 代码实例化它

片段事务中的实例化错误