首页 > 解决方案 > 实例化特定用户控件时性能显着下降

问题描述

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

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

在我的窗口中,我有一个 ContentControl,它绑定到窗口视图模型中的 UserControl 属性。

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

他们在 xaml 中没有发生太多事情,我在其他控件中的 xaml 中有更复杂的东西,所以我认为问题不在于那里。

这两个控件做不同的一件事,没有这个问题的其他控件没有做的是在 .xaml.cs 文件中的用户控件的构造函数中,它们设置了它们的数据上下文。

InitializeComponent();
DataContext = new CreateGroupPanelViewModel();

视图模型的构造器只是将一些属性设置为值。主要是一些字符串到 string.Empty,实例化 2 个 ObservableCollections,将 bool 设置为 true 并将字符串设置为“Create Game”。

第一次打开此控件时,我遇到了问题,但第二次完全没有延迟。另外,如果我运行该程序一分钟左右,然后尝试第一次打开它,它也可以。

我不明白为什么实例化这个用户控件会产生如此巨大的性能影响,或者为什么它会在两台不同的机器上表现得如此不同。

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

标签: c#wpfuser-controlsdatacontext

解决方案


好的,所以在尝试隔离问题之后,我终于找到了我的问题。它位于SpellCheck.IsEnabled="True"文本框上。我通过注释掉大部分内容,测试性能,然后取消注释少量直到它在它运行缓慢的机器上运行缓慢,才发现了这一点。

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

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


推荐阅读