Как лучше всего добавить всплывающее окно в визуальное дерево при использовании MVVM на WP7 - PullRequest
4 голосов
/ 08 марта 2011

Я использую MVVM через Caliburn Micro на WP7.У меня есть всплывающее окно, которое показано с ВМ.Во всплывающем окне отображается индикатор выполнения.Индикатор выполнения не отображается, если для IsIndeterminate задано значение true, поскольку всплывающее окно отсутствует в дереве визуалов (это пользовательский элемент управления).

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

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

Ответы [ 3 ]

1 голос
/ 08 марта 2011

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

Элемент управления может прослушивать события в источнике для выполнения своей работы, он хорошо отделен и даже может тестироваться модулем.

Хорошим примером этого является мой Элемент управления индикатором состояния модель представления предоставляет StatusSource с такими методами, как Display и Clear.Сам элемент управления привязан к источнику и прослушивает изменения.Оттуда вы можете делать все что угодно, в том числе создавать всплывающее окно и вставлять его в визуальное дерево.

0 голосов
/ 11 марта 2011

Я закончил тем, что создал базовый класс всплывающих окон и добавил этот код в:

private void HookIntoPage()
{
    if (UserControlHelper.RootVisual != null)
    {
        PhoneApplicationPage page = (PhoneApplicationPage)UserControlHelper.RootVisual.Content;

        // Hook up into the back key press event of the current page
        page.BackKeyPress += BackKeyPress;

        FrameworkElement element = page.FindVisualChild("MainGrid");

        if (element != null && element is Grid)
        {
            Grid grid = element as Grid;
            grid.Children.Add(this);
        }
        else
        {
            throw new Exception("Popup cannot find MainGrid");
        }
    }
}

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

Здесь есть 2 вспомогательных класса. UserControlHelper имеет следующие методы:

public static PhoneApplicationFrame RootVisual
{
    get
    {
        return Application.Current == null ? null : Application.Current.RootVisual as PhoneApplicationFrame;
    }
}

FindVisualChild происходит от класса VisualTreeHelperExtension, который поставляется с Phone7.Fx.preview, который я использую для его привязываемой панели приложений.

0 голосов
/ 08 марта 2011

Вы работаете с дизайнером?Я обнаружил, что выполнение чего-либо на основе представления в коде, кроме загрузки данных, сбивает с толку и / или расстраивает их.Я бы порекомендовал создать 2 визуальных состояния, одно с показанным всплывающим окном, а другое скрытым, чтобы дизайнер мог видеть, как выглядит приложение, и переключать (и стилизовать) всплывающее окно в Blend.Затем я использую DataStateBehavior или DataStateSwitchBehavior для управления всплывающим окном с моей виртуальной машины.

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