В шаблоне управления кнопки, как я могу установить цвет текста?
===============================================================

Используя Silverlight 4 и WPF 4, я пытаюсь создать стиль кнопки, который изменяет цвет текста любого содержащегося в нем текста, когда кнопка наведена на мышь. Поскольку я пытаюсь сделать это совместимым как с Silverlight, так и с WPF, я использую диспетчер визуального состояния:

Поскольку это шаблон для обычной старой кнопки, я знаю, что нет гарантии, что внутри нее даже есть текстовый блок, и сначала я не был уверен, что это вообще возможно. Любопытно, что цвет текстаделает изменить, если кнопка объявлена как:

но этоне изменить, если кнопка объявлена как:

Хотя визуальное дерево (при проверке в snoop) идентично (Button -> ContentPresenter -> TextBlock), с оговоркой, что текстовый блок, созданный в 1-й версии, имеет свой контекст данных, установленный на «Hello, World», тогда как текстовый блок в вторая версия просто имеет свой набор свойств текста. Я предполагаю, что это как-то связано с порядком создания элемента управления (в первой версии кнопка создает текстовый блок, во второй версии текстовый блок может быть создан первым? Действительно не уверен в этом).

В ходе исследования этого я видел несколько решений, которые работают в Silverlight (например, замена ContentPresenter на ContentControl), но они не будут работать в WPF (на самом деле происходит сбой программы).

Поскольку это находится в шаблоне элемента управления кнопки, и я хотел бы использовать VSM, если это возможно, я думаю, что это также исключает явное изменение собственного свойства Foreground кнопки (я не знаю, как бы я получил к нему доступ из шаблона? )

Я очень ценю любую помощь, совет, который может дать любой.

 после некоторых размышлений, решение, к которому я в конечном итоге пришел, заключается в добавлении присоединенного свойства к элементу ContentPresenter в шаблоне элемента управления кнопки. Вложенное свойство принимает Color, и когда установлено, проверяет визуальное дерево предъявителя контента для любых TextBlocks, и в свою очередь устанавливает их свойства Foreground равным переданному значению. Это, очевидно, может быть расширено / сделано для обработки дополнительных элементов, но пока это работает за то что мне нужно.

и я изменил шаблон так:



Я использую это в моем шаблоне, и он отлично работает

Вы должны вставить этот код при создании шаблона кнопки, но я использую его, когда помещаю текст в содержимое кнопки и если вы хотите добавить другие элементы управления на нее, используйте обычный стиль



 которое передается элементам управления, которые создает предъявитель контента. Поскольку это свойство зависимости, а не свойство элементов управления, доступных в шаблоне, его сложно анимировать с использованием чистого xaml.

В MSDN есть несколько примеров того, как изменить цвет переднего плана. Однако, это не похоже на то, что вы хотите сделать эту работу из кода. (Http://msdn.microsoft.com/en-us/library/system.windows.controls.button(VS.95).aspx)

Шаблон кнопки по умолчанию удерживает вас. Как вы заметили, кнопка - это элемент управления без содержимого; это означает, что дизайнер может вставить в него какой-нибудь случайный визуальный объект. Отсутствие содержимого заставляет свойство переднего плана быть элементом шаблона, а не элементом управления, потому что нет гарантированного компонента для установки цвета. Вот почему внутри него есть ведущий контента.

Так что теперь у вас есть два варианта. 1. Простой, но не гибкий (чистый xaml), 2. Создайте свой собственный элемент управления, который делает все, что делает кнопка (требует кода и большого количества тестирования)

Я реализую # 1 для вас.

Если вы измените шаблон кнопки и**удалить ведущий контента** Вы можете разместить внутри него два текстовых блока. Один с нормальным цветом, другой с помощью мыши над цветом.

Обратите внимание, как свойства Text текстовых блоков связаны с содержимым кнопки. Это становится проблемой, если когда-либо возникает необходимость связать что-либо, кроме текста. TextBlocks просто не может показывать ничего, кроме буквенно-цифровых значений.

Также обратите внимание, что по умолчанию я свернул видимость на RedBlock.

Тогда по моему`MouseOver VisualState's Storyboard` Я могу оживить RedBlock, чтобы он был видимым, а BlueBlock, чтобы быть невидимым:

Это похоже на взлом, и я, вероятно, не реализовал бы эту кнопку во многих местах. Я бы хотел создать свой собственный Button с хорошими DependencyProperties для привязки. По одному для HighlightForeground и Text. Я также хотел бы скрыть или, по крайней мере, выдать исключение, если бы кто-то попытался установить для содержимого что-либо кроме значений AlphaNumeric. Однако XAML был бы одинаковым, у меня были бы разные текстовые блоки для разных визуальных состояний.

Надеюсь, это поможет.

Хорошего дня.

Иеремия