powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Использование Frame
8 сообщений из 8, страница 1 из 1
Использование Frame
    #37383123
ДокторКОТ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет! Вопрос по разработке 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
Использование Frame
    #37383163
ДокторКТО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И главный вопрос: как в Page можно передать какие-то данные из основного окна (например, ссылку на объект класса)?
...
Рейтинг: 0 / 0
Использование Frame
    #37383221
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокторКТОИ главный вопрос: как в Page можно передать какие-то данные из основного окна (например, ссылку на объект класса)?

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

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

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

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

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

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

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

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

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


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