参考资料:http://www.silverlightchina.net/html/tips/2010/0119/600.html
1.跳转
我是使用的根视图,来进行跳转的。其实这一步的跳转就是登陆也与内容主页之间的跳转,期间没有传值。因为我觉得用户名还是定义在app.xaml中,设置成全局的比较好。 以下是实现,我就不详细介绍了直接引用了:
●使用根视图(Root
Visual)
上面是一个简单的例子,这个方法很常见,但不是通用方式。它的小缺陷是整个页面布局已经固定死了,工具栏或页面始终都固定在那里,那如果你想要的是一个全新的页面就不行了。下面对这个小例子进行一下扩展就可以达到我们的目的了。
首先在App.xaml.cs中声明一个Grid:
private Grid rootGrid
= new Grid();
然后修改Appliaction_Startup事件代码:
this.RootVisual = rootGrid;
rootGrid.Children.Add(new Page1());
这样只能保证在初始化的时候会有一个页面而不能导航,为此在App.xaml.cs代码中加入一个静态方法,代码如下:
public static void Navigation(UserControl newPage)
{
//获取当前的Appliaction实例
App currentApp = (App)Application.Current;
//修改当前显示页面内容.
currentApp.rootGrid.Children.Clear();
currentApp.rootGrid.Children.Add(newPage);
}
这里要注意
方法的参数是UserControl。这样在你的UserControl中即可添加如下的代码(可以加到button事件中)进行页面切换了:
App.Navigation(new Page2());
new的对象是你的目标页面,不要写错了。就这几句代码又完成了咱们的目的!
●保存页面状态(Cache)
如果你想让用户在返回到历史页面的时候可以页面的修改状态比如用户输入的数据。首先对项目进行一下小小的修改,添加一个名字叫Pages的enmu,用于保存页面名称以便使用字符串产生不必要的问题:
public enum Pages
{
Page1,
Page2
}
下一步是在App.cs代码中加入一个泛型集合用于保存页面:
private static Dictionary<Pages, UserControl> pageCache = new Dictionary<Pages, UserControl>();
其中Key是Pages枚举,Value是UserControl。然后从新定义Naviagte方法:
public static void Navigation(Pages newPage)
{
App currentApp = (App)Application.Current;
if (!pageCache.ContainsKey(newPage))
{
//根据名称使用反射创建目标页面实例,并加入缓存
Type type =
currentApp.GetType();
Assembly assembly
= type.Assembly;
pageCache[newPage] =
(UserControl)assembly.CreateInstance(
type.Namespace + "." + newPage.ToString());
}
currentApp.rootGrid.Children.Clear();
currentApp.rootGrid.Children.Add(pageCache[newPage]);
}
这样在其他的UserControl中调用如下代码就可以进行切换了:
App.Navigation(Pages.Page2);
当我们登陆之后跳转到主页之后,剩下的就是tab标签之间的跳转了,在该页面添加一个TabControl,在添加一个button按钮,点击按钮就会动态添加一个tab标签(跳转到另一个xaml页面)
private void button1_Click(object sender, RoutedEventArgs e) { TabItem temptb = new TabItem(); tab1 uc = new tab1(textBox1.Text);//要跳转的xaml页面 ,tab1 temptb.Header = "tab"; temptb.Width = 100; temptb.Content = uc; this.tabControl1.Items.Add(temptb); tabControl1.SelectedIndex = tabControl1.Items.Count - 1; }
页面跳转大体就这样了,说的比较笼统。剩下 的就是传值了。
2.传值
1.登陆页与主页之间的传值:
在app.xaml.cs,声明一个全局变量,存储登陆的用户名等。在登录按钮事件中,给这个变量赋值。
App pub = Application.Current as App; string name=pub.Name;//直接可以用
在另一个页面要用这个变量的时候,直接就可以使用了
App pub = Application.Current as App; string name=pub.Name;
2.tab页之间的传值。
http://silverlightchina.net/html/tips/2012/0517/16024.html
我们首先在MainPage2.xaml.cs中定义好参数的属性或则构造函数参数,例如:
public long ID { get; set; }
public string PWD { get; set; }
或者:
public MainPage2(long id, string pwd) {
InitializeComponent();
}
当需要由MainPage1向MainPage2切换时,在Canvas或Grid中我们先移除掉MainPage1实例:
LayoutRoot.Children.Remove(mainPage1);
然后携带参数创建MainPage2的实例:
MainPage2 mainPage2 = new MainPage2() {
ID = p1,
PWD = p2,
...
};
或者:
MainPage2 mainPage2 = new MainPage2(p1, p2,…);
最后将mainPage2添加进LayoutRoot:
LayoutRoot.Children.add(mainPage2);
其实就是利用公开属性或者构造函数传值,当我们在tab页之间跳转的时候,直接在点击事件实例化页面的时候直接传值就可以了。
由于第一次发技术贴,逻辑可能有点乱。新手望各位指正。。