Почему мой выпадающий список зависает при изменении источника предметов? - PullRequest
1 голос
/ 24 ноября 2010

Действия по репродукции:

Когда приложение запустится, откройте выпадающий список, чтобы сгенерировать элементы.Теперь нажмите «Click Me!»кнопка.В приведенном ниже коде источник элементов в поле со списком изменен.Теперь попробуйте снова открыть список.Поле со списком останавливается как минимум на 5 секунд, хотя в связанной коллекции только 2 элемента.Это всего лишь тестовое приложение.В моем реальном приложении более 2 пунктов, и отставание невыносимо.Я пробовал это с виртуализацией и выключением.Это не имеет значения.

Что занимает так много времени?Как это исправить?Если прямого исправления нет, есть ли обходной путь?

XAML:

    <StackPanel>
        <ComboBox x:Name="cbo" DisplayMemberPath="Junk1"></ComboBox>
        <Button Content="Click Me!" Click="btn_Click"></Button>
    </StackPanel>

КОД:

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; }
}

Ответы [ 5 ]

1 голос
/ 11 января 2012

Похоже, что это вызвано множеством исключений первого шанса, обрабатываемых отладчиком. Более подробное объяснение можно найти на форумах MS , см. Принятый ответ. Эта же сборка не показывает заметных задержек, если запускается отдельно.

0 голосов
/ 21 сентября 2012

Эта проблема известна в Microsoft и будет исправлена ​​в версии 4.5.Без Visual studio (путем двойного щелчка .exe) проблема не появляется.

https://connect.microsoft.com/VisualStudio/feedback/details/633826/combobox-isdropdownopen-true-causes-app-to-lock-up

0 голосов
/ 25 ноября 2010

Я точно скопировал ваш код, и он работает отлично, как и ожидалось - поэтому я предполагаю, что в вашей среде что-то не так.

Примечание: вам не нужно вызывать this.cbo.UpdateLayout();, поскольку ItemsSource является свойством зависимости и будет автоматически обновлять элемент управления при его изменении.

0 голосов
/ 22 сентября 2011
0 голосов
/ 25 ноября 2010

myermian - другие события не связаны. Это все приложение. Нет другого кода, необходимого для получения режима замораживания.

Аарон - Хлам это просто стандартный класс. Это не происходит ни от чего. Я попытался сохранить коллекцию, вызвав метод .Clear (), а затем добавив новые элементы. Я получаю точно такое же поведение.

AnthonyWJones - ошибка в WPF. Я не пробовал это в Silverlight. Извините за путаницу.

...