Передний план TextBlock сбрасывается на унаследованное значение после применения динамического ресурса из объединенного словаря - PullRequest
2 голосов
/ 13 мая 2011

РЕДАКТИРОВАТЬ : мне удалось воспроизвести это в очень урезанной версии приложения. Вот ссылка на ZIP-файл

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

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

Пожалуйста, дайте мне знать, если у вас есть понимание! Благодаря.

----- Исходное сообщение -----

Привет всем,

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 мая 2011

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

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

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

0 голосов
/ 13 мая 2011

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

...