Я думаю, что нашел решение, которое работает. Не стесняйтесь, если у кого-нибудь из вас есть лучшее решение.
В мою кнопку я поместил следующий обработчик события OnClientClick:
OnClientClick="return FadeOut();"
Это вызывает мой метод FadeOut, приведенный ниже, который возвращает false, если текущий контент исчез и виден. Возврат ложного полностью отменяет асинхронную обратную передачу, которую вызвала бы UpdatePanel.
Как только анимация завершена, я устанавливаю для переменной IsFadedIn значение false и снова нажимаю кнопку (я знаю, что код для нажатия на кнопку сейчас не является кросс-браузерно-совместимым, это всего лишь подтверждение концепции, так что часть этого нужно будет исправить). Поскольку IsFadedIn имеет значение false, на этот раз метод FadeOut не возвращает false, поэтому UpdatePanel выполняет обратную передачу.
У меня есть обработчик события, прикрепленный к событию pageLoaded, так что я могу добавить новое содержимое сразу после завершения загрузки.
Хорошо : теперь я могу закончить анимацию перед загрузкой нового контента.
Плохое : мне нужно дождаться окончания анимации, прежде чем начинать процесс обратной передачи, поэтому пользователям на самом деле придется немного подождать.
var opacity = 100;
var IsFadedIn = true;
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(FadeIn);
function FadeIn(sender, args) {
if (!IsFadedIn) {
if (opacity < 100) {
opacity += 15;
$get("LowerPageContent").style.filter = "alpha(opacity=" + opacity + ")";
setTimeout(FadeIn, 1);
} else {
$get("LowerPageContent").style.filter = "alpha(opacity=100)";
IsFadedIn = true;
}
}
}
function FadeOut() {
if (IsFadedIn) {
if (opacity > 0) {
opacity -= 15;
$get("LowerPageContent").style.filter = "alpha(opacity=" + opacity + ")";
setTimeout(FadeOut, 1);
} else {
$get("LowerPageContent").style.filter = "alpha(opacity=0)";
IsFadedIn = false;
$get("TestButton").click();
}
return false;
}
}