Вопрос

У меня есть приложение WPF, в котором я хотел бы создать собственное всплывающее окно с модальным поведением.Мне удалось взломать решение, используя эквивалент DoEvents, но есть ли лучший способ сделать это?Вот что у меня есть на данный момент:

    private void ShowModalHost(FrameworkElement element)
    {
        //Create new modal host
        var host = new ModalHost(element);

        //Lock out UI with blur
        WindowSurface.Effect = new BlurEffect();
        ModalSurface.IsHitTestVisible = true;

        //Display control in modal surface
        ModalSurface.Children.Add(host);

        //Block until ModalHost is done
        while (ModalSurface.IsHitTestVisible)
        {
            DoEvents();
        }
    }

    private void DoEvents()
    {
        var frame = new DispatcherFrame();
        Dispatcher.BeginInvoke(DispatcherPriority.Background,
            new DispatcherOperationCallback(ExitFrame), frame);
        Dispatcher.PushFrame(frame);            
    }

    private object ExitFrame(object f)
    {
        ((DispatcherFrame)f).Continue = false;

        return null;
    }

    public void CloseModal()
    {
        //Remove any controls from the modal surface and make UI available again
        ModalSurface.Children.Clear();
        ModalSurface.IsHitTestVisible = false;
        WindowSurface.Effect = null;
    }

Где мой ModalHost — это пользовательский элемент управления, предназначенный для размещения другого элемента с анимацией и другой поддержкой.

Это было полезно?

Решение

Я бы рекомендовал переосмыслить этот дизайн.

Использование «DoEvents» может вызвать очень странное поведение в определенных ситуациях, поскольку вы разрешаете запуск кода и в то же время пытаетесь его заблокировать.

Вместо использования всплывающего окна вы можете рассмотреть возможность использования окна с Показатьдиалог, и просто оформите его соответствующим образом.Это был бы «стандартный» способ реализации модального поведения, и WPF позволяет довольно легко стилизовать окно так, чтобы оно выглядело точно так же, как всплывающее окно...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top