【问题标题】:Change Menu Bar Icon on Navigation Page更改导航页面上的菜单栏图标
【发布时间】:2017-05-31 22:33:08
【问题描述】:

我正在拼命尝试更改 Xamarin Forms 应用程序上的图标颜色。我以为这个汉堡菜单是文本,但我现在似乎根本无法更改。是图像吗?我找到了一个 slideout.png 图像,但对它的任何编辑都不会显示在应用程序中。这个汉堡菜单图标是从哪里拉出来的?

页面:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class LandingPage : MasterDetailPage
{
    public LandingPage()
    {
        InitializeComponent();
        MasterPage.ListView.ItemSelected += ListView_ItemSelected;
    }
    public void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        var item = e.SelectedItem as LandingPageMenuItem;
        if (item == null)
            return;
        var page = (Page)Activator.CreateInstance(item.TargetType);
        page.Title = item.Title;
        Detail = new NavigationPage(page);
        MasterPage.ListView.SelectedItem = null;
        IsPresented = false;
    }
}

<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Test.LandingPage" xmlns:pages="clr-namespace:Test">
    <MasterDetailPage.Master>
        <pages:LandingPageMaster x:Name="MasterPage" />
    </MasterDetailPage.Master>
    <MasterDetailPage.Detail>
        <NavigationPage>
            <x:Arguments>
                <pages:LandingPageDetail />
            </x:Arguments>
        </NavigationPage>
    </MasterDetailPage.Detail>
</MasterDetailPage>

大师:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class LandingPageMaster : ContentPage
{
    public LandingPageMasterViewModel Vm { get; private set; }
    public ListView ListView => ListViewMenuItems;
    public LandingPageMaster()
    {
        InitializeComponent();
        Vm = new LandingPageMasterViewModel();
        BindingContext = Vm;
    }

    protected override void OnAppearing()
    {
        ListViewMenuItems.SelectedItem = Vm.MenuItems[0];
    }
    public class LandingPageMasterViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<LandingPageMenuItem> _menuItems;

        public ObservableCollection<LandingPageMenuItem> MenuItems
        {
            get
            {
                return _menuItems;
            }
            set
            {
                _menuItems = value;
                OnPropertyChanged();
            }
        }

        public LandingPageMasterViewModel()
        {
            ObservableCollection<LandingPageMenuItem> items = new ObservableCollection<LandingPageMenuItem>();
            items.Add(new LandingPageMenuItem { Title = "OCR" });
            MenuItems = items;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged([CallerMemberName]string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Test.LandingPageMaster" Title="">
    <StackLayout>
        <ListView x:Name="ListViewMenuItems" SeparatorVisibility="None" HasUnevenRows="True" ItemsSource="{Binding MenuItems}">
            <ListView.Header>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="60" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="30" />
                    </Grid.RowDefinitions>
                    <Label Grid.Column = "0" Grid.Row="0" Text=" " />
                </Grid>
            </ListView.Header>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Padding="15,10" HorizontalOptions="FillAndExpand">
                            <Label VerticalOptions="FillAndExpand" VerticalTextAlignment="Center" Text="{Binding Title}" FontSize="Medium" />
                            <Label VerticalOptions="FillAndExpand" VerticalTextAlignment="Center" Text="{Binding Subtitle}" FontSize="Small" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

详情:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class LandingPageDetail : ContentPage
{
    public LandingPageDetail()
    {
        InitializeComponent();
    }
}


<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Test.LandingPageDetail" Title="Detail">
    <StackLayout Padding="10">
        <Label Text="This is a detail page" />
    </StackLayout>
</ContentPage>

【问题讨论】:

    标签: android xamarin.forms master-detail


    【解决方案1】:

    在 Android 平台上是ImageButton。所以你可以改变这个汉堡按钮的图片来源。

    您可以创建自定义MasterDetailPage 使用Custom Renderers,例如在渲染器中:

    public class MyMasterDetailRenderer : MasterDetailPageRenderer
    {
        protected override void OnLayout(bool changed, int l, int t, int r, int b)
        {
            base.OnLayout(changed, l, t, r, b);
            var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            for (var i = 0; i < toolbar.ChildCount; i++)
            {
                var imageButton = toolbar.GetChildAt(i) as ImageButton;
    
                var drawerArrow = imageButton?.Drawable as DrawerArrowDrawable;
                if (drawerArrow == null)
                    continue;
    
                imageButton.SetImageDrawable(Forms.Context.GetDrawable(Resource.Drawable.hamburger));
            }
        }
    }
    

    【讨论】:

    • 嗨,这很好用。但是,我注意到这种方法存在一个小问题。如果我如上所述更改汉堡菜单,则后退箭头也会更改为汉堡图标。我想在循环中,应该有一种方法来识别工具栏项是否是汉堡包图像,然后才更改它,否则它应该被忽略。我无法解决这个问题。任何想法。谢谢。
    【解决方案2】:

    在 Android 上,汉堡图形和伴随的动画由 android 操作系统提供,并不关心主从中定义的图标,尽管该图标将在 iOS/UWP 上使用。

    它可能会被覆盖,尽管我没有必要因此无法帮助解决这个问题。

    如果您只是在更改颜色之后更改标题栏的 android 主题文本颜色,据我了解,这也会更改汉堡包的颜色。

    【讨论】:

    • 感谢您的回答。你能解释一下我将如何使用 Android styles.xml 完成更改颜色吗?
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多