Передний план TextBlock сбрасывается в унаследованное значение после применения динамического ресурса из Объединенного справочника


EDIT : я смог воспроизвести это в очень урезанной версии приложения. Вот ссылка на него .zip-файл

Http://www.mediafire.com/?cn918gi15uph1xe

У меня есть модуль добавить представление в двух различных областях-область строки состояния в верхней части, где возникает проблема. Самое странное, что когда один и тот же тип представления добавляется в основную область, нет никаких проблем. Область строки состояния-это элемент управления, а основная область-это объект ContentPresenter. Это единственная разница.

Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи! Спасибо.

-----Оригинальный Пост - - - - -

Привет всем,

Я наблюдаю какое-то странное поведение с WPF. Я использую .NET 4 и PRISM v4. Структура нашего приложения такова, что словари ресурсов кожи существуют в своей собственной сборке. Модули не ссылаются на эту сборку-вместо этого у нас есть класс skin manager, который читает из файла конфигурации, какой скин нам нужен и загружает соответствующие компоненты в объединенный словарь. Объединенный словарь задается в ресурсах приложения (мы очищаем приложение.Ресурсы.MergedDictionaries, прежде чем мы добавим его). Идея заключается в том, что мы можем позже переключать скины во время выполнения, если это необходимо, и модулям не нужно знать о скинах до времени выполнения.

Затем в нашем xaml мы ссылаемся на стили, используя DynamicResource. Проблема связана со стилем TextBlock, определенным в обложке и на который ссылается ключ, например,

<TextBlock Style="{DynamicResource someKey}" ... />

Стиль определяет семейство шрифтов, размер шрифта и передний план. Семейство шрифтов и размер применяются правильно (я проверил это). Однако передний план всегда остается черным. Я использовал Snoop и WPF Inspector, чтобы увидеть, что значение переднего плана "наследуется", а не исходит из стиля.

У меня также есть элемент управления, который наследуется от TextBlock, и все, что он делает, - это добавляет некоторые свойства, которые определяют, каким должно быть значение текста (это вообще не влияет на стиль). Я смог добавить переопределение измененного свойства для свойства переднего плана и обнаружил, что применяется значение переднего плана стиля, а затем наследуемое значение применяется после этого. Я не смог заставить отладку исходного кода .NET работать, поэтому я не мог понять, почему/откуда он вызывается во второй раз...

Вот ссылка на старый-престарый пост от парня с точно такой же проблемой - он не нашел ответа, но вместо этого нашел обходной путь. К сожалению обходной путь только работает на унаследованном элементе управления (я не могу установить InheritanceBehavior для TextBlocks).

Http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3501ed19-ab40-4064-81b5-e9b7b9d35b56

2 2

2 ответа:

Я предполагаю, что для TextBlock свойство foreground наследуется от его родителя, если вы явно не установите его на свой экземпляр TextBlock. Например, если вы измените окно или UserControl, в котором находится этот текстовый блок, чтобы иметь передний план синего цвета, это работает? Одна вещь, которую вы можете попробовать сделать, - это стиль, а не просто установить Foreground в цвет, установить TextElement.Foreground. Посмотрим, сработает ли это.

Это не объясняет, почему проблема существует, но исправление было найдено здесь:

Http://compositewpf.codeplex.com/discussions/257596

Исправление заключается в загрузке скинов перед созданием / добавлением представлений в оболочку.