Вот сделка. Я могу создать ListBox и создать его. Я могу отредактировать копию шаблона, чтобы государства стали доступны в Expression Blend 3. И я могу изменить состояние так, чтобы цвет фона в позиции был изменен при выборе. Но я не могу изменить цвет переднего плана текста из-за ContentPresenter! Есть ли у кого-нибудь пример XAML, который показывает, как выполнить эту, казалось бы, легкую задачу?Как я могу использовать VisualStateManager для изменения цвета текста (переднего плана) ListBoxItem?
Ответ, похоже, заключается в удалении ContentPresenter и замене его каким-то стилем или шаблоном ListBoxItem, но это то место, где я застреваю. ContentPresenter ListBox ссылается на какой-то другой шаблон «TemplateBinding Template» - где это? Кроме того, когда я пытаюсь каким-либо образом модифицировать ContentPresenter, панель «Штаты» пуста, и я остаюсь с болотом XAML. К счастью, есть CTRL-Z!
Я действительно считаю, что Microsoft должна пересмотреть подход XAML или сделать Blend более полным инструментом. Способ, которым он должен работать, заключается в том, что я должен иметь возможность нажимать на ЛЮБОЙ элемент и определять для него состояния. Если я пытаюсь нарушить правила, Blend должен сказать мне это и предложить способ исправить это. Просто, когда панель «Штаты» пуста, это не помогает.
Я заменил ContentPresenter специальным DataTemplate, состоящим из пользовательского элемента управления. Этот элемент управления имеет текстовый блок. Для работы VSM мне как-то нужно получить ссылку на фактический экземпляр управляющего элемента, когда listbox вызывает событие SelectionChanged. Это проблематично. Для метода VSM.GoToState необходимо передать экземпляр, чтобы он мог работать. Кажется, я не могу получить ссылку. Идеи? Я согласен, что вы должны иметь возможность «возиться с vsm», чтобы сделать эту работу, но должно быть оптимальным словом, здесь. Но я все равно не вижу, чтобы кто-нибудь это делал. – Wade
Теперь я могу захватить каждый пользовательский экземпляр DataTemplate в массив во время события Loaded элемента управления, а затем использовать числовые индексы, чтобы найти экземпляр, основанный на родительском свойстве SelectedIndex ListBox, но это вряд ли масштабируется. – Wade
Ну, я нашел способ сделать это без использования VSM, но это исключает возможность воспроизведения анимаций. Я изменил на Foreground текстового блока на {TemplateBinding Foreground}, а затем установил Foreground в ListBoxItem. Вздох .... – Wade