WPF / WP7 Attached Behaviors - Выполните ДО того, как запустите событие связанного объекта - PullRequest
2 голосов
/ 10 февраля 2012

Я пытаюсь узнать о подключенном поведении в WPF / WP7 Silverlight, и я столкнулся с концептуальным препятствием, которое я задавался вопросом, может ли кто-нибудь взвесить.

Примером функциональности, которую я пытаюсь создать, является следующее: пользователь нажимает на кнопку, чей обработчик Click запускает навигацию (т. Е. NavigationContext.Navigate ()), и до того, как навигация действительно происходит, анимация происходит на кнопка, уменьшающая непрозрачность с 1 до 0 (эффект «затухания»).

Итак, по порядку:

  1. Пользователь нажимает кнопку
  2. Кнопка выполняет анимацию
  3. Навигация происходит

Достаточно просто, верно? Я создал прикрепленное поведение, которое выглядит так:

public class FadeBehavior : Behavior<Button>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.Click += (obj, args) => {
            Storyboard sb = new Storyboard();

            DoubleAnimation an = new DoubleAnimation();
            an.Duration = TimeSpan.FromMilliseconds(300);
            an.From = 1;
            an.To = 0;
            Storyboard.SetTarget(an, AssociatedObject);
            Storyboard.SetTargetProperty(an, new PropertyPath("Opacity"));

            sb.Children.Add(an);
            sb.Begin();
        };
    }
}

Это, очевидно, работает нормально, если .xaml.cs страницы, на которой находится кнопка, не содержит обработчика Click, который запускает навигацию, но когда я подключаю это, анимация не завершается до того, как происходит навигация. Конечно, я понимаю, почему это так, но мне интересно, есть ли способ для достижения этой цели, который также демонстрирует замечательное свойство не ужасного дизайна.

Я нашел этот SO поток , который, по-видимому, связан, но является ли принятый ответ ДЕЙСТВИТЕЛЬНО единственным способом сделать это?

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Если у вас есть WP7, и вы одержимы идеей выяснить это, приложение для чтения Reddit «Бэконит» демонстрирует поведение, аналогичное тому, которое меня интересует, когда вы нажимаете на заголовок рассказа. .

1 Ответ

0 голосов
/ 11 февраля 2012

Если вы создаете прикрепленное поведение, я предполагаю, что вы стремитесь устранить код позади? Тем не менее, вы хотите добавить обработчик нажатия на кнопку, что приведет к коду позади? Кажется, здесь конфликт!

Я вижу два варианта ...

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

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

См. Таким образом вопрос, который показывает, как связывание возможно со свойствами поведения смешивания:

Blend Behaviors - можете ли вы связать их свойства?

...