Наличие следующего очень простого xaml:
<DocumentViewer Name="dv">
<FixedDocument Name="fd" Loaded="fd_loaded">
<FixedDocument.Resources>
<Style x:Key="TestStyle">
<Style.Setters>
<Setter Property="TextBlock.Foreground" Value="BlueViolet"/>
</Style.Setters>
</Style>
<SolidColorBrush x:Key="foregroundBrush" Color="Orange"/>
</FixedDocument.Resources>
<PageContent Name="pc">
<FixedPage Name="fp" Width="800" Height="600" Name="fp">
<TextBlock Name="tb" Style="{DynamicResource TestStyle}">
Lorem ipsum
</TextBlock>
<TextBlock Foreground="{DynamicResource foregroundBrush}" Margin="20">
Lorem ipsum
</TextBlock>
</FixedPage>
</PageContent>
</FixedDocument>
</DocumentViewer>
Использование динамических ресурсов (которые мне действительно нужны в более сложной ситуации) здесь не работает.Используя Static Resources, цвета TextBlocks получают желаемыми цветами.Перемещение ресурсов на уровень FixedPage также делает свое дело.Но я хотел бы иметь один общий словарь ресурсов для элемента верхнего уровня (из-за изменений во время выполнения, которые пользователь может сделать для цветов, шрифтов и т. Д.).Размещение ресурсов на уровне приложения также работает.Но это не вариант по веским причинам.
Кто-нибудь может понять, почему это не работает.Это как-то связано с логическим деревом от TextBlock и выше?
Обзор ресурсов MSDN гласит:
Процесс поиска проверяет наличие запрошенного ключа в словаре ресурсов, заданном элементом, который устанавливает свойство.
- Если элемент определяет свойство Style, проверяется словарь ресурсов в Style.
- Если элемент определяет свойство Template, проверяется словарь ресурсов в FrameworkTemplate.
Затем процесс поиска переходит логическое дерево вверх к родительскому элементу и его словарю ресурсов.Это продолжается до тех пор, пока не будет достигнут корневой элемент.
Я также попытался поместить кисть и стиль в ресурсы (фиктивного) стиля в соответствии с приведенным выше объяснением MSDN.Но это тоже не сработало.
Действительно есть ощущение, что это не может быть таким сложным, но, скорее всего, я что-то наблюдаю.Любая помощь приветствуется.
РЕДАКТИРОВАТЬ
При присвоении TextBlock имени "tb" и последующем использовании tb.FindResource ("TestStyle") выдает исключение.Так что этот ресурс явно не может быть найден.Если я проверяю LogicalTreeHelper.GetParent (tb) и повторяю, что для найденных родителей я получаю ожидаемый результат: TextBlock> FixedPage> PageContent> FixedDocument ...
EDIT2
Это прекрасно работает.В чем разница с XAML, спроектированным ранее?
<Window x:Class="WpfDynamicStyles2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<SolidColorBrush x:Key="resBrush" Color="Orange"></SolidColorBrush>
</Grid.Resources>
<StackPanel>
<Button>
<TextBlock Foreground="{DynamicResource resBrush}">Dummy text...</TextBlock>
</Button>
</StackPanel>
</Grid>
</Window>
EDIT3
private void fd_Loaded(object sender, RoutedEventArgs e)
{
Object obj = pc.TryFindResource("foregroundBrush");
obj = fp.TryFindResource("foregroundBrush");
obj = tb.TryFindResource("foregroundBrush");
}
Динамический ресурс, размещенный в свойстве Foreground текстового поля, не может быть разрешен (фактический ресурс находится на уровне FixedDocument.Resources).Также использование TryFindResource в коде позади работает с pc (PageContent), но с fp (FixedPage) и tb (TextBlock) не может разрешить ресурс (obj равен null).При использовании статического ресурса в разметке XAML все работает нормально.