/// <summary> /// این رویه مسئول پر کردن جایگاه نمایش زیر صفحه با صفحه معرفی شده است. /// </summary> /// <param name="Page">زیر صفحه یا فرزند جانشین</param> /// <param name="ClearStack">اگر بخواهیم زیر صفحه جایگزین کنیم پشته ی نسل قبلی باید پاک شود. اگر بخواهیم فرزند اضافه کنیم نباید پشته نسل جاری را پاک کنیم.</param> private void ShowPage(FormBase Page, bool ClearStack) { if (ClearStack) { PageStack.Clear(); } // برای جلوگیری از کلیک های متعدد ابتدا فرم را غیر فعال میکنیم MainGrid.IsEnabled = false; Page.OnRedirectTo -= Page_RedirectTo; Page.OnRedirectTo += Page_RedirectTo; Page.OnShowChild -= Page_ShowChildPage; Page.OnShowChild += Page_ShowChildPage; Page.OnClosePageAsChild -= Page_CloseChildPage; Page.OnClosePageAsChild += Page_CloseChildPage; PageStack.Push(Page); // TODO: باید تمام کنترل های گرید اصلی بجز دیالوگ جدید ما غیر فعال و پس از خروج از دیالوگ فعال شوند var fade = new DoubleAnimation() { From = 1, To = 0, Duration = TimeSpan.FromMilliseconds(300), }; Storyboard.SetTarget(fade, MainGrid); Storyboard.SetTargetProperty(fade, new PropertyPath(UIElement.OpacityProperty)); var sb = new Storyboard(); sb.Children.Add(fade); sb.Completed += (sender, e) => { MainGrid.Children.Clear(); MainGrid.Children.Add(Page); // پس از اتمام عملیات فرم را فعال میکنیم. MainGrid.IsEnabled = true; var Fade2 = new DoubleAnimation() { From = 0, To = 1, Duration = TimeSpan.FromMilliseconds(300), }; Storyboard.SetTarget(Fade2, MainGrid); Storyboard.SetTargetProperty(Fade2, new PropertyPath(UIElement.OpacityProperty)); var Sb2 = new Storyboard(); Sb2.Children.Add(Fade2); Sb2.Begin(); }; sb.Begin(); }
/// <summary> /// هرگاه یک زیر صفحه از جنس فرزند بسته شود باید از پشته حذف شود و زیر صفحه پیشین جایگزین شود. /// </summary> /// <param name="DialogPage">فرزند بسته شده</param> /// <param name="Result">نتیجه اجرای فرزند</param> private void Page_CloseChildPage(FormBase DialogPage, PageResult Result) { if (PageStack != null) { if (PageStack.Count > 0) { var Page = PageStack.Pop(); ShowPage(PageStack.Peek(), false); } } }
/// <summary> /// هرگاه صفحه اصلی بخواهد در نظم نمایش صفحات دست ببرد از این متد استفاده میکند. /// </summary> /// <param name="TargetPage">زیر صفحه مقصد</param> public void RedirectPage(FormBase TargetPage) { ShowPage(TargetPage, true); }
/// <summary> /// هر گاه یک زیر صفحه بخواهد به کار خود خاتمه دهد و با زیر صفحه ی دیگری جایگزین شود این رویداد را فراخوانی میکند /// </summary> /// <param name="Page">زیر صفحه مقصد</param> private void Page_RedirectTo(FormBase Page) { ShowPage(Page, true); }
/// <summary> /// برای نمایش فرزند؛ زیر صفحات این رویداد را فراخوانی میکنند. /// </summary> /// <param name="Page">فرزند نسل بعدی</param> private void Page_ShowChildPage(FormBase Page) { Page.IsChild = true; ShowPage(Page, false); }
/// <summary> /// صفحاتی که در آنها خاصیت /// IsChild = True /// است باید این رخداد را در محل مناسب فراخوانی کنند. /// برای اینکه بتوانیم در کلاس های فرزند این رویداد تحریک کنیم این متد را طراحی کردیم /// </summary> /// <param name="Page">صفحه جاری</param> /// <param name="Result">نتیجه صفحه</param> public void ClosePageAsChild(FormBase Page, PageResult Result) { OnClosePageAsChild?.Invoke(Page, Result); }
/// <summary> /// برای نمایش یک زیر صفحه از جنس فرزند از این رویداد استفاده میشود /// برای اینکه بتوانیم در کلاس های فرزند این رویداد تحریک کنیم این متد را طراحی کردیم /// </summary> /// <param name="Page">صفحه فرزند</param> public void ShowChild(FormBase Page) { OnShowChild?.Invoke(Page); }
/// <summary> /// با فراخوانی این رویداد هر زیر صفحه میتواند فرمان هدایت به زیر صفحه ی دیگر را به مدیر صفحات ارسال کند /// برای اینکه بتوانیم در کلاس های فرزند این رویداد تحریک کنیم این متد را طراحی کردیم /// </summary> /// <param name="Page">صفحه ای که میخواهیم به آن منتقل شویم.</param> public void RedirectTo(FormBase Page) { OnRedirectTo?.Invoke(Page); }