Есть ли способ изменить свойство style basedon программно?

#c# #xamarin.forms #xamarin.android #visual-studio-2019

Вопрос:

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

  <Shell.Resources>
        <ResourceDictionary>
            <Style x:Key="BaseStyle" TargetType="Element" >
                <Setter Property="Shell.BackgroundColor" Value="{DynamicResource Primary}" />
                <Setter Property="Shell.ForegroundColor" Value="White" />
                <Setter Property="Shell.TitleColor" Value="White" />
                <Setter Property="Shell.DisabledColor" Value="#B4FFFFFF" />
                <Setter Property="Shell.UnselectedColor" Value="#95FFFFFF" />
                <Setter Property="Shell.TabBarBackgroundColor" Value="{DynamicResource Primary}" />
                <Setter Property="Shell.TabBarForegroundColor" Value="White"/>
                <Setter Property="Shell.TabBarUnselectedColor" Value="#95FFFFFF"/>
                <Setter Property="Shell.TabBarTitleColor" Value="White"/>
            </Style>
            <Style x:Key="GreenStyle" TargetType="Element" >
                <Setter Property="Shell.BackgroundColor" Value="Green" />
                <Setter Property="Shell.ForegroundColor" Value="White" />
                <Setter Property="Shell.TitleColor" Value="White" />
                <Setter Property="Shell.DisabledColor" Value="#B4FFFFFF" />
                <Setter Property="Shell.UnselectedColor" Value="#95FFFFFF" />
                <Setter Property="Shell.TabBarBackgroundColor" Value="Green" />
                <Setter Property="Shell.TabBarForegroundColor" Value="White"/>
                <Setter Property="Shell.TabBarUnselectedColor" Value="#95FFFFFF"/>
                <Setter Property="Shell.TabBarTitleColor" Value="White"/>
            </Style>
            <Style TargetType="TabBar" BasedOn="{StaticResource BaseStyle}" />
            <Style TargetType="FlyoutItem" BasedOn="{StaticResource BaseStyle}" />
        </ResourceDictionary>
    </Shell.Resources>
 

Я хочу знать, можно ли программно изменить свойство TabBar BasedOn на GreenStyle. Например:

 *Trigger*
{
TabBar.BasedOn = GreenStyle;
}
 

Но таким образом, чтобы это действительно работало.

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

 <Style TargetType="TabBar" BasedOn="{DynamicResource BaseStyle}" />
 

Принимаются любые обходные пути, если я могу изменить цвет / стиль на зеленый с любого цвета, на который он установлен, и обратно. Я очень новичок в формах Xamarin.

Ответ №1:

Есть ли способ изменить свойство style basedon программно?

Для этого вы можете использовать Dynamic Styles для достижения этой функции. Приложения могут динамически реагировать на изменения стиля во время выполнения, используя динамические ресурсы.

Вы можете обратиться к следующему коду:

 <ContentPage.Resources>
    <ResourceDictionary>
        <Style x:Key="baseStyle" TargetType="View">
            <Setter Property="VerticalOptions" Value="CenterAndExpand" />
        </Style>
        <Style x:Key="blueSearchBarStyle" TargetType="SearchBar" BasedOn="{StaticResource baseStyle}">
            <Setter Property="FontAttributes" Value="Italic" />
            <Setter Property="PlaceholderColor" Value="Blue" />
        </Style>
        <Style x:Key="greenSearchBarStyle" TargetType="SearchBar">
            <Setter Property="FontAttributes" Value="None" />
            <Setter Property="PlaceholderColor" Value="Green" />
        </Style>
        <Style x:Key="buttonStyle" TargetType="Button" BasedOn="{StaticResource baseStyle}">
            <Setter Property="FontSize" Value="Large" />
            <Setter Property="TextColor" Value="Red" />
        </Style>
    </ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
    <StackLayout Padding="0,20,0,0">
        <SearchBar Placeholder="These SearchBar controls" Style="{DynamicResource searchBarStyle}" />
        <SearchBar Placeholder="are demonstrating" Style="{DynamicResource searchBarStyle}" />
        <SearchBar Placeholder="dynamic styles," Style="{DynamicResource searchBarStyle}" />
        <SearchBar Placeholder="but this isn't dynamic" Style="{StaticResource blueSearchBarStyle}" />
        <Button Text="Change Style" Style="{StaticResource buttonStyle}" Clicked="OnButtonClicked" />
    </StackLayout>
</ContentPage.Content>
 

xaml.cs Код таков :

 public partial class DynamicStylesPage : ContentPage
{
    bool originalStyle = true;

    public DynamicStylesPage ()
    {
        InitializeComponent ();
        Resources ["searchBarStyle"] = Resources ["blueSearchBarStyle"];
    }

    void OnButtonClicked (object sender, EventArgs e)
    {
        if (originalStyle) {
            Resources ["searchBarStyle"] = Resources ["greenSearchBarStyle"];
            originalStyle = false;
        } else {
            Resources ["searchBarStyle"] = Resources ["blueSearchBarStyle"];
            originalStyle = true;
        }
    }
}
 

Для получения более подробной информации, пожалуйста, ознакомьтесь с динамическими стилями документа в Xamarin.Формы.

И в приведенном выше документе есть пример, вы можете его проверить here:https://docs.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/userinterface-styles-dynamicstyles/