Вы не можете включить привязку в Setter
.Привязка применяется к свойству ValueProperty
зависимости Setter
, которое на самом деле не является вашим намерением.Происходит то, что стиль применяется во время синтаксического анализа Xaml (до того, как привязка сможет применить его значение), что, в свою очередь, приводит к запечатыванию стиля.Когда делается попытка привязки изменить значение Setter
, она терпит неудачу, потому что значения становятся считанными только после использования стиля.
Редактировать
Обход, основанный на моём предположении, что динамическое связывание на самом деле не так уж необходимо, вы просто хотите получить удобный способ доступа к членам статического класса SystemColors
.Мой подход заключается в создании производной от ResourceDictionary
для переноса полного набора ресурсов в класс SystemColors
, включая Color и Brush для каждого свойства и названного соответствующим образом.Немного размышлений полезно: -
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
в App.Xaml: -
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<local:SystemColorsResources />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Теперь вы можете использовать имена свойств системного цвета с их вариантами «Кисть» в качестве простых статических ресурсов: -
<UserControl.Resources>
<Style x:Key="TextBlockStyle1" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource WindowBrush}" />
</Style>
</UserControl.Resources>
<Grid Background="#FFB8B8B8">
<TextBlock Text="WindowColor" Style="{StaticResource TextBlockStyle1}" />
</Grid>