วิธีนำทางผ่านหน้าโมดอลใน Xamarin.Forms โดยใช้ Fresh.MVVM

ฉันพยายามพุชหน้าโมดอลในแอปแบบฟอร์ม xamarin โดยใช้ MVVM เมื่อกดปุ่ม ฉันรู้วิธีใช้สแต็กการนำทางแล้ว แต่ไม่รู้ว่าจะทำอย่างไรกับหน้าเนื้อหาเป็นหน้าโมดอล ฉันได้ลองหลายสิ่งหลายอย่าง โดยเฉพาะอย่างยิ่งการเรียกใช้เมธอด PushPageModel

นี่คือสิ่งสุดท้ายที่ฉันได้ลอง: ดูหรือเพจ:

<Label
                x:Name="forgottenPasswordLabel"
                Text="Forgot password?"
                TextColor="LightPink"
                FontSize="16"
                FontAttributes="Bold"

                VerticalOptions="Start"
                HorizontalOptions="End"
                Margin="25,0,25,25">
                <Label.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding ForgotPasswordCommand}"/>
                </Label.GestureRecognizers>
</Label>

คลาส ViewModel:

public class LogInViewModel : FreshBasePageModel
    {
        public ICommand ForgotPasswordCommand { get; set; }

        public LogInViewModel()
        {
        }

        public override void Init(object initData)
        {
            ForgotPasswordCommand = new Command (async() =>
            {
                var newPage = FreshPageModelResolver.ResolvePageModel<ForgottenPasswordViewModel>();
                await CoreMethods.PushPageModel<ForgottenPasswordViewModel>(null, false, true);
            }); 
        }
    }

คลาส App.xaml.cs:

public App()
        {
            InitializeComponent();

            MainPage = FreshPageModelResolver.ResolvePageModel<LogInViewModel>();
        }

รหัสนี้แสดงข้อผิดพลาดต่อไปนี้: "FreshTinyIoC.TinyIoCResolutionException: 'แก้ไขล้มเหลว: IFreshNavigationService"

นั่นคือทั้งหมด หากคุณต้องการข้อมูลเพิ่มเติม ฉันจะแจ้งให้ทราบทันทีที่ฉันเห็นคำขอของคุณ ขอขอบคุณทุกท่านที่สละเวลา หวังว่าคุณจะมีวันดีๆ

แก้ไข: ร้องขอการติดตามสแต็ก:

ที่ FreshTinyIoC.FreshTinyIoCContainer.ResolveInternal (FreshTinyIoC.FreshTinyIoCContainer+การลงทะเบียน TypeRegistration, พารามิเตอร์ FreshTinyIoC.NamedParameterOverloads, ตัวเลือก FreshTinyIoC.ResolveOptions) [0x000f7] ใน C:"นี่คือเส้นทาง" ที่ FreshTinyIoC.FreshTinyIoCContainer แก้ไข (System.Type solveType, System. ชื่อสตริง) [0x00000] ใน C:\"นี่คือเส้นทาง" ที่ FreshTinyIoC.FreshTinyIoCContainer.Resolve[ResolveType] (ชื่อ System.String) [0x00000] ใน C:"นี่คือเส้นทาง" ที่ FreshMvvm.FreshTinyIOCBuiltIn.Resolve[ ResolveType] (ชื่อ System.String) [0x00000] ใน C: "นี่คือเส้นทาง" ที่ FreshMvvm.PageModelCoreMethods.PushPageModelWithPage (หน้า Xamarin.Forms.Page, FreshMvvm.FreshBasePageModel pageModel, ข้อมูล System.Object, System.Boolean modal, System .Boolean animate) [0x00177] ใน C:"นี่คือเส้นทาง" ที่ FreshMvvm.PageModelCoreMethods.PushPageModel (FreshMvvm.FreshBasePageModel pageModel, ข้อมูล System.Object, System.Boolean modal, System.Boolean animate) [0x00048] ใน C:" นี่คือเส้นทาง" ที่ FreshMvvm.PageModelCoreMethods.PushPageModel[T] (ข้อมูล System.Object, System.Boolean modal, System.Boolean animate) [0x00040] ใน C:"นี่คือเส้นทาง" ที่ FirstApp.ViewModels.LogInViewModel.b__5_0 () [0x0003a] ใน D:\"นี่คือเส้นทาง"


person Jaime Santos    schedule 08.02.2020    source แหล่งที่มา
comment
จากสิ่งที่ฉันเข้าใจถึงข้อยกเว้นคือ มีบางอย่างใน ForgottenPasswordViewModel หรือมุมมองของคุณที่เป็นสาเหตุของปัญหานี้ มีบางอย่างที่อาจทำให้เกิดข้อยกเว้น หรือคุณไม่ได้ปฏิบัติตามโครงสร้างโฟลเดอร์หรือ FreshMVVM ในตอนนี้ เพื่อให้เราเข้าใจสิ่งนี้ได้ง่ายขึ้น คุณจะต้องเพิ่ม Stracktrace สำหรับข้อยกเว้นนี้ที่นี่!   -  person FreakyAli    schedule 08.02.2020
comment
@FreakyAli ฉันจะรับการติดตามสแต็กสำหรับข้อยกเว้นได้อย่างไร   -  person Jaime Santos    schedule 08.02.2020
comment
เพิ่มบล็อก try-catch ในบล็อก catch เมื่อมีการส่งข้อยกเว้น วัตถุข้อยกเว้นมี StackTrace ของคุณ! หากคุณมีข้อยกเว้น นี่คือสถานที่ที่ดีที่สุดในการเริ่มต้นค้นหาปัญหานี้!   -  person FreakyAli    schedule 08.02.2020
comment
@FreakyAli ฉันอัปเดตคำถามนี้ด้วย StackTrace!   -  person Jaime Santos    schedule 08.02.2020
comment
ไม่พบอินสแตนซ์ของ IFreshNavigationService ดังนั้นฉันไม่คิดว่าคุณเริ่มต้น FreshMVVM อย่างถูกต้อง ในบางจุด TinyIOC จำเป็นต้องได้รับการบอกวิธีสร้างตัวอย่างบริการนำทาง ฉันสงสัยว่ามันจะทำงานกับเพจที่ไม่ใช่โมดอลได้เช่นกัน   -  person Ben Reierson    schedule 08.02.2020


คำตอบ (1)


ปัญหาคือความเข้าใจผิดในแนวคิด ฉันคิดว่าหน้าเนื้อหาและหน้าการนำทางเป็นหน้าสองประเภทที่แตกต่างกัน เช่น หน้าแท็บ หน้ารายละเอียดหลัก หน้าแบบหมุน และหน้าเนื้อหา ดังนั้นฉันจึงพยายามที่จะไม่ใช้โค้ดต่อไปนี้โดยคิดว่า FreshNavigationContainer บังคับให้ฉันใช้หน้าการนำทาง ไม่ใช่หน้าเนื้อหา ซึ่งเป็นเรื่องจริงแต่ไม่สมบูรณ์ เพราะใช่ มันบังคับให้คุณใช้หน้าการนำทาง แต่คุณก็ใช้เช่นกัน หน้าเนื้อหา เนื่องจากหน้าการนำทางเป็นคุณสมบัติของหน้าเนื้อหา ดังนั้นอย่างที่ฉันบอกว่ามันเป็นความเข้าใจผิดของแนวคิดทั้งหมด:

public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            var thePage = FreshPageModelResolver.ResolvePageModel<LogInViewModel>();
            MainPage = new FreshNavigationContainer(thePage);
        }
}

ฉันไม่ได้พูดสิ่งนี้กับคำถาม แต่จุดประสงค์ทั้งหมดนี้คือการไม่เห็นแถบที่ด้านบนของหน้าจอ ซึ่งตอนนี้ฉันเข้าใจแล้วว่าเนื่องจากหน้าการนำทางและหน้าเนื้อหาไม่ใช่ 2 สิ่งที่แตกต่างกัน สามารถทำได้ใน page.xaml ด้วย:

<ContentPage NavigationPage.HasNavigationBar="False">
person Jaime Santos    schedule 09.02.2020