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
}