Пользовательское модальное окно в WPF?
-
22-09-2019 - |
Вопрос
У меня есть приложение 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 позволяет довольно легко стилизовать окно так, чтобы оно выглядело точно так же, как всплывающее окно...