我正在开发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文档对此也毫无帮助,因此我有点茫然。有人能指出我正确的方向吗?
答案 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>