实例化特定用户控件时性能显着下降
Significant performance drop when instantiating specific usercontrols
我正在从 2 个位置开发 WPF 应用程序,一个在 windows 10 上有一台功能强大的 PC,另一个在 运行ning Windows 上有一台硬件更差的旧 PC 7.
在 windows 10 PC 上,我从未注意到问题,这只能在 windows 7 机器上重现。
在我的 Window 中,我有一个 ContentControl 绑定到 window 的视图模型中的 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 上发现了一个类似的 post,其中包含与注册表项相关的信息,这些信息被字典填满了。我在注册表的那个位置似乎没有条目,所以也许我的问题是类似的,但它正在寻找但根本找不到任何东西。
无论如何,我可以在那些字段中不用拼写检查,我会删除它。
我正在从 2 个位置开发 WPF 应用程序,一个在 windows 10 上有一台功能强大的 PC,另一个在 运行ning Windows 上有一台硬件更差的旧 PC 7.
在 windows 10 PC 上,我从未注意到问题,这只能在 windows 7 机器上重现。
在我的 Window 中,我有一个 ContentControl 绑定到 window 的视图模型中的 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 上发现了一个类似的 post,其中包含与注册表项相关的信息,这些信息被字典填满了。我在注册表的那个位置似乎没有条目,所以也许我的问题是类似的,但它正在寻找但根本找不到任何东西。
无论如何,我可以在那些字段中不用拼写检查,我会删除它。