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

时间:2018-08-24 15:14:17

标签: c# wpf user-controls datacontext

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

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

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

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

他们在xaml中没有太多的事情,在其他控件中,我在xaml中还有更复杂的内容,因此我认为问题不存在于此。

这两个控件的作用不同,而其他没有此问题的控件则不在.xaml.cs文件的usercontrol的构造函数中,它们设置了数据上下文。

InitializeComponent();
DataContext = new CreateGroupPanelViewModel();

视图模型的构造函数只将一些属性设置为值。主要是一些字符串。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>

1 个答案:

答案 0 :(得分:0)

好的,因此在尝试找出问题之后,我终于找到了我的问题。它位于TextBoxes上的SpellCheck.IsEnabled="True"中。我发现这是通过注释掉大部分内容,测试性能,然后取消注释少量内容直到它在运行缓慢的计算机上运行缓慢而实现的。

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

无论如何,我可以在那些字段中不进行拼写检查,就将其删除。