是否可以在Xamarin Forms Android中动态更改标签栏所选项目的颜色?

时间:2018-10-20 13:26:10

标签: c# xamarin xamarin.forms xamarin.android

我有一个Xamarin Forms应用程序,为用户提供了3个主题选项。我希望能够通过单击按钮来更改Tabbar背景,选定项目和未选定项目的颜色。在iOS中,我可以使用以下渲染器来做到这一点:

protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
    base.OnElementChanged(e);

    if(e.OldElement != null)
    {
        Xamarin.Forms.Application.Current.PropertyChange -= Current_PropertyChanged;
        return;
    }

    Xamarin.Forms.Application.Current.PropertyChange += Current_PropertyChanged; //subscribe to the App class' built in property changed event
    UpdateTheme();
}

void Current_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    UpdateTheme();
}

在Android中,我知道可以在styles.xml中更改这些颜色,但这只能让我设置一次颜色。另外,我正在使用ToolbarPlacement="Bottom"将标签栏放置在屏幕底部。

android:TabbedPage.ToolbarPlacement="Bottom"
android:TabbedPage.BarSelectedItemColor="Red"
android:TabbedPage.IsSwipePagingEnabled="False"

我想知道是否可以通过单击按钮来动态更改BarSelectedItemColor

2 个答案:

答案 0 :(得分:7)

我终于通过使用DynamicResource样式使此工作得以实现:

从此:

android:TabbedPage.BarSelectedItemColor="Red"

对此:

android:TabbedPage.BarSelectedItemColor="{DynamicResource BarSelectedItemColor"

答案 1 :(得分:0)

您可以选中此link

这是关于动态ResourceThem或类似内容的讨论。

<Application>
    xmlns="zamarin schema{forms}"
    xmlns:x="microsoft schema{xaml}"
    x:Class="name">
    <Application.Resources>
        <ResourceDictionary>
            <Color x:Key="backgroundColor">your color</Color>
            <Color x:Key="textColor">name of color</Color>
        </ResourceDictionary>
    </Application.Resources>
</Application>

静态资源

StaticResource标记扩展允许我们引用预定义的资源,但是有一个关键的局限性:字典中的资源在控制实例化期间仅被提取了一次,并且不能在runtime进行更改。语法与绑定非常相似。只需将属性的值设置为“ {StaticResource Resource_Name}”即可。让我们更新ViewCell以使用我们定义的资源:

<Label Text="{Binding Name}" FontSize="Medium" FontAttributes = "Bold" TextColor = "{DynamicResource textColor}" LineBreakMode="NoWrap"/>
<Label Text="{Binding Text}" FontSize="Small" LineBreakMode="WordWrap" TextColor = "{DynamicResource textColor}"/>

现在!在此代码中,您可以更改资源:

App.Current.Resources ["backgroundColor"] = Color.White;
App.Current.Resources ["textColor"] = Color.Black;