XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.WinUIHelper

【DLL】WinUI的各种工具类,帮助开发者快速构建一个模块化的WinUI项目

公开
关注 0 Fork 0 Star 0
UTF-8
using Microsoft.UI.Xaml.Media.Animation;
using Microsoft.UI.Xaml.Navigation;
using XFEExtension.NetCore.WinUIHelper.Interface.Services;
using XFEExtension.NetCore.WinUIHelper.Utilities.Additions;
using XFEExtension.NetCore.WinUIHelper.Utilities.Helper;
using System.Diagnostics.CodeAnalysis;

namespace XFEExtension.NetCore.WinUIHelper.Implements.Services;

class NavigationViewService : GlobalServiceBase, INavigationViewService
{
    private NavigationView? _navigationView;
    private Frame? _frame;
    private readonly AutoNavigationService navigationService = new();

    public IAutoNavigationService NavigationService => navigationService;
    public object? SelectedItem => _navigationView?.SelectedItem;
    public object? Header { get => _navigationView?.Header; set { if (_navigationView is not null) _navigationView.Header = value; } }

    public NavigationView? NavigationView => _navigationView;

    public XamlRoot? XamlRoot => _navigationView?.XamlRoot;

    public Thickness ContentMargin
    {
        get => _frame?.Padding ?? new();
        set
        {
            if (_frame is not null)
                _frame.Padding = value;
        }
    }

    [MemberNotNull(nameof(_navigationView))]
    public void Initialize(NavigationView view, Frame frame)
    {
        _frame = frame;
        navigationService.Frame = frame;
        _navigationView = view;
        _navigationView.ItemInvoked += NavigationView_ItemInvoked;
        _navigationView.BackRequested += NavigationView_BackRequested;
        navigationService.Navigated += NavigationService_Navigated;
    }

    private void NavigationService_Navigated(object? sender, NavigationEventArgs e)
    {
        if (_navigationView is not null && GetSelectedItem(e.SourcePageType, e.Parameter) is NavigationViewItem navigationViewItem)
        {
            _navigationView.SelectedItem = navigationViewItem;
            Header = navigationViewItem.Content.ToString() ?? string.Empty;
        }
    }

    private void NavigationView_BackRequested(NavigationView sender, NavigationViewBackRequestedEventArgs args)
    {
        if (navigationService.CanGoBack)
            navigationService.GoBack();
    }

    private void NavigationView_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
    {
        if (args.InvokedItemContainer.GetValue(NavigationAddition.NavigateToProperty) is string targetUrl)
            NavigateTo(targetUrl, args.InvokedItemContainer.GetValue(NavigationAddition.NavigateParameterProperty) is string parameter ? parameter : null);
    }

    public NavigationViewItem? GetSelectedItem(Type type, object? parameter = null) => _navigationView is null ? null : GetSelectedItem(_navigationView.MenuItems, _navigationView.FooterMenuItems, type, parameter);

    private static NavigationViewItem? GetSelectedItem(IEnumerable<object> menuItems, IEnumerable<object> footerMenuItems, Type pageType, object? parameter)
    {
        var footerResult = GetSelectedItem(footerMenuItems, pageType, parameter);
        if (footerResult is null)
            return GetSelectedItem(menuItems, pageType, parameter);
        return footerResult;
    }

    private static NavigationViewItem? GetSelectedItem(IEnumerable<object> menuItems, Type pageType, object? parameter)
    {
        foreach (var item in menuItems.OfType<NavigationViewItem>())
        {
            if (item.GetNavigateTo() is string pageName && pageName == pageType.FullName)
            {
                var itemParameter = item.GetNavigationParameter();
                if (parameter is string && Equals(parameter, itemParameter) || parameter == itemParameter || itemParameter is null)
                    return item;
            }
            var selectedChild = GetSelectedItem(item.MenuItems, pageType, parameter);
            if (selectedChild != null)
                return selectedChild;
        }
        return null;
    }

    public void NavigateTo(string pageType, object? parameter = null, NavigationTransitionInfo? navigationTransitionInfo = null) => navigationService.NavigateTo(pageType, parameter, navigationTransitionInfo);

    public void NavigateTo(Type type, object? parameter = null, NavigationTransitionInfo? navigationTransitionInfo = null) => navigationService.NavigateTo(type, parameter, navigationTransitionInfo);

    public void NavigateTo<T>(object? parameter = null, NavigationTransitionInfo? navigationTransitionInfo = null) where T : Page => navigationService.NavigateTo<T>(parameter, navigationTransitionInfo);
}