Как я могу использовать VisualStateManager для изменения цвета текста (переднего плана) ListBoxItem? - PullRequest
4 голосов
/ 04 февраля 2010

Вот сделка. Я могу создать ListBox и стилизовать его. Я могу отредактировать копию шаблона так, чтобы состояния стали доступны в Expression Blend 3. И я могу изменить это состояние, чтобы при выборе цвета фона строки изменялся. Но я не могу изменить основной цвет текста из-за ContentPresenter! У кого-нибудь есть пример XAML, который показывает, как выполнить эту, казалось бы, простую задачу?

Ответ, похоже, заключается в удалении ContentPresenter и замене его каким-либо стилем или шаблоном ListBoxItem, но я застрял здесь. ContentPresenter ListBox ссылается на какой-то другой шаблон "{TemplateBinding Template}" - где это? Кроме того, когда я пытаюсь каким-либо образом изменить ContentPresenter, панель «Состояния» гаснет, и у меня остаётся болтовня XAML. К счастью, есть CTRL-Z!

Я действительно думаю, что Microsoft должна переосмыслить подход XAML или сделать Blend гораздо более полным инструментом. Это должно работать так, чтобы я мог щелкнуть ЛЮБОЙ элемент и определить для него состояния. Если я пытаюсь нарушить правила, Blend должен сказать мне это и предложить способ исправить это. Просто пустить панель «Состояния» не полезно.

Ответы [ 3 ]

1 голос
/ 20 августа 2010

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

Это действительно просто: если вы замените ContentPresenter в своем шаблоне на ContentControl, тогда он будет работать (ContentControl имеет свойство Foreground).

1 голос
/ 04 февраля 2010

Обычно ListBox является не , ответственным за содержание самих предметов, включая то, какого цвета Foreground, если необходимо, они используют.Предметы могут представлять собой серию изображений, в этом случае Foreground не имеет смысла.Предметы могут быть сложным многоэлементным пользовательским интерфейсом, содержащим различные текстовые элементы, каждый из которых нуждается в разных Foreground цветах, поэтому снова идея ListBox, предоставляющая один Foreground цвет, не имеет смысла.в шаблоне по умолчанию для контейнера Item используется ContentPresenter, что в основном означает «размещать здесь содержимое произвольного элемента».

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

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

Например, вы можете заменить ContentPresenter в Xaml следующим: -

<Grid Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
    <TextBlock x:Name="ContentItem" Text="{Binding Property1, Mode=OneWay}" TextWrapping="Wrap" Foreground="#FFDC1C1C"/>
</Grid>

Обратите внимание, что Paddingи горизонтальное выравнивание элементов такое же, как и у докладчика.В этом случае я использую как одиночный TextBlock с именем «ContentItem» и связываю его со свойством Property1 исходных объектов.

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

0 голосов
/ 20 августа 2010

Ах, круто!Спасибо за ответ.Я думаю, что в итоге я создал пользовательский элемент управления и открыл публичное свойство Foreground, которое задало цвет, но я не могу вспомнить.Ваш ответ в сочетании с предыдущим действительно полезен.

Кроме того, я сломался и научился создавать свои собственные пользовательские элементы управления со свойствами зависимостей и целыми 9 ярдами, и, мужик, скажу вам, это того стоило.Я чувствую, что теперь могу делать все что угодно с WPF / SL.

...