Помогите пожалуйста.
Имею стиль для кнопки написанный с использование триггеров и сеттеров.
Переделываю под использование VisualStateManager.
Ряд свойств объектов привязан к свойству Button.Foreground.
В состоянии Disabled хочу менять это свойство.
Background работает, а Foreground не находит. Кнопка является потомком Control, и оно у него должно быть. Может я binding не правильно делаю...
Здравствуйте, Sergey_BG, Вы писали:
S_B>Помогите пожалуйста. S_B>Имею стиль для кнопки написанный с использование триггеров и сеттеров. S_B>Переделываю под использование VisualStateManager. S_B>Ряд свойств объектов привязан к свойству Button.Foreground. S_B>В состоянии Disabled хочу менять это свойство. S_B>Background работает, а Foreground не находит. Кнопка является потомком Control, и оно у него должно быть. Может я binding не правильно делаю...
В чем выражается? Есть ли какие-нибудь исключения или сообщения в Output?
Есть ли какие-нибудь исключения или сообщения в Output?
"InvalidOperationException was thrown on button "buttonNext": Cannot resolve all propertiey references in the property path 'Foreground'. Verify that applicable objects support the property".
Details:
at System.Windows.Media.Animation.Storyboard.VerifyPathIsAnimatable(PropertyPath path)
Точно, посмотрел стек, оно конектится к корневому элементу Grid. У которого нет этого свойства. Т.е. binding некорректен. Как привязаться к свойству кнопки?
В Storyboard не получается используя ими объекта и имя свойства это сделать. Если же получить Target ={TemplateBinding Foreground}, то нет такого имени свойства TargetProperty чтоб задать кисть, а имя свойства требуется обязательно.
Здравствуйте, Sergey_BG, Вы писали:
S_B>Здравствуйте, Sergey_BG, Вы писали:
S_B>Точно, посмотрел стек, оно конектится к корневому элементу Grid. У которого нет этого свойства. Т.е. binding некорректен. Как привязаться к свойству кнопки? S_B>В Storyboard не получается используя ими объекта и имя свойства это сделать. Если же получить Target ={TemplateBinding Foreground}, то нет такого имени свойства TargetProperty чтоб задать кисть, а имя свойства требуется обязательно.
Анимировать свойства контрола нельзя, это бессмысленно. Анимировать надо тот элемент и то его свойство, к которому применён биндинг {TemplateBinding Foreground} в шаблоне контрола.
Здравствуйте, Vladek, Вы писали:
V>Анимировать свойства контрола нельзя, это бессмысленно. Анимировать надо тот элемент и то его свойство, к которому применён биндинг {TemplateBinding Foreground} в шаблоне контрола.
Я уже многое прочитал по этому поводу. Основное, это не бессмысленность, а небезопасность. Обращение к дочерним элементам внутри ControlTemplate runtime безопасно.
А вопрос возник потому, что в примерах для начинающих, меняют (правда с помощью setter) свойства ControlTemplate, а при прочтении МСДН я заметил что используется VisualStateManager и Animation с duration=0. Из VisualStateManager для меня сейчас невозможно изменять свойства контрола. VisualStateManager меняет свойства корневого элемента (по умолчанию), в котором он собственно и находится.
В целях самообучения я пытался привязать свойство элемента имеющего аналог Foreground (например Fill) к свойству ControlTemplate с Mode=TwoWay, и меняя его, менять свойство ControlTemplate, но у меня почему-то не получилось.
Правда мне кое-что не до конца понятно. Если я в VisualStateManager меняю какое нибудь свойство которое {TemplateBinding Foreground}. Свойство самого контрола не будет же изменено. Т.е. это не тоже самое как если в триггере ControlTemplate с помощью setter я меняю свойство ControlTemplate.
Это я сужу из того, что я имею два свойства внутри шаблона с биндингом
1 {TemplateBinding Foreground}
и
2 {Binding RelativeSource={RelativeSource TemplatedParent}, Path=Foreground, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}".
Изменение второго не приводит к изменению первого свойства.
Я понимаю, что если сделать биндинг первого свойства на второе, то все заработает. Ну а если есть другой контрол (например Button 2), и он биндится к свойству этого контрола (Button 1)? Тогда он (Button 2) не увидит, что свойство поменялось, так как свойство контрола (Button 1) изменено не было. Будут изменены свойства дочерних контролов внутри темплейта.
Я этот вопрос на текущий момент не понимаю, и буду очень благодарен всем замечаниям, подсказкам и ссылкам.
Вот простой пример показывающий, что я имел в виду. Здесь две кнопки. Background второй забинден на первую. Первая меняет при загрузке свойство дочернего элемента имеющего
Fill="{Binding RelativeSource={RelativeSource TemplatedParent}
и в триггере меняет background ControlTemplate при перемещении над кнопкой мыши.
Видно, что менять свойство ControlTemplate не бессмысленно. И вторая кнопка, и дочерние элементы изменения подловили.
В случае же изменения свойства дочернего элемента с биндингом к ParentTemplate и Mode=TwoWay это не работает.