Можно ли динамически изменить значок ToolbarItem? - PullRequest
1 голос
/ 07 октября 2019

Я хотел бы изменить несколько значков, расположенных в ToolbarItem элемента TabbedPage, я просмотрел документы здесь , и я либо упускаю суть, либо, возможно, то, чего я хочу достичь, не выполнимо?

В настоящее время я использую FontAwesomeIcons для заполнения значков в моем приложении, и со статической точки зрения они отлично работают. Но в некоторых сценариях я могу захотеть изменить либо значок, либо его цвет, либо пакет значков (например, Светло-твердое).

App.xaml - я использую это для ссылки на мой.otf файлы

<Application.Resources>
    <OnPlatform x:Key="FontAwesomeProLight" x:TypeArguments="x:String">
        <On Platform="iOS" Value="FontAwesome5Pro-Light" />
    </OnPlatform>
    <OnPlatform x:Key="FontAwesomeProSolid" x:TypeArguments="x:String">
        <On Platform="iOS" Value="FontAwesome5Pro-Solid" />
    </OnPlatform>
</Application.Resources>

ExamplePage.xaml - это страница, на которой я покажу свои значки в настоящее время (не динамически)

<TabbedPage.ToolbarItems>
    <ToolbarItem Clicked="OnFilterOrders">
        <ToolbarItem.IconImageSource>
            <FontImageSource FontFamily="{StaticResource FontAwesomeProLight}" Glyph="{x:Static fonts:FontAwesomeIcons.Filter}" />
        </ToolbarItem.IconImageSource>
    </ToolbarItem>
</TabbedPage.ToolbarItems>

Итак, кодна данный момент отлично работает, чтобы показать статический значок, ниже моя попытка, которая терпит неудачу - но не выдает ошибку, я просто получаю? вместо этого

ExamplePage.xaml

<TabbedPage.ToolbarItems>
    <ToolbarItem Clicked="OnFilterOrders">
        <ToolbarItem.IconImageSource>
            <FontImageSource FontFamily="{DynamicResource FontAwesomeIconPack}" Glyph="{x:Static fonts:FontAwesomeIcons.Filter}" />
        </ToolbarItem.IconImageSource>
    </ToolbarItem>
</TabbedPage.ToolbarItems>

Используя код этой страницы, у меня также есть следующее в конструкторе.

Resources["FontAwesomeIconPack"] = App.Current.Resources["FontAwesomeProLight"];

Правильно ли я считаю, что ресурсы ["FontAwesomeIconPack"] связаны со словарем ресурсов страниц, а App.Current.Resources ["FontAwesomeProLight"] связан со страницей app.xaml?

Я былнадеясь, что в этом примере я покажу свой существующий значок, но это не так. Мои ожидания - тот же значок, что и раньше (до того, как я меняю пакет), но вместо этого я просто получаю?).

1 Ответ

0 голосов
/ 09 октября 2019

Если вы хотите изменить стиль значка с вкладками во время выполнения (например, icon, fontSize). Вы должны использовать Custom Renderer .

в iOS

using System;

using UIKit;

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

using xxx;
using xxx.iOS;

[assembly:ExportRenderer(typeof(TabbedPage),typeof(MyTabbedPageRenderer))]
namespace xxx.iOS
{
    public class MyTabbedPageRenderer:TabbedRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
        }

        public override void ViewDidAppear(bool animated)
        {
            base.ViewDidAppear(animated);

            MessagingCenter.Subscribe<Object, int>(this, "ChangeStyle", (args, position) => {

                UpdateItem(TabBar.Items[position], "xxx.png","xxx2.png");

            });

        }

        void UpdateItem(UITabBarItem item, string icon,string selectIcon)
         {
            if (item == null)
            {
                return;
            }

            // set default icon
            if (item?.Image?.AccessibilityIdentifier == icon)
              return;
            item.Image = UIImage.FromBundle(icon);
            item.Image.AccessibilityIdentifier = icon;

            //set select icon
            if (item?.SelectedImage?.AccessibilityIdentifier == selectIcon)
                return;
            item.SelectedImage = UIImage.FromBundle(selectIcon);
            item.SelectedImage.AccessibilityIdentifier = selectIcon;


            //set font
            item.SetTitleTextAttributes(new UITextAttributes() { Font=UIFont.SystemFontOfSize(10,UIFontWeight.Light)},UIControlState.Normal);
            item.SetTitleTextAttributes(new UITextAttributes() { Font = UIFont.SystemFontOfSize(10, UIFontWeight.Light) }, UIControlState.Selected);
        }
    }
}

в Android

Вы можете проверить этот блог , он предоставляет решение в Android с помощью Custom Renderer.

в формах

Использовать MessagingCenter для отправки сообщения, когда вы хотите (например, нажмите кнопку)

MessagingCenter.Send<Object, int>(this, "ChangeStyle", 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...