using System.Windows; using System.Windows.Controls; using PCL.Core.App; using PCL.Core.App.Localization; namespace PCL; public partial class PageToolsLeft { private bool isLoad; private bool isPageSwitched; // 如果在 Loaded 前切换到其他页面,会导致触发 Loaded 时再次切换一次 public PageToolsLeft() { InitializeComponent(); AnimatedControl = PanItem; Loaded += PageLinkLeft_Loaded; Unloaded += PageOtherLeft_Unloaded; } private void PageLinkLeft_Loaded(object sender, RoutedEventArgs e) { var isHiddenPage = false; var hide = Config.Preference.Hide; if (ItemGameLink.Checked && hide.ToolsGameLink) isHiddenPage = true; if (ItemTest.Checked && hide.ToolsTest) isHiddenPage = true; if (PageSetupUI.HiddenForceShow) isHiddenPage = false; // 若页面错误,或尚未加载,则继续 if (isLoad && !isHiddenPage) return; isLoad = true; // 刷新子页面隐藏情况 PageSetupUI.HiddenRefresh(); // 选择第一个未被禁用的子页面 if (isPageSwitched) return; var hideCfg = Config.Preference.Hide; if (!hideCfg.ToolsGameLink) ItemGameLink.SetChecked(true, false, false); else if (!hideCfg.ToolsTest) ItemTest.SetChecked(true, false, false); else ItemGameLink.SetChecked(true, false, false); } private void PageOtherLeft_Unloaded(object sender, RoutedEventArgs e) { isPageSwitched = false; } public void Refresh(object sender, EventArgs e) { var button = (MyIconButton)sender; if (button.Tag is null) return; double id = ModBase.Val(button.Tag); switch (id) { case (double)FormMain.PageSubType.ToolsGameLink: { if (ModMain.frmToolsGameLink is null) ModMain.frmToolsGameLink = new PageToolsGameLink(); ModMain.frmToolsGameLink.Reload(); ItemGameLink.Checked = true; break; } } } #region 页面切换 /// /// 当前页面的编号。 /// public FormMain.PageSubType pageID = FormMain.PageSubType.ToolsGameLink; /// /// 勾选事件改变页面。 /// private void PageCheck(object senderRaw, ModBase.RouteEventArgs e) { var sender = (MyListItem)senderRaw; // 尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 // 若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) if (sender.Tag is not null) PageChange((FormMain.PageSubType)ModBase.Val(sender.Tag)); } public object PageGet(FormMain.PageSubType? id = null) { var targetID = id ?? pageID; switch (id) { case FormMain.PageSubType.ToolsGameLink: { if (ModMain.frmToolsGameLink is null) ModMain.frmToolsGameLink = new PageToolsGameLink(); return ModMain.frmToolsGameLink; } case FormMain.PageSubType.ToolsTest: { if (ModMain.frmToolsTest is null) ModMain.frmToolsTest = new PageToolsTest(); return ModMain.frmToolsTest; } default: { throw new Exception("未知的更多子页面种类:" + (int)id); } } } /// /// 切换现有页面。 /// public void PageChange(FormMain.PageSubType id) { if (pageID == id) return; ModAnimation.AniControlEnabled += 1; isPageSwitched = true; try { PageChangeRun((MyPageRight)PageGet(id)); pageID = id; } catch (Exception ex) { ModBase.Log( ex, $"切换分页面失败(ID {(int)id})", ModBase.LogLevel.Feedback, userSummary: Lang.Text("Tools.Error.OperationFailed")); } finally { ModAnimation.AniControlEnabled -= 1; } } private static void PageChangeRun(MyPageRight target) { ModAnimation.AniStop("FrmMain PageChangeRight"); // 停止主页面的右页面切换动画,防止它与本动画一起触发多次 PageOnEnter if (target.Parent is not null) target.SetValue(ContentPresenter.ContentProperty, null); ModMain.frmMain.pageRight = target; ((MyPageRight)ModMain.frmMain.PanMainRight.Child).PageOnExit(); ModAnimation.AniStart(new[] { ModAnimation.AaCode(() => { ((MyPageRight)ModMain.frmMain.PanMainRight.Child).PageOnForceExit(); ModMain.frmMain.PanMainRight.Child = ModMain.frmMain.pageRight; ModMain.frmMain.pageRight.Opacity = 0d; }, 130), ModAnimation.AaCode(() => { // 延迟触发页面通用动画,以使得在 Loaded 事件中加载的控件得以处理 ModMain.frmMain.pageRight.Opacity = 1d; ModMain.frmMain.pageRight.PageOnEnter(); }, 30, true) }, "PageLeft PageChange"); } #endregion }