Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Использование Frame / 8 сообщений из 8, страница 1 из 1
05.08.2011, 22:13
    #37383123
ДокторКОТ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Frame
Привет! Вопрос по разработке UI на WPF.

У меня типичная задача: в зависимости от нажимаемых кнопок (расположенных сверху в ряд) нужно менять содержимое рабочей области (т.е. того, что ниже).
Есть 4 известных мне варианта, как это сделать:
1. Накидать ВСЕ контролы на окно, хайдить все ненужные, показывать нужные- крайне неудобно, часто контролы занимают одно и то же место.

2. Положить на окно tabControl, и раскидать все контролы по его вкладкам, потом показывать нужную вкладку. Хорошо, когда переключение и так задумано как вкладки - но это не всегда так! Я понимаю, что программно можно спрятать сами хедеры вкладок, и никто даже не поймет, что это tabControl. Но это неудобно на стадии дизайна. Вобщем, тоже не комильфо.

3. Сделать каждый набор контролов как один userControl, кинуть их все на окно, показывать нужный, остальным hide - похож на в.1, аналогичные неудобства. И логически не совсем верно: это все-таки не user-контролы, а группы контролов на разные ситуации.

4. Положить на окно Frame, сделать к нему нужное количество Page, и подгружать их. По-моему самый удобный вариант! НО есть проблемы:

1. Я что-то не пойму толком: эти Frame+Page принято использовать только для web'а, silverlit'а и т.п., а для описанной задачи их используют??
2. Появляется дурацкая панель навигации. Ладно, отключил в свойствах. А вот звуковой щелчок при переходе убрать никак не могу!!!
3. Не могу растянуть страницу. Т.е. фрейм привязан ко всем 4 сторонам, растягивается вместе с основным окном, а страница внутри фрейма - отображается в своем оргинальном размере (там просто грид, без фиксированного размера). Как заставить ее растягиваться внутри фрейма?

спасибо заранее.
...
Рейтинг: 0 / 0
05.08.2011, 23:18
    #37383163
ДокторКТО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Frame
И главный вопрос: как в Page можно передать какие-то данные из основного окна (например, ссылку на объект класса)?
...
Рейтинг: 0 / 0
06.08.2011, 01:43
    #37383221
Верблюд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Frame
ДокторКТОИ главный вопрос: как в Page можно передать какие-то данные из основного окна (например, ссылку на объект класса)?

В UI ничего передавать не нужно. UI сам должен тянуть данные из источника. К источнику можно привязать несколько элементов пользовательского интерфейса. Для оповещения об изменении данных в источнике данных можно сделать с помощью интерфейса INotifyPropertyChanged. И да, про MVVM/MVC почитайте хотя бы поверхностно, что ли.
...
Рейтинг: 0 / 0
06.08.2011, 08:00
    #37383271
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Frame
Начинать изобретать свои велосипеды с самого начала - это не то, что доктор прописал.
Самый простой способ - показывать usercontrol'ы в ContentControl.
Чтобы с этим не было головной боли нужна таблетка - сервис навигации.
Варианты борьбы с этим можно посмотреть в готовых решениях(Prism,Caliburn,etc)
...
Рейтинг: 0 / 0
06.08.2011, 08:35
    #37383275
ДокторКот
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Frame
Верблюд,

Странно, почему UI должен сам тянуть? Вот в MVP например: есть View (в нашем случае - страничка), он реализует интерфейс IView, под которым его знает Presenter, и этот самый Presenter инициирует обновление View (если изменилась Model). В любом случае непонятно, как в Page передать ХОТЬ ЧТО-ТО) Реализовать в странице интерфейс я могу, но как получить ссылку на экземпляр страницы?

Если я создаю обычное модальное окно, то через конструктор класса могу при создании передать все, что надо, и в том числе ссылку на объект, реализовавший INotifyPropertyChanged чтобы в самом окне его забиндить. Но как в Page можно что-то передать, в т.ч. источник данных, если оно создается просто вот так:
Код: plaintext
1.
frameCard.Source = new Uri("PageCard.xaml", UriKind.RelativeOrAbsolute);
...
Рейтинг: 0 / 0
06.08.2011, 09:48
    #37383289
LxTLT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Frame
ДокторКТОИ главный вопрос: как в Page можно передать какие-то данные из основного окна (например, ссылку на объект класса)?

у Frame есть свойство ExtraData

Код: plaintext
1.
Frame.Navigate(new Uri(uri, UriKind.RelativeOrAbsolute), ExtraData)

можно передать любой объект.

Как вариант, можно из любого места получить доступ к главному окну. Например:

Код: plaintext
1.
(Application.Current.MainWindow as MainWindow).MainFrame; //......
...
Рейтинг: 0 / 0
06.08.2011, 10:04
    #37383296
ДокторКОТ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Frame
LxTLT,

о, спасибо! Первый вариант больше понравился (хотя передавать через object как-то устаревше, да что поделать).
...
Рейтинг: 0 / 0
06.08.2011, 19:01
    #37383618
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Frame
Window .GetWindow уже отменили?
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Использование Frame / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]