将颜色绑定到单例

时间:2018-06-24 12:45:41

标签: c# xaml xamarin xamarin.forms

我正在开发Xamarin表单应用程序,因此我决定,为了使应用程序之间的样式一致变得更加容易,我将诸如调色板之类的内容保留在singleton类中,然后将属性绑定到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 :(得分:2)

由于您不打算在运行时更改样式,因此在这种情况下,静态资源会有所帮助。

您可以在App.xaml中使用ResourceDictionary,在整个应用程序中都可以访问它。

<?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}" />

答案 1 :(得分:1)

这是一个静态变量,因此您需要使用x:Static关键字

{Binding Source={x:Static local:Colors.Instance.Primary}}

答案 2 :(得分:1)

正如我们在评论中所说。
由于您预计runtime期间值不会改变,因此可以使用ResourceDictionary来实现。
在VS2017中创建Xamarin.Forms应用程序时(我就是这种情况),向导将为您创建示例。这是在 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>