Что последнее событие должно запустить при загрузке нового окна WPF/C#?

Я думаю, что проблема состоит в том, что это вызывает упаковку, потому что структуры являются типами значения, таким образом, существует небольшая потеря производительности.

Эта ссылка предполагает, что могли бы быть другие проблемы с нею...

http://blogs.msdn.com/abhinaba/archive/2005/10/05/477238.aspx

19
задан Ben McIntosh 16 November 2009 в 20:46
поделиться

6 ответов

Лучшее решение для простой потребности

Ответ Джозефа - безусловно, лучшее решение для вашей простой потребности: просто используйте привязку данных и позвольте модели данных обрабатывать его.

Ответьте на вопрос как posed

Есть более сложные сценарии, когда вам действительно нужен контроль после того, как абсолютно все загрузилось и все события сработали. Нет ни одного события, которое происходит «мертвым последним», но легко эффективно свернуть свое собственное, используя очередь диспетчера.

Вот как это сделать:

Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() =>
{
  var x = ComputeSomething(1, 2, 3);
  DoSomething(x, "Test");
}));

Все внутри {} будет выполнено, когда WPF завершит все с более высоким приоритетом, чем ContextIdle, включая все обработчики событий, загруженные события, события ввода, рендеринг и т. д.

Последовательность событий при создании и отображении Окна

По запросу, что вызывает дополнительное построение дерева объектов, включая дополнительные конструкторы и геттеры / сеттеры

  • Окно и все несвернутые визуалы в нем упорядочены

  • Окно и его потомки (как логические, так и визуальные) получают событие Loaded

  • Любое привязки данных, которые потерпели неудачу, когда они были впервые установлены, повторяются

  • Окну и его потомкам предоставляется возможность визуализировать свое содержимое визуально

  • Шаги 1-2 выполняются, когда окно создается, независимо от того, отображается оно или нет. Другие шаги обычно не выполняются, пока не отображается окно, но они могут произойти раньше, если запускаться вручную.

    53
    ответ дан 30 November 2019 в 01:54
    поделиться

    Не для того, чтобы бросать в вас много вещей, которые могут быть вам знакомы, а могут и нет, но если это относительно новая кодовая база, вы можете рассмотреть возможность использования шаблона MVVM и использовать Команды вместо архаичной (выделено мной) модели событий.

    1
    ответ дан 30 November 2019 в 01:54
    поделиться

    Я проделал то же самое в приложении WPF в системном трее.

    Однако я не делал этого с помощью обработки событий. Я просто привязал свойство Enabled моей кнопки к свойству в моей ViewModel и обновлял это свойство всякий раз, когда мне требовалось такое поведение.

    11
    ответ дан 30 November 2019 в 01:54
    поделиться

    Вы можете использовать ManagedSpy, чтобы выяснить это самостоятельно.

    http://msdn.microsoft.com/en-us/magazine/cc163617.aspx

    5
    ответ дан 30 November 2019 в 01:54
    поделиться

    Установка DataContext, скорее всего, вызовет событие SelectionChanged, и вы не можете полагаться на то, когда именно оно запускается. Некоторая логическая проверка того, что именно выбрано, была бы более надежной:

    private void ComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if (myComboBox.SelectedItem == null) 
        { 
          buttonApply.IsEnabled = false;
        }
        else 
        {
          buttonApply.IsEnabled = true;
        }
    }
    

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

    1
    ответ дан 30 November 2019 в 01:54
    поделиться

    Порядок событий в Windows Forms

    Control.HandleCreated

    Control.BindingContextChanged

    Form.Load

    Control.VisibleChanged

    Form.Activated

    Форма .Shown

    -3
    ответ дан 30 November 2019 в 01:54
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: