如何使用ShellRenderer实施CustomMoreNavigationControllerDelegate?

发布于 2025-02-11 07:02:34 字数 2508 浏览 2 评论 0原文

以前,我能够使用TabBedrenderer通过实现CustomMoreNavigationControllerDelegate来对标签栏进行更大的菜单页面,以便……

public class ExtendedTabbedPageRenderer : TabbedRenderer
{
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        { 
            MoreNavigationController.Delegate = new CustomMoreNavigationControllerDelegate();
        }
    }
}

我现在使用Shell Navigation,因此如何使用ShellRenderer(因为没有OnelementChanged,我如何分配/实现此类覆盖)?

我更多的菜单样式课

internal class CustomMoreNavigationControllerDelegate : UINavigationControllerDelegate
    {
        public override void WillShowViewController(UINavigationController navigationController, UIViewController viewController, bool animated)
        {
            viewController.NavigationController.NavigationBarHidden = false;

            UILabel titleLabel = new UILabel();

            if (viewController.NavigationItem.Title != "More")
            {
                titleLabel.Text = viewController.NavigationItem.Title;
            }
            else
            {
                titleLabel.Text = "More";
            }

            titleLabel.TextColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? UIColor.White : UIColor.Black;
            viewController.NavigationItem.TitleView = titleLabel;

            viewController.View.BackgroundColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? ExtendedTabbedPageRenderer.iOSDarkPageBackgroundColor : ExtendedTabbedPageRenderer.iOSLightPageBackgroundColor;
            viewController.View.TintColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? UIColor.White : UIColor.Black;

            if (viewController.View is UITableView tableView)
            {
                tableView.SeparatorColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? UIColor.White : UIColor.Black;
                foreach (var cell in tableView.VisibleCells)
                {
                    cell.BackgroundColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? ExtendedTabbedPageRenderer.iOSDarkPageBackgroundColor : ExtendedTabbedPageRenderer.iOSLightPageBackgroundColor;
                    cell.TextLabel.TextColor = cell.TintColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? UIColor.White : UIColor.Black;
                }
            }
        }
    }

Previously I was able to use TabbedRenderer to stylize the tabbed bar More menu page by implementing CustomMoreNavigationControllerDelegate as so...

public class ExtendedTabbedPageRenderer : TabbedRenderer
{
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        { 
            MoreNavigationController.Delegate = new CustomMoreNavigationControllerDelegate();
        }
    }
}

I'm now using Shell navigation instead, and so how can I assign/implement this class using ShellRenderer (since there is no OnElementChanged override)?

My More menu styling class

internal class CustomMoreNavigationControllerDelegate : UINavigationControllerDelegate
    {
        public override void WillShowViewController(UINavigationController navigationController, UIViewController viewController, bool animated)
        {
            viewController.NavigationController.NavigationBarHidden = false;

            UILabel titleLabel = new UILabel();

            if (viewController.NavigationItem.Title != "More")
            {
                titleLabel.Text = viewController.NavigationItem.Title;
            }
            else
            {
                titleLabel.Text = "More";
            }

            titleLabel.TextColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? UIColor.White : UIColor.Black;
            viewController.NavigationItem.TitleView = titleLabel;

            viewController.View.BackgroundColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? ExtendedTabbedPageRenderer.iOSDarkPageBackgroundColor : ExtendedTabbedPageRenderer.iOSLightPageBackgroundColor;
            viewController.View.TintColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? UIColor.White : UIColor.Black;

            if (viewController.View is UITableView tableView)
            {
                tableView.SeparatorColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? UIColor.White : UIColor.Black;
                foreach (var cell in tableView.VisibleCells)
                {
                    cell.BackgroundColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? ExtendedTabbedPageRenderer.iOSDarkPageBackgroundColor : ExtendedTabbedPageRenderer.iOSLightPageBackgroundColor;
                    cell.TextLabel.TextColor = cell.TintColor = Xamarin.Forms.Application.Current.UserAppTheme == OSAppTheme.Dark ? UIColor.White : UIColor.Black;
                }
            }
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橙幽之幻 2025-02-18 07:02:34

您需要覆盖 所需的方法才能通过shellRenderer类的子类执行所需的自定义,以自定义塔巴尔的外观。

例如,在iOS中,如果要设置Shell应用程序菜单的文本。

代码段:

using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(Xaminals.AppShell), typeof(Xaminals.iOS.MyShellRenderer))]
namespace Xaminals.iOS
{
    public class MyShellRenderer : ShellRenderer
    {
        protected override IShellTabBarAppearanceTracker CreateTabBarAppearanceTracker()
        {
            return new TabBarAppearance();
        }
    }

    public class TabBarAppearance : IShellTabBarAppearanceTracker
    {
        public void Dispose()
        {
        }

        public void ResetAppearance(UITabBarController controller)
        {
        }

        public void SetAppearance(UITabBarController controller, ShellAppearance appearance)
        {
           //set tabbar appearance
        }

    
        public void UpdateLayout(UITabBarController controller)
        {
            UITabBar tb = controller.MoreNavigationController.TabBarController.TabBar;
            if (tb.Subviews.Length > 4)
            {
                UIView tbb = tb.Subviews[4];
                UILabel label = (UILabel)tbb.Subviews[1];
                label.Text = "CustomTab";
            }
        }
    }
}

有关更多详细信息,请参阅我们的MS 官方文档。

You need override the required methods to perform the required customization via a subclass of the ShellRenderer class to customize the Tabbar appearance.

For example,in iOS, if you want to set the text of the more menu of the Shell application.

Code snippet:

using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(Xaminals.AppShell), typeof(Xaminals.iOS.MyShellRenderer))]
namespace Xaminals.iOS
{
    public class MyShellRenderer : ShellRenderer
    {
        protected override IShellTabBarAppearanceTracker CreateTabBarAppearanceTracker()
        {
            return new TabBarAppearance();
        }
    }

    public class TabBarAppearance : IShellTabBarAppearanceTracker
    {
        public void Dispose()
        {
        }

        public void ResetAppearance(UITabBarController controller)
        {
        }

        public void SetAppearance(UITabBarController controller, ShellAppearance appearance)
        {
           //set tabbar appearance
        }

    
        public void UpdateLayout(UITabBarController controller)
        {
            UITabBar tb = controller.MoreNavigationController.TabBarController.TabBar;
            if (tb.Subviews.Length > 4)
            {
                UIView tbb = tb.Subviews[4];
                UILabel label = (UILabel)tbb.Subviews[1];
                label.Text = "CustomTab";
            }
        }
    }
}

For more details, please refer to our MS official docs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文