Add to Technorati Favorites

Навигация между страницами

Опубликовано 24 Июль | Автор LOB
Ключевые слова:, , ,

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

И так начнем, технология на самом деле не сложная, но думаю в будущих версиях все- таки будут придуманы другие средства, но пока в текущей версии, есть один приемлемый вариант, который правда имеет свои недостатки.

Для начала нам понадобится создать несколько страниц, для этого правой клавишей кликаем по нашему проекту и использую “Add new Item” Добавляем несколько страниц. Не будем особо, что-то придумывать назовем их

Page1.xaml
Page2.xaml
Page3.xaml

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

Page1.xaml


<UserControl x:Class="MultiPage.Page1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Width="400" Height="300">
  <StackPanel x:Name="LayoutRoot" Background="White">
	  	<Ellipse Width="100" Height="100" Fill="AntiqueWhite"  />
		  <TextBlock Text="Page 1" Width="100" Height="100"  />
	  	<Button x:Name="Go" Content="Go" Width="100" Click="Go_Click" />
	  </StackPanel>
  </UserControl>

Page2.xaml


<UserControl x:Class="MultiPage.Page2"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Width="400" Height="300">
  <StackPanel x:Name="LayoutRoot" Background="White">
	  	<Rectangle Width="200" Height="100" Fill="Beige"  />
		  <TextBlock Text="Page 2" />
	  	<Button x:Name="Go" Content="Go" Width="100" Click="Go_Click" />
  </StackPanel>
  </UserControl>

Page3.xaml


<UserControl x:Class="MultiPage.Page3"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Width="400" Height="300">
  <StackPanel x:Name="LayoutRoot" Background="White">
		  <Rectangle Width="200" Height="100" Fill="Blue"  />
	  	<TextBlock Text="Page 3" />
	 	 <Button x:Name="Go" Content="Go" Width="100" Click="Go_Click" />
  </StackPanel>
  </UserControl>

На странице App.xaml можно указать один RootVisual элемент, который у нас будет виден, по умолчанию, у нас это будет первый созданный контрол, в нашем случае Page1.xaml. Все это можно увидеть открыв, App.xaml.cs.

Код С#

private void Application_Startup(object sender, StartupEventArgs e)
{
	this.RootVisual = new Page1();
}

Меняем его на следующий

private void Application_Startup(object sender, StartupEventArgs e)
{
	Grid root = new Grid(); //Создаем grid
	this.RootVisual = root; // Делаем его эелментов по умолчанию
	root.Children.Add(new Page1()); // Добавляем в коллекцию контролв Grid наш контрол
}

Чтобы изменить контрол по умолчанию, на просто надо его заменить. Но как сказано в справке SilverLight мы можем присваивать RootVisual, только однажды, как бы тогда в этом случае. Есть одна маленькая хитрость. Создать Layout Control, будем использовать Grid так, как он нам наиболее подходит. Назовем его root и добавим нашему Grid дочерним контролом

private void Application_Startup(object sender, StartupEventArgs e)
{
	Grid root = new Grid();
	Grid.children
	this.RootVisual = new MasterPage();
}

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

Page1

public partial class Page1 : UserControl
{
	Grid root = App.Current.RootVisual as Grid; //Достаем ссылку на RootVisual
	public Page1()
	{
		InitializeComponent();
	}

	private void Go_Click(object sender, RoutedEventArgs e)
	{
		UserControl oldCtrl = this.root.Children[0] as UserControl; //Запоминаем предыдущий контрол
		this.root.Children.Add(new Page2()); // Добавляем новый контрол
		this.root.Children.Remove(oldCtrl); // Удаляем старый контрол
	}
}

Page2

public partial class Page2 : UserControl
{
	Grid root = App.Current.RootVisual as Grid; //Достаем ссылку на RootVisual
	public Page1()
	{
		InitializeComponent();
	}

	private void Go_Click(object sender, RoutedEventArgs e)
	{
		UserControl oldCtrl = this.root.Children[0] as UserControl; //Запоминаем предыдущий контрол
		this.root.Children.Add(new Page3()); // Добавляем новый контрол
		this.root.Children.Remove(oldCtrl); // Удаляем старый контрол
	}
}

Page3

public partial class Page3 : UserControl
{
	Grid root = App.Current.RootVisual as Grid; //Достаем ссылку на RootVisual
	public Page1()
	{
		InitializeComponent();
	}

	private void Go_Click(object sender, RoutedEventArgs e)
	{
		UserControl oldCtrl = this.root.Children[0] as UserControl; //Запоминаем предыдущий контрол
		this.root.Children.Add(new Page1()); // Добавляем новый контрол
		this.root.Children.Remove(oldCtrl); // Удаляем старый контрол
	}
}

 

Как видите, мы получаем ссылку на нашем RootVisual, которым является наш Grid (root). И у него меняем страницы так, как нам необходимо. Здесь можно найти свои реализации. Было конечно классно, если в будущих версиях, все таки, сделали бы нормальную поддержку базовых классов, а пока стоит довольствоваться либо хитростями, либо кривыми решениями.

 

http://silverlightru.net/

http://silverlightru.net/

http://silverlightru.net/

Я здесь рассказал о простой навигации, если будет интересно вы можете, покопать, и более интересные варианты и предложить их здесь.

Popularity: 90% [?]

Add to zakladki:
15 комментария | Примеры | Вся статья

15 Комментария к статье “Навигация между страницами”

  1. Есть целый framework для навигации в Silverlight
    http://dev.net.ua/blogs/sergeylutay/archive/2008/07/07/6433.aspx

  2. Хм… даже такое бывает.

  3. Киря Робски Says:

    А есть, какая нибудь альтернатива? ;)

  4. Спасибо за пост. Позновательно.

  5. Огромное спасибо за инфу. Автору респект и уважуха.

  6. Давно искала эту информацию, спасибо.

  7. Костина Кристина Says:

    Сенкс за информацию, почитала с интересом

  8. >> Робски Киря альтернатива где то рядом.

  9. гуд пост

  10. Хороший пост, всегда с удовольствием Вас читаю.

  11. Насколько я понял данный пример, он предполагает полную загрузку всех сборок на клиента СРАЗУ.
    Интересны подходы, которые позволили бы подгружать те или иные контролы с сервера (XAP файлы, или просто сборки), правильно их идентифицировать и извлекать, и показывать на экране.

  12. Необязательно сразу всех. Можно подгружать динамически. Надо будет просто добавить свою логику.

  13. Навигация между страницами - Территория блога Says:

    [...] http://silverlightru.net/navigaciya-mezhdu-stranicami Published окт 22 2008, 01:03 by admin | [Edit Post] Помечено как: Блог, [...]

  14. ВебПолитолог Says:

    Поздравляю с 8 марта всех читательниц silverlightru.net!!!

  15. Помогите пожалуста с навигацией в TreeView.
    Суть.
    Страница:слева дерево, справа рамка (Border).
    При выборе ветки должна открыться соответствующая страница в рамке.
    Если делать втупую (для каждой ветки своя процедура) все работает.
    Напрашивается использовать Таg ветки для названия страницы, но не получается добраться до него.
    Помогите с кодом процедуры.

    С уважением, Виктор.

Leave a Reply

Ваш Комментарий * [b][/b] - [i][/i] - [u][/u]- [quote][/quote]