Как динамически добавлять / удалять контроль с помощью Expression Blend?

Пока я иду, я сделал демонстрационное приложение с Expression Blend.

Мой первый экран - большой выбор кнопок, поэтому, когда пользователь нажимает любую кнопку, он переходит в MainView.

Затем в MainView у меня есть список пунктов меню, которые пользователь может щелкнуть, и отображается соответствующий ему DisplayView. (Пункт меню "Назначение" отображает AppointmentView и т. Д.).

Все хорошо, я могу щелкнуть по MenuItem, покажутся виды с эффектами анимации и перехода.

Но дело в том, что с созданием в Expression Blend, MainView, Menu, AppointmentView и т. Д. Каждая вещь предопределена в XAML. Поэтому, когда пользователь загружает первый экран, он должен загрузить все в память.

Подумав об этом, разве MainView и т. Д. Не должны динамически добавляться на экран? Как мне сделать это с Expression Blend? Или единственный способ сделать это - просто... сделать это в коде позади себя (написать StoryBoard и т. Д. Для динамических элементов управления добавлением / удалением?)

Если есть какой-нибудь пример / учебник по этому, это будет здорово.

1 ответ

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

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

На мой взгляд, самый простой способ контролировать внешний вид какого-либо элемента управления - это использовать элемент управления с одним ребенком. Возьмите, например, элемент управления Border и добавьте пользовательский элемент управления, который вы хотите условно загрузить, в его дочернее свойство, чтобы вы могли решить, например, загружать или выгружать элемент управления.

Но, к сожалению, я думаю, что вы должны делать это и в коде. Возьмите этот простой фрагмент кода:

// either instantiate in code or use from markuup
Border myBorder = new Border();

// the control you want to conditionally appear and disappear
UserControl myUserControl = new UserControl();
myBorder.Child.Add(myUserControl);

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

// either instantiate in code or use from markuup
Grid myGrid = new Grid();

// the control you want to conditionally appear and disappear
UserControl myUserControl = new UserControl();

// set the target position inside the Grid via the Grids attached properties
Grid.setRow(myUserControl, 1);
Grid.setColumn(myUserControl, 0);

// actually add the control
Grid.Children.Add(myUserControl);

Хотя я уверен, что вы знали обо всем этом, я надеюсь, что это немного помогло:)

Другие вопросы по тегам