Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 导致减速的命令_Wpf_Performance_Command - Fatal编程技术网

Wpf 导致减速的命令

Wpf 导致减速的命令,wpf,performance,command,Wpf,Performance,Command,首先,我完全知道这个例子有多么做作,它缺乏虚拟化,但我用它来演示我在一个更复杂的系统中遇到的一个问题,这个问题很难表现出来。这似乎是一个简单的证明方法 下面的代码创建了一个菜单和一个ItemsControl,绑定到一个大的Strings列表,我使用10000,每个都被看作一个按钮 <DockPanel> <Menu DockPanel.Dock="Top"> <MenuItem Header="Test"> &l

首先,我完全知道这个例子有多么做作,它缺乏虚拟化,但我用它来演示我在一个更复杂的系统中遇到的一个问题,这个问题很难表现出来。这似乎是一个简单的证明方法

下面的代码创建了一个菜单和一个ItemsControl,绑定到一个大的Strings列表,我使用10000,每个都被看作一个按钮

<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.InvalidateRequestySuggested,该命令将针对每个按钮执行,从而导致速度减慢


所以我想知道是否有任何方法可以在不可见的控件上禁用命令更新?因此,在本例中,如果扩展器被折叠,我可以告诉您如何停止按钮继续处理命令更新吗?

您可以发布与您的问题相关的命令代码吗,谢谢。这是使用了一个实际上没有做任何事情的命令,can Execute始终为true,Execute没有做任何事情。但这似乎不是问题所在,我认为问题在于指挥基础设施在幕后做了大量工作