WPF: Лучший способ поднять всплывающее окно, которое является модальным для страницы? - PullRequest
16 голосов
/ 09 января 2009

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

Я пробовал использовать всплывающий элемент управления WPF, но проблема в том, что элемент управления скрывается при каждом переходе от страницы. Я думаю, что я могу написать код, чтобы показать его снова, но не выглядит правильно.

Каков наилучший способ сделать это в WPF?

Ответы [ 4 ]

17 голосов
/ 25 февраля 2009

Этот ответ StackOverflow может помочь вам на вашем пути. Я создал пример кода, который просили другие пользователи. Я добавил это в сообщение в блоге здесь .

Надеюсь, это поможет!

5 голосов
/ 12 ноября 2010

Почему бы просто не использовать вложенные насосы сообщений для создания модальных элементов управления

http://www.deanchalk.com/wpf-modal-controls-via-dispatcherframe-nested-message-pumps/

3 голосов
/ 25 февраля 2009

Вы можете создать всплывающий класс, который использует слой adorner, чтобы поставить себя поверх всего остального.

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

Чтобы остановить элементы управления, которые находятся под щелчком во всплывающем окне, вы можете использовать всплывающее окно в полный размер страницы. Вы бы сделали его в основном прозрачным, за исключением действительной середины, где всплывающее окно. Если вы хотите, чтобы он был полностью прозрачным, за исключением всплывающего окна, вам нужно переопределить HitTestCore в вашем всплывающем окне.

Примерно так:

protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
    // We want this control to behaive as a single rectangle and we don't much care
    // whether or it has a solid background.  So we override this method so we can have    // mouse over info for the entire panel regardless of background.

    // run the base hit test first, because if it finds something we don't want to overrule it.
    HitTestResult result = base.HitTestCore(hitTestParameters);


    // If we didn't get a hit generate a new hit test result, because HitTestCore is never called unless
    // the mouse is over the controls bounding rectangle.
    if (result == null)
        result = new PointHitTestResult(this, hitTestParameters.HitPoint);

    return result;
}

Надеюсь, это может указать вам правильное направление.

1 голос
/ 09 января 2009

Windows не любит, когда вы это делаете - это не WPF. Используйте накладную панель и используйте свойство visible или zorder.

Википедия имеет хорошее обсуждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...