![]() |
|
Модераторы: gambit, Kefir, Partizan |
![]()
|
|
| Idsa |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 2 Всего: 62 |
В книге, по которой я изучаю WPF, есть следующий пример:
Далее следует следующий комментарий:
Дословный перевод:
Я никак не могу понять этот абзац. Насколько я понимаю, простой тригер срабатывает, если искомое свойство принимает заданное значение. Тогда в приведенном примере с щелчком по кнопке сначала должен сработать тригер Control.IsFocused. Затем свойство IsPressed станет true. Тогда сработает тригер Button.IsPressed. Это то, как я представляю себе выполнение тригеров. Однако, судя по описанию, тригеры срабатывают целиком после изменения двух свойств: IsFocused и IsPressed. Но я в упор не пойму, как так может быть, если простые тригеры завязаны на DependencyProperties. |
||||||
|
|||||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
Так. Не вкурил окончательно. но попытаюсь ответить. Когда мы щёлкаем по кнопке, то одновременно срабатывают и IsPressed и IsFocused. Однако в разметке IsPressed описано больше всего, поэтому именно она и выигрывает.
|
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 2 Всего: 62 |
А как они могут сработать одновременно? Ведь сначала изменится одно свойство, а потом - другое (пусть даже и с разницей в одну наносекунду или одну машинную команду). |
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
Idsa, нет. Именно одновременно. Пусть на низком уровне эти события и происходят по очереди, однако это не важно. WPF сделан так, чтобы всё работало логично. Соответственно считается, что эти события происходят именно одновременно. И WPF будет считать их одновременными, а значит они будут бороться за то кто установит Foreground.
Это сообщение отредактировал(а) Kefir - 18.6.2008, 12:38 |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 2 Всего: 62 |
Kefir, хорошо, пока приму это как данность.
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 2 Всего: 49 |
Idsa, в той же книжке, на страницу выше:
Это сообщение отредактировал(а) PashaPash - 18.6.2008, 20:28 |
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
PashaPash, тут вопрос всё таки о моменте установки этих триггеров. то есть переход из неактивного состояние в активное.
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 2 Всего: 49 |
Kefir, триггер становится активным в тот момент, когда начинает выполнятся его условие. Но триггер не устанавливает свойство в заданное значение в прямом смысле этого слова (не меняет Base value). Т.е. активизация первого триггера не вызывает Foreground=DarkRed. Она подменяет возвращаемое GetValue значение свойства Foreground на DarkRed - effective value. А когда триггер перестает быть активным, он перестает подменять значение свойства.
Вот тут процесс описан во всех подробностях: Dependency Property Value Precedence. |
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
PashaPash, ну это всё просто прекрасно. только я так и не понял каким обрахом это относится к теме обсуждения, так что давайте закончим оффтопик.
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 2 Всего: 49 |
Kefir, ну как бы таким образом, что это прямо объясняет почему применяется значение из последнего триггера. В отличие от объяснения "разметке IsPressed описано больше всего, поэтому именно она и выигрывает" или "WPF сделан так, чтобы всё работало логично. Соответственно считается, что эти события происходят именно одновременно.". Потому что на самом деле события - PropertyChanged - происходят последовательно, а разметки не сравниваются по количеству содержимого. Почему прямой ответ на вопрос "почему так происходит" вдруг стал офтопиком?
|
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
PashaPash, ну, насчёт "больше всего" - это я описался. Думаю и так понятно (хотя бы глядя на код - там "больше всего" не написано). Это раз. Два. WPF действительно задуман так, чтобы была какая-то логика. Скажем так - я не вижу объяснения вопроса в твоих словах. Ты говоришь что триггер не устанавливает base value. хорошо. ты говоришь, что они происходят последовательно (тоже ничего удивительного). Однако ты так и не объяснил почему выбирается последний описаный в коде сеттер. Если точно следовать твоим словам - триггеры срабатывают последовательно. Причём фокус идёт раньше нажатия. Получается, что нажатие всегда будет устанавливаться последним. Однако в то же самое время, если ты возмёшь код ТС и переместишь триггер фокуса в конец - будет устанавливаться цвет, описанный именно в фокус триггере.
Я просто никак не могу понять что ты хочешь сказать. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 2 Всего: 49 |
Kefir, я хочу сказать что триггеры не срабатывают
Смотри, вот пример:
1. Ты наводишь мышкой 2. Триггер на Control.IsMouseOver замечает что свойство IsMouseOver изменилось. Он не меняет Control.Foreground. Он просто вызывает OnPropertyChanged(Control.ForegroundProperty). 3. WFP обнаруживает что поменялось свойство, влияющее на результат рендера. Начинает рендерить гуи. Доходит до места, где нужно отрисовать текст кнопки. WFP берет за основу Base Value. 4. WPF пробегает по триггерам в порядке их объявления и у каждого спрашивает: ты активен и меняешь Control.Foreground? Триггер на IsMouseOver оказывается последним в этом списке, Effective Value принимается равным Green. Рисуется зеленый текст. 5. Ты кликаешь. IsPressed = true. 6. Триггер на Button.IsPressed замечает что свойство IsPressed изменилось. Он не меняет Control.Foreground. Он просто вызывает OnPropertyChanged(Control.ForegroundProperty). 7. WFP обнаруживает что поменялось свойство, влияющее на результат рендера. Начинает рендерить гуи. Доходит до места, где нужно отрисовать текст кнопки. WFP берет за основу Base Value. 8. WPF пробегает по триггерам в порядке их объявления и у каждого спрашивает: ты активен и меняешь Control.Foreground? Триггер на IsPressed оказывается последним в этом списке, Effective Value принимается равным Red. Рисуется красный текст. Теперь меняем объявления триггеров местами. Единственное, на что это повлияет - это пункт 8. 8b. WPF пробегает по триггерам в порядке их объявления и у каждого спрашивает: ты активен и меняешь Control.Foreground? Триггер на IsMouseOver оказывается последним в этом списке, Effective Value принимается равным Green. Рисуется зеленый текст. Т.е. Effective Value вообще не зависит от порядка и момента срабатывания триггеров. Оно зависит только от порядка, в котором эти триггеры опрашиваются системой DependencyProperties - от порядка их объявления. Это сообщение отредактировал(а) PashaPash - 19.6.2008, 13:23 |
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
Вот. Теперь моя понял что ты имеешь в виду. Насчёт "считается одновременным" - оно и есть одновременно. То есть по сути в итоге эти триггеры "работают" одновременно (точнее, их опрос проходит массово). Я просто пытаюсь рассказать человечным языком
За труды |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 2 Всего: 62 |
PashaPash, спасибо за объяснения. Теперь все стало на свои места. +1
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | WPF и Silverlight | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |