-
Notifications
You must be signed in to change notification settings - Fork 386
页面加载&窗口跳转
window只能作为根元素显示,所以你无法将window 放置到 window中,
但是你可以通过设置 window.Owner 设置当前窗口的父元素,这样你的子窗口将属于父窗口,它会跟随父窗口事件发生改变。
Page 可以理解为浏览器中的一个页面。
例如将CheckBox 和 Button组合在一起使用,一般用来封装一套重复使用的控件,它和自定义控件有区别。
用户控件 .XAML 和 .CS 是绑定在一起的,但是自定义控件.XAML 和 .CS 是分离的(并且可以只存在.CS)
类似浏览器,支持前进后退。内部只能放置Page容器
可以设置任意内容置于其中。
自带内容切换
① 直接Show方案,在App.xaml.cs中 重写 OnStart, showdilog 出 LoginWindow ,在Login中完成登录逻辑之后关闭LoginWindow,Show出主窗口。为了不缓存login实例,在App.xaml.cs中需要主窗口将设置为MainWindow。
② 内部Frame跳转方案,创建一个FrameWindow,内置Frame,搭配Page Login 和 Page Main,FrameWindow初始化的时候加载 login,当登录成功之后再跳转至Main。(如果你需要切换登录账号,只需要再次跳转至Login,这种方案可以实现单个窗口的Page切换,不会出现等待窗口切换的闪烁 和白屏 问题,前提是 你的2个页面尺寸必须要一致。)
//禁用Frame前进后退等按钮
NavigationUIVisibility="Hidden"
//禁用Frame返回按钮
NavigationCommands.BrowseBack.InputGestures.Clear();
NavigationCommands.BrowseForward.InputGestures.Clear();
以上2种方案可以使用到其他地方。
1.Frame 如果你的菜单有很多项,或者点击菜单出现的页面超过2个阶梯级,考虑使用Frame来做跳转逻辑,当点击A菜单的时候,控制Frame跳转至A,点击B的时候跳转至B。
2.ContentControl 的 Content 可以通过.CS代码或者MVVM绑定方式来控制 这种方式要求最高,你需要学会自己管理页面跳转逻辑和页面的内存占用等等。使用场景类似Frame,相比于Frame,可以加载UserControl等等。
3.TabControl 如果你的菜单只有几个,并且大多数需要长时间驻留CS中的业务,考虑使用TabControl
1.Button 触发Click 或者 Command 去切换页面
2.RadioButton 当触发切换的时候 去加载页面,通过设置GroupName,你可以把菜单分开放到不同的位置,下面是转换器的数据绑定方式。
//首先在后台放置一个自定义的枚举类型
public Menu SelectMenu
//前端布局绑定ViewModel中的SelectMenu,然后用转换器EnumToBooleanConverter,
当勾选菜单的时候会触发 SelectMenu 的Set
<RadioButton
Content="AntDesign"
GroupName="Menu"
IsChecked="{Binding SelectMenu, Mode=TwoWay,
Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=AntDesign}" />
<RadioButton
Content="AduDesign"
GroupName="Menu"
IsChecked="{Binding SelectMenu, Mode=TwoWay,
Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=AduDesign}" />
3.TabItem 点击切换方案,这是本身就有的,但是你可以通过隐藏Tabitem,这样就存在一个隐藏的界面,你无法通过TabControl自带的按钮切换到这个页面,你可以使用其他 触发TabControl 的SelectIndex 或者 SelectItem 跳转至页面。
Frame 中加载某个Page会触发OnLoad,跳转至其他页面的时候触发UnLoad
ContentControl 中每次设置Content会触发内容的Onload,替换内容的时候触发UnLoad
TabControl 每次切换页面都会触发目标页的Load,原标签页触发UnLoad
注意:
1.OnLoad加载初始数据需要注意,OnLoad会被触发多次,
你可以创建成员变量int LoadCount = 0 ,
每次Load 都执行 LoadCount++,你可以判断当前是第几次加载页面。
或者将加载逻辑放置到构造函数中(并采用非阻塞的异步加载方式)。
2.UnLoad代表页面被卸载出XAML逻辑树,不代表页面被销毁,
里面的变量依然存在,线程依然会执行,所以多线程 需要考虑UnLoad之后暂停休眠等等。