Передний план 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 ответа:
Я предполагаю, что для TextBlock свойство foreground наследуется от его родителя, если вы явно не установите его на свой экземпляр TextBlock. Например, если вы измените окно или UserControl, в котором находится этот текстовый блок, чтобы иметь передний план синего цвета, это работает? Одна вещь, которую вы можете попробовать сделать, - это стиль, а не просто установить
Foreground
в цвет, установитьTextElement.Foreground
. Посмотрим, сработает ли это.
Это не объясняет, почему проблема существует, но исправление было найдено здесь:
Http://compositewpf.codeplex.com/discussions/257596
Исправление заключается в загрузке скинов перед созданием / добавлением представлений в оболочку.