重新申请的步骤:
当应用程序启动时,打开组合框以生成项目。现在点击“Click Me!”按钮。在后面的代码中,组合框的itemssource被更改。现在尝试再次打开组合框。即使绑定集合中只有2个项目,组合框也会冻结至少5秒钟。这只是一个测试应用程序。在我的实际应用中,有两个以上的项目,滞后是无法忍受的。我试过这个虚拟化开关。没有区别。
花了这么长时间?我该如何解决?如果没有直接修复,是否有解决方法?
XAML:
<StackPanel>
<ComboBox x:Name="cbo" DisplayMemberPath="Junk1"></ComboBox>
<Button Content="Click Me!" Click="btn_Click"></Button>
</StackPanel>
CODE:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
}
ObservableCollection<Junk> junk1 = new ObservableCollection<Junk>() {
new Junk() { Junk1 = "jdkf", Junk2 = "fjdfkasjd;klfj" },
new Junk() { Junk1 = "jfdk;a", Junk2 = "fjkdljf" } };
ObservableCollection<Junk> junk2 = new ObservableCollection<Junk>() {
new Junk() { Junk1 = "fjkdfhsdjk", Junk2 = "fdjkah;" },
new Junk() { Junk1="", Junk2 = "asdfj" } };
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
this.cbo.ItemsSource = junk1;
}
private void btn_Click(object sender, RoutedEventArgs e)
{
if (this.cbo.ItemsSource == junk1)
this.cbo.ItemsSource = junk2;
else
this.cbo.ItemsSource = junk1;
this.cbo.UpdateLayout();
}
}
public class Junk
{
public string Junk1 { get; set; }
public string Junk2 { get; set; }
}
答案 0 :(得分:1)
看起来这是由调试器处理的大量第一次机会异常引起的。有关MS forums的更长解释,请参阅接受的答案。如果单独运行,相同的构建不会显示任何明显的延迟。
答案 1 :(得分:0)
myermian - 没有其他活动有线。这是整个应用程序。没有其他代码可以获得冻结行为。
Aaron - Junk只是一个标准类。它不是来自任何东西。我试过保留集合,调用.Clear()方法,然后添加新项。我得到完全相同的行为。
AnthonyWJones - 这个错误发生在WPF中。我没有在Silverlight中尝试过。对不起,感到困惑。
答案 2 :(得分:0)
我已完全复制了您的代码,并且按预期运行完美 - 所以我建议您的环境可能有问题。
注意:您不需要调用this.cbo.UpdateLayout();
,因为ItemsSource
是一个依赖项属性,并会在更改时自动更新控件。
答案 3 :(得分:0)
这个问题也发布在这里:
What is causing my WPF combobox items to take so long to refresh when the itemssource is changed?
让我们继续讨论; - )
答案 4 :(得分:0)
此问题在Microsoft已知,并将在4.5中修复。如果没有Visual Studio(通过双击.exe),问题就不会出现。