【发布时间】:2013-11-24 08:01:02
【问题描述】:
我正在使用这个很棒的助手Windows Phone Theme Manager,以便允许用户指定与手机内置颜色不同的强调色。
但是,我发现的方法是
ThemeManager.SetAccentColor(AccentColor.Red);
当我在 xaml 中使用 Color 资源而不是 Brush 资源时不起作用。比如下面的第一个Grid,依然使用手机的强调色;而第二个使用我在 SetAccentColor 方法中定义的任何内容。
<Grid x:Name="NotWorking">
<Grid.Background>
<SolidColorBrush Color="{StaticResource PhoneAccentColor}"/>
</Grid.Background>
</Grid>
<Grid x:Name="WorkingFine" Background="{StaticResource PhoneAccentBrush}"/>
问题似乎出在下面的这种特殊方法中(在这种情况下,prefix 是 "PhoneAccent")。因为Color 资源是值类型,所以更改currentColor 不会对实际资源产生任何影响。
internal static void SetOrCreateColorAndBrush(string prefix, Color color)
{
var currentColor = new Color();
// Check if the Colour is actually in the dictionary
if (Application.Current.Resources.Contains(prefix + "Color"))
{
currentColor = (Color)Application.Current.Resources[prefix + "Color"];
currentColor.A = color.A;
currentColor.B = color.B;
currentColor.G = color.G;
currentColor.R = color.R;
}
然后我尝试像这样直接将资源设置为color -
Application.Current.Resources[prefix + "Color"] = color;
直到后来我才发现这也行不通,因为this。
我最后一次尝试是从Application.Current.Resources 中删除此资源,然后使用color 值重新添加它。但是由于某种我不知道的原因,即使在 Remove 方法之后,仍然可以在资源中找到此资源...
Application.Current.Resources.Remove(prefix + "Color");
var stilReturnsTrue = Application.Current.Resources.Contains(prefix + "Color");
我有点想不通了。想知道是否有人遇到过这种情况并找到任何解决方法?
【问题讨论】:
-
您在 XAML 中关于颜色与画笔的问题是因为您使用 StaticResource 绑定到颜色和画笔。 StaticResource 可以监听对象内属性的变化(Brush 的 Color 属性),但不能监听对象本身。
-
@emedbo,我认为问题根本不在于
StaticResource。问题是如何设置值,而不是如何更新 UI 上的值。请注意,Brush工作正常。
标签: silverlight windows-phone-7 windows-phone-8 windows-phone resourcedictionary