导致速度减慢的命令

时间:2014-11-15 18:22:46

标签: wpf performance command

首先,我完全清楚这个例子是多么做作,而且缺乏虚拟化,但是我用它来演示我在一个更复杂的系统中遇到的问题,这个问题很难节目。这似乎是一种展示它的简单方法。

以下代码创建一个菜单和一个绑定到大型字符串列表的ItemsControl(我使用10,000个),每个都被视为一个按钮。

<DockPanel>
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="Test">
            <MenuItem Header="A" />
            <MenuItem Header="B" />
            <MenuItem Header="C" />
        </MenuItem>
    </Menu>

    <Expander IsExpanded="True">
        <ScrollViewer>
            <ItemsControl ItemsSource="{Binding LotsOfStrings}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Button Content="Open" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </Expander>
</DockPanel>

正如预期的那样,加载速度很慢,但一旦加载,“测试”菜单就会响应(也就是说,当您将鼠标悬停在菜单项上时,没有明显的延迟。)

现在对按钮添加命令进行以下小改动。

<Button Content="Open" Command="Open"/>

现在菜单变得非常迟钝。出于某种原因,将鼠标悬停在不同的菜单项上会调用CommandManager.InvalidateRequerySuggested(),这会针对每个按钮执行,从而导致速度变慢。

所以我想知道是否还有禁用对不可见控件的命令更新?所以在这个例子中,如果扩展器被折叠,我可以在停止按钮处理命令更新吗?

0 个答案:

没有答案