Xamarin.Forms如何将服务端获取的样式定义为静态资源?
解决方案
方法一:指定绑定源避免上下文混淆
视图绑定到MyData后,默认绑定上下文会变成MyData,导致之前的BaseStyles绑定出错。解决的核心是绑定GlobalStyles时明确指定绑定源,不让当前上下文干扰:
- 在App.xaml的资源中注入GlobalStyles的全局实例:
<Application.Resources> <local:GlobalStyles x:Key="GlobalStylesInstance" /> </Application.Resources>
- 定义Style时,绑定GlobalStyles属性要指定Source为这个全局实例:
<Style x:Key="MyTextStyle" TargetType="TextBlock"> <Setter Property="Foreground" Value="{Binding MyColor1, Source={StaticResource GlobalStylesInstance}}" /> </Style>
这样不管当前视图的绑定上下文是MyData还是其他,都会从全局的GlobalStyles实例读取属性值,不会被当前上下文覆盖。
方法二:动态更新Color静态资源
如果想直接定义Color类型的静态资源,可以先占位,等服务端数据返回后再替换:
- 先在App.xaml里定义占位的Color资源(带默认值):
<Application.Resources> <Color x:Key="MyColor1Resource">#FF0000</Color> <Color x:Key="MyColor2Resource">#00FF00</Color> </Application.Resources>
- 拿到服务端返回的GlobalStyles实例后,在代码里更新这些资源:
// globalStyles是从服务端获取的实例 Application.Current.Resources["MyColor1Resource"] = globalStyles.MyColor1; Application.Current.Resources["MyColor2Resource"] = globalStyles.MyColor2;
之后在样式或控件里直接引用这些静态资源就行:
<Style x:Key="MyButtonStyle" TargetType="Button"> <Setter Property="Background" Value="{StaticResource MyColor1Resource}" /> </Style>
所有引用该资源的地方会自动同步更新后的颜色值。
额外提示
- 如果GlobalStyles的属性后续会动态变化(比如服务端推送样式更新),要让GlobalStyles实现
INotifyPropertyChanged接口,这样绑定的样式能自动响应属性变化。 - 方法一中的绑定要支持动态更新的话,同样需要GlobalStyles实现
INotifyPropertyChanged。
内容的提问来源于stack exchange,提问作者Bernd Morgeneyer
相关产品推荐
相关产品推荐

