无法在Silverlight中添加样式的系统颜色?

时间:2011-04-28 09:09:20

标签: silverlight coding-style systemcolors

我在XAML中为SystemColors定义了资源。如果我将Foregroung属性直接设置为TextBlock,则效果很好。但是,如果我在样式中指定前景属性,则会出现如下所示的错误。我不确定是什么问题以及如何解决它。任何想法都非常感谢!

直接在texblock中设置前景时的代码。它工作得很好

<TextBlock Text="WindowTextColor" Foreground="{Binding WindowTextColor, Source={StaticResource SystemColors}, Converter={StaticResource colorConverter}}" />

我通过样式设置前景属性时的代码。我的应用程序崩溃了:

<UserControl.Resources> 
  <local:ColorToBrushConverter x:Key="colorConverter" />
  <local:SystemColorsWrapper x:Key="SystemColors" />
  <Style x:Key="TextBlockStyle1" TargetType="TextBlock">
    <Setter Property="Foreground" Value="{Binding WindowColor, Source={StaticResource SystemColors}, Converter={StaticResource colorConverter}}"/>
  </Style>    
</UserControl.Resources>

<Grid Background="#FFB8B8B8">
    <TextBlock Text="WindowColor" Style="{StaticResource TextBlockStyle1}" />      
</Grid>

我得到的错误:

发生了

System.Windows.Markup.XamlParseException   Message = Set property''抛出异常。 [线路:11位置:41]   LineNumber上= 11   LinePosition = 41   堆栈跟踪:        在System.Windows.Application.LoadComponent(对象组件,Uri resourceLocator)        在SilverlightSysColors.MainPage.InitializeComponent()        在SilverlightSysColors.MainPage..ctor()   InnerException:System.NotSupportedException        Message =无法设置只读属性''。        堆栈跟踪:             在MS.Internal.XamlMemberInfo.SetValue(对象目标,对象值)             在MS.Internal.XamlManagedRuntimeRPInvokes.SetValue(XamlTypeToken inType,XamlQualifiedObject&amp; inObj,XamlPropertyToken inProperty,XamlQualifiedObject&amp; inValue)        的InnerException:

1 个答案:

答案 0 :(得分:3)

您不能在Setter中包含绑定。绑定应用于ValueProperty的{​​{1}}依赖项属性,这不是您的意图。在Xaml解析期间(在绑定可以应用其值之前)应用样式会发生什么,这反过来导致样式被密封。当绑定尝试调整Setter的值时,它会失败,因为只有在使用了样式后,值才会被读取。

修改

基于我的猜测,动态绑定实际上并不是必需的,您只需要一种方便的方法来访问Setter静态类的成员。我的方法是创建SystemColors的派生,以便为ResourceDictionary类提供一整套资源,包括每个属性的颜色和画笔,并相应地命名。一点反思很有帮助: -

SystemColors

在您的应用中使用此类,在App.Xaml的public class SystemColorsResources : ResourceDictionary { public SystemColorsResources() { foreach (PropertyInfo pi in typeof(SystemColors).GetProperties()) { Color c = (Color)pi.GetValue(null, null); Add(pi.Name, c); Add(pi.Name.Replace("Color", "Brush"), new SolidColorBrush(c)); } } } 列表中包含它的实例: -

MergedDictionaries

现在,您可以将系统颜色属性名称与其“Brush”变体一起用作直接静态资源: -

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <local:SystemColorsResources />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>