public PrimaryWindowCoreLayout(PrimaryWindowCoreLayoutViewModel viewModel)
        {
            this.InitializeComponent();

            DataContext = _viewModel = viewModel;

            // Navigation Handling
            ContentFrame.Navigated += Frame_Navigated;
            SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;
            Window.Current.CoreWindow.KeyDown        += CoreWindow_KeyDown;
            Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed;

            _backNavigationEventSubscriber = _viewModel.EventAggregator.GetEvent <BackNavigationRequestEvent>()
                                             .Subscribe(() => HandleBackRequest(), keepSubscriberReferenceAlive: true);

            _refreshNavigationEventSubscriber = _viewModel.EventAggregator.GetEvent <RefreshNavigationRequestEvent>()
                                                .Subscribe(() => RefreshCommand.Execute(), keepSubscriberReferenceAlive: true);

            _themeChangeRequestEventSubscriber = _viewModel.EventAggregator.GetEvent <ThemeChangeRequestEvent>()
                                                 .Subscribe(theme => SetTheme(theme), keepSubscriberReferenceAlive: true);

            SetTheme(_viewModel.ApplicationSettings.Theme);

            AutoSuggestBox.Loaded += PrimaryWindowCoreLayout_Loaded;
        }
Beispiel #2
0
        public PrimaryWindowCoreLayout(PrimaryWindowCoreLayoutViewModel viewModel)
        {
            DataContext = _viewModel = viewModel;
            this.InitializeComponent();

            _dispatcher = Dispatcher;

            ContentFrame.NavigationFailed += (_, e) =>
            {
                Debug.WriteLine("Page navigation failed!!");
                Debug.WriteLine(e.SourcePageType.AssemblyQualifiedName);
                Debug.WriteLine(e.Exception.ToString());

                _ = (App.Current as App).OutputErrorFile(e.Exception, e.SourcePageType?.AssemblyQualifiedName);
            };

            // Resolve Page Title
            ContentFrame.Navigated += (_, e) =>
            {
                OptionalPageTitle = string.Empty;
                Action <Page, NavigationEventArgs> UpdateOptionalTitleAction = (page, args) =>
                {
                    if (page.DataContext is ITitleUpdatablePage pageVM)
                    {
                        pageVM.GetTitleObservable()
                        .Subscribe(title =>
                        {
                            OptionalPageTitle = title;
                        })
                        .AddTo(_navigationDisposable);
                    }
                };

                var page = e.Content as Page;
                if (page.DataContext == null)
                {
                    page.ObserveDependencyProperty(DataContextProperty)
                    .Subscribe(_ =>
                    {
                        UpdateOptionalTitleAction(page, e);
                    })
                    .AddTo(_navigationDisposable);
                }
                else
                {
                    UpdateOptionalTitleAction(page, e);
                }

                var pageNameRaw = e.SourcePageType.FullName.Split('.').LastOrDefault();
                var pageName    = pageNameRaw.Split('_').FirstOrDefault();
                if (Enum.TryParse(pageName.Substring(0, pageName.Length - 4), out HohoemaPageType pageType))
                {
                    PageTitle = pageType.Translate();
                }
            };

            ContentFrame.Navigating += ContentFrame_Navigating;

            _viewModel.EventAggregator.GetEvent <PageNavigationEvent>()
            .Subscribe(args =>
            {
                _navigationDisposable?.Dispose();
                _navigationDisposable = new CompositeDisposable();

                _ = ContentFrameNavigation(args);
            });

            // Back Navigation Handling
            SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;
            Window.Current.CoreWindow.KeyDown        += CoreWindow_KeyDown;
            Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed;


            if (Services.Helpers.DeviceTypeHelper.IsDesktop)
            {
                Window.Current.SetTitleBar(DraggableContent as UIElement);
            }

            ContentFrame.Navigated      += TVModeContentFrame_Navigated;
            UINavigationManager.Pressed += UINavigationManager_Pressed;
            this.GettingFocus           += PrimaryWindowCoreLayout_GettingFocus;


            _viewModel.AppearanceSettings.ObserveProperty(x => x.Theme)
            .Subscribe(theme =>
            {
                if (theme == ElementTheme.Default)
                {
                    var appTheme = Helpers.SystemThemeHelper.GetSystemTheme();
                    if (appTheme == ApplicationTheme.Dark)
                    {
                        theme = ElementTheme.Dark;
                    }
                    else
                    {
                        theme = ElementTheme.Light;
                    }
                }

                this.RequestedTheme = theme;
            });
        }
        public PrimaryWindowCoreLayout(
            PrimaryWindowCoreLayoutViewModel viewModel,
            Services.CurrentActiveWindowUIContextService currentActiveWindowUIContextService,
            ILoggerFactory loggerFactory
            )
        {
            DataContext = _viewModel = viewModel;

            this.InitializeComponent();
            _dispatcherQueue = DispatcherQueue.GetForCurrentThread();
            _currentActiveWindowUIContextService = currentActiveWindowUIContextService;
            _logger = loggerFactory.CreateLogger <PrimaryWindowCoreLayout>();


            ContentFrame.NavigationFailed += (_, e) =>
            {
                _logger.ZLogError(e.Exception, "Page navigation failed!!");
            };

            // Resolve Page Title
            ContentFrame.Navigated += (_, e) =>
            {
                _navigationDisposable?.Dispose();
                _navigationDisposable = new CompositeDisposable();

                PageTitle = string.Empty;
                Action <Page, NavigationEventArgs> UpdateOptionalTitleAction = (page, args) =>
                {
                    if (page.DataContext is ITitleUpdatablePage pageVM)
                    {
                        pageVM.GetTitleObservable()
                        .Subscribe(title =>
                        {
                            PageTitle = title;
                            if (pageVM is HohoemaPageViewModelBase vm)
                            {
                                vm.Title = title;
                            }
                        })
                        .AddTo(_navigationDisposable);
                    }
                    else if (page.DataContext is HohoemaPageViewModelBase vm)
                    {
                        var pageNameRaw = e.SourcePageType.FullName.Split('.').LastOrDefault();
                        var pageName    = pageNameRaw.Split('_').FirstOrDefault();
                        if (Enum.TryParse(pageName.Substring(0, pageName.Length - 4), out HohoemaPageType pageType))
                        {
                            PageTitle = vm.Title = pageType.Translate();
                        }
                        else
                        {
                            PageTitle = vm.Title = pageType.ToString();
                        }
                    }
                };

                var page = e.Content as Page;
                if (page.DataContext == null)
                {
                    page.ObserveDependencyProperty(DataContextProperty)
                    .Subscribe(_ =>
                    {
                        UpdateOptionalTitleAction(page, e);
                    })
                    .AddTo(_navigationDisposable);
                }
                else
                {
                    UpdateOptionalTitleAction(page, e);
                }
            };

            ContentFrame.Navigating += ContentFrame_Navigating;

            ContentFrame.Navigated += ContentFrame_Navigated;

            WeakReferenceMessenger.Default.Register <PageNavigationEvent>(this, (r, m) =>
            {
                ContentFrameNavigation(m.Value);
            });

            // Back Navigation Handling
            SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;
            Window.Current.CoreWindow.KeyDown        += CoreWindow_KeyDown;
            Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed;


            if (DeviceTypeHelper.IsDesktop)
            {
                Window.Current.SetTitleBar(DraggableContent as UIElement);
            }

            ContentFrame.Navigated += TVModeContentFrame_Navigated;
            this.GettingFocus      += PrimaryWindowCoreLayout_GettingFocus;


            _viewModel.AppearanceSettings.ObserveProperty(x => x.ApplicationTheme)
            .Subscribe(theme =>
            {
                if (theme == ElementTheme.Default)
                {
                    var appTheme = Helpers.SystemThemeHelper.GetSystemTheme();
                    if (appTheme == ApplicationTheme.Dark)
                    {
                        theme = ElementTheme.Dark;
                    }
                    else
                    {
                        theme = ElementTheme.Light;
                    }
                }

                this.RequestedTheme = theme;
            });

            CoreNavigationView.ObserveDependencyProperty(Microsoft.UI.Xaml.Controls.NavigationView.IsPaneOpenProperty)
            .Subscribe(_ =>
            {
                if (CoreNavigationView.IsPaneOpen)
                {
                    var pinsNVItem = CoreNavigationView.ContainerFromMenuItem(viewModel._pinsMenuSubItemViewModel);
                    if (pinsNVItem is Microsoft.UI.Xaml.Controls.NavigationViewItem nvi)
                    {
                        nvi.IsExpanded = true;
                    }
                }
            });

            WeakReferenceMessenger.Default.Register <LiteNotificationMessage>(this, (r, m) =>
            {
                var payload = m.Value;
                if (_currentActiveWindowUIContextService.UIContext != UIContext)
                {
                    return;
                }

                TimeSpan duration = payload.Duration ?? payload.DisplayDuration switch
                {
                    DisplayDuration.Default => TimeSpan.FromSeconds(1.25),
                    DisplayDuration.MoreAttention => TimeSpan.FromSeconds(1.25 * 3),
                    _ => TimeSpan.FromSeconds(1.25),
                };

                LiteInAppNotification.Show(payload, duration);
            });