Привязка цветов к одиночке - PullRequest
0 голосов
/ 24 июня 2018

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

Первоначально я реализовал это как статический класс для использования x:Static, но быстро понял, что это не может действительно работать, так как мне был нужен INotifyPropertyChanged, то есть при запуске приложения все было белым.

Теперь я реализовал класс как отдельный синглтон, например:

public class Colors : INotifyPropertyChanged
    {
        private Color primary;
        public Color Primary
        {
            get
            {
                return primary;
            }
            set
            {
                primary = value;
                NotifyPropertyChanged("Primary");
            }
        }

        private Color success;
        public Color Success
        {
            get
            {
                return success;
            }
            set
            {
                success = value;
                NotifyPropertyChanged("Success");
            }
        }

        private Color failure;
        public Color Failure
        {
            get
            {
                return failure;
            }
            set
            {
                failure = value;
                NotifyPropertyChanged("Failure");
            }
        }



        private Colors()
        {
            Primary = new Color(142, 190, 232);
            Success = new Color(134, 232, 133);
            Failure = new Color(255, 265, 173);
        }

        private static Colors instance;

        public static Colors Instance 
        {
            get 
            {
                if(instance == null)
                {
                    instance = new Colors();
                }
                return instance;
            }
        }

        // INotifyPropertyChanged implementation
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(info));
            }
        }
    }

Я пытался использовать {Binding Source={local:Colors.Instance.Primary}} в качестве привязки для этих цветов, но мне не удается скомпилировать мой XAML с ошибкой MarkupExtension not found for local:Colors.Instance, которая не очень полезна.

Документация Microsoft по этому вопросу тоже довольно бесполезна, поэтому я немного растерялся. Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Поскольку вы не собираетесь изменять стили во время выполнения, в этом случае будет полезен Static Resource.

Вы можете использовать ResourceDictionary в App.xaml, который будет доступен для всего приложения.

<?xml version="1.0" encoding="utf-8"?><Application
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Test.App">
<Application.Resources>
    <ResourceDictionary>
        <Color
            x:Key="primary">#03A9F4</Color>
        <Color
            x:Key="primary_dark">#0288D1</Color>
        <Color
            x:Key="primary_light">#B3E5FC</Color>
        <Color
            x:Key="BlueToolBarColor">#012E5B</Color>
        <Style
            x:Key="HeaderText"
            TargetType="Label">
            <Setter
                Property="FontAttributes"
                Value="Bold" />
        </Style>
    </ResourceDictionary>
</Application.Resources>

Эти ресурсы можно использовать в макете XAML, например,

<Label
                        Text="Hello"
                        TextColor="{StaticResource primary_dark}"
                        Style="{StaticResource HeaderText}" />
0 голосов
/ 26 июня 2018

Как мы говорили в комментариях.
Поскольку вы не ожидаете изменения значений во время runtime, вы можете сделать это, используя ResourceDictionary.
Когда вы создаете Xamarin.FormsПриложение в VS2017 (это был мой случай) мастер создает образец для вас.Вот что было создано для меня в App.xaml :

<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="App1.App">
    <Application.Resources>
        <ResourceDictionary>
            <!--Global Styles-->
            <!-- Here you would declare your colours -->
            <Color x:Key="NavigationPrimary">#2196F3</Color>
            <Style TargetType="NavigationPage">
                <!-- And here you would use them -->
                <Setter Property="BarBackgroundColor" Value="{StaticResource NavigationPrimary}" />
                <Setter Property="BarTextColor" Value="White" />
            </Style>
        </ResourceDictionary>
    </Application.Resources>
</Application>  

Это затем используется в представлении, например, так: MainPage.xaml :

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:views="clr-namespace:App1.Views"
        x:Class="App1.Views.MainPage">
    <TabbedPage.Children>
        <NavigationPage Title="Browse">
            <NavigationPage.Icon>
                <OnPlatform x:TypeArguments="FileImageSource">
                    <On Platform="iOS" Value="tab_feed.png"/>
                </OnPlatform>
            </NavigationPage.Icon>
            <x:Arguments>
                <views:ItemsPage />
            </x:Arguments>
        </NavigationPage>

        <NavigationPage Title="About">
            <NavigationPage.Icon>
                <OnPlatform x:TypeArguments="FileImageSource">
                    <On Platform="iOS" Value="tab_about.png"/>
                </OnPlatform>
            </NavigationPage.Icon>
            <x:Arguments>
                <views:AboutPage />
            </x:Arguments>
        </NavigationPage>
    </TabbedPage.Children>
</TabbedPage>
0 голосов
/ 24 июня 2018

Это статическая переменная, поэтому вам нужно использовать ключевое слово x:Static

{Binding Source={x:Static local:Colors.Instance.Primary}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...