我在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:
答案 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>