locked
Где находится Application.DoEvents в WPF? RRS feed

  • Общие обсуждения

  • В отличии от Windows Forms, WPF на прямую не предоставляет Application.DoEvents() эквивалента, позволяющего разработчикам начать вложенную подкачку сообщений (pumping). Когда вы пишите windows приложения, вам лучше попытаться избежать вложенных подкачек сообщений(nested message pumping), потому что вложенная подкачка сообщений (nested message pumping) может вызвать некоторые тонкие проблемы, такие как повторный вход кода, и что более вероятно, WPF отключит ( nested message pumping ) вложенную подкачку сообщений во время выполнения компоновки, обхода визуального дерева кроме всего прочего.
    Но если вдруг возникнет такая редкая ситуация, когда вложенная подкачка сообщений (nested message pumping) будет полезна, следующий вспомогательный класс может обеспечить Application.DoEvents в WPF
    /// <summary>
    /// Encapsulates a WPF dispatcher with added functionalities.
    /// </summary>
    public class DispatcherHelper
    {
        private static DispatcherOperationCallback exitFrameCallback = new
             DispatcherOperationCallback(ExitFrame);
    
        /// <summary>
        /// Processes all UI messages currently in the message queue.
        /// </summary>
        public static void DoEvents()
        {
            // Create new nested message pump.
            DispatcherFrame nestedFrame = new DispatcherFrame();
    
            // Dispatch a callback to the current message queue, when getting called,
            // this callback will end the nested message loop.
            // note that the priority of this callback should be lower than that of UI event messages.
            DispatcherOperation exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke(
                DispatcherPriority.Background, exitFrameCallback, nestedFrame);
    
            // pump the nested message loop, the nested message loop will immediately
            // process the messages left inside the message queue.
            Dispatcher.PushFrame(nestedFrame);
    
            // If the "exitFrame" callback is not finished, abort it.
            if (exitOperation.Status != DispatcherOperationStatus.Completed)
            {
                exitOperation.Abort();
            }
        }
    
        private static Object ExitFrame(Object state)
        {
            DispatcherFrame frame = state as DispatcherFrame;
    
            // Exit the nested message loop.
            frame.Continue = false;
            return null;
        }
    }
    

    Для связи [Mail]
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 22:47 MSDN Forums consolidation (От:Разработка Windows-приложений)
    17 марта 2010 г. 11:35
    Модератор