c# - 实例化特定用户控件时性能显着下降
问题描述
我正在从 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>
解决方案
好的,所以在尝试隔离问题之后,我终于找到了我的问题。它位于SpellCheck.IsEnabled="True"
文本框上。我通过注释掉大部分内容,测试性能,然后取消注释少量直到它在它运行缓慢的机器上运行缓慢,才发现了这一点。
在确定这是原因之后,我在 SO 上找到了一个类似的帖子,其中包含与注册表项相关的信息被字典填充。我似乎在注册表中的那个位置没有条目,所以也许我的问题是相似的,但是它正在寻找并且根本找不到任何东西。
无论如何,我可以在这些领域没有拼写检查,我将删除它。
推荐阅读
- php - ACF:无法从 Post 循环中的关系字段 Post 对象获取标题
- typescript - 编辑后获取更新数据并重定向到另一条路线
- python - 如何从 IDLE 中的 .py 文件单独运行 Python 脚本的选择性部分
- php - 选择查询在同一页面上第二次不起作用
- javascript - 创建选择框或下拉菜单的建议
- c - 如何在不保存其值的情况下重新启动程序(C)
- java - java awt.print 不打印字符串
- c# - 通过 HTTP PUT 将数据存储在 db 中
- powershell - 创建一个唯一变量作为 foreach 的一部分
- php - Drupal - 如何获取看门狗消息并将其显示在页面上?