Поменять элементы управления в Silverlight - PullRequest
0 голосов
/ 04 марта 2009

У меня есть элемент управления Grid с 6 строками и 6 столбцами.

В верхнем ряду у меня есть выпадающий список, который может иметь два состояния. (Новый или подержанный)

Когда я нахожусь в состоянии New, у меня есть два элемента управления. Желтый Контроль в строке 3, Кол 1 и Красный Контроль в строке 5, Кол 1

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

Возможно ли это в Silverlight?

Ответы [ 4 ]

1 голос
/ 04 марта 2009

Что вы действительно хотите, так это триггеры WPF. К сожалению, триггеры не поддерживаются в Silverlight, поэтому это не вариант для вас.

Вы можете попробовать класс VisualStateManager. Разумеется, его основная цель - поддерживать переходы между визуальными состояниями элемента управления, и, таким образом, он использует раскадровки и выполняет любые свойства; следовательно, он может не работать со свойством Grid.Column.

Тим Хойер имеет краткое введение VSM . Вот мнение о недостатках VSM .

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

Или вы могли бы просто иметь свой собственный метод, который вы вызываете при изменении состояния (вы должны знать, когда это происходит), и явно изменять свойство Grid.Column на двух элементах управления. Основным недостатком является то, что ваш код теперь имеет явные знания о визуальном представлении и компоновке, а также о том, как он связан с состоянием.

0 голосов
/ 01 апреля 2009

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

myContainerGrid.Children.Clear();
myContainerGrid.Children.Add(myNewControl);

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

- Matt

0 голосов
/ 04 марта 2009

На самом деле класс Grid содержит такие методы, как:

Grid.SetRow (controlName, row_position); Grid.SetColumn (controlName, col_position); Grid.SetColumnSpan (controName, integer);

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

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

0 голосов
/ 04 марта 2009

Для этого вы можете использовать метод SetValue .

Вы можете сделать это в обработчике выпадающего списка следующим образом:

<code>
            _rowPanel1 = 2;
            _rowPanel2 = 1;
            panel1.SetValue(Grid.RowProperty, _rowPanel1);
            panel2.SetValue(Grid.RowProperty, _rowPanel2);

Если пойти дальше, вы можете привязать свойство Grid.RowProperty (и / или столбец) на панели к свойство clr класса, реализующего INotifyPropertyChanged.

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