Villa's hopes of a Boxing Day boost were thwarted as they went down to Dwight Gayle's last-minute goal at Villa Park.
The Crystal Palace sub broke down the left and cut in to beat Brad Guzan with a well-struck shot from just outside the penalty area.
It was a bitter blow for Paul Lambert's men, who had struggled for long periods to break down the resolute Londoners but had almost broke the deadlock a few minutes earlier when Jordan Bowery's header was tipped over by Julian Speroni.
There was a lot of enterprise to Villa's early play, only for several promising moves to break down through an over-elaborate approach around the penalty area.
In fact it was Palace who produced the first goal attempt, albeit a tame header from Yannick Bolaise which Brad Guzan held comfortably.
Jason Puncheon also tried his luck with a low shot which was well off target, and as the 20th minute passed, those were the only two efforts at either end.
Villa hopes were raised when Marc Albrighton knocked the ball forward from just outside the area and Libor Kozak lifted it over the bar.
As it happened, a linesman had spotted that Albrighton had handled.
Guzan had to make another save, again with no great inconvenience, when he held a Puncheon header, but Kozak needed treatment when he fell awkwardly following a 31st-minute challenge by Palace skipper Mile Jedanik.
Barry Bannan had been producing some nice touches and in the 35th minute his menacing cross was fisted away by Guzan - and a couple of minutes later the former Villa midfielder was booked for kicking the ball away after an offside decision against him.
In the 39th minute Julian Speroni was forced into his first save, the keeper holding Kozak's header following Albrighton's floated free-kick.
But the home side's frustration was summed up when Fabian Delph controlled the ball 30 yards out - and then sliced a left-foot effort well wide of the target.
Karim El Ahamdi did better in first half stoppage time, having a dipping 20-yarder deflected over for a corner after Albrighton's free-kick was headed away by Jedinak.
Albrighton delivered the flag kick from the right, Kozak flicking it on for Gabby Agbonlahor to head just over at the far post as the half-time whistle blew.
It was certainly the closest Villa had come so far, but Palace were even closer three minutes after the interval, Puncheon's shot being pushed out by Guzan after Bolaise had got away from Antonio Luna down the right flank and cut inside to set up an inviting chance.
That was followed by a sustained spell of Villa pressure, culminating in Andi Weimann's half-volley being held by Speroni after Delph had lofted a dangerous ball into the area.
Even so, there was huge relief a minute later when Puncheon's pass enabled Bannan to unleash a low shot which Guzan managed to push against the post as the keeper dived to his left.
Agbonlahor then made a forceful run before hitting a shot which was held by Speroni at the foot of the post, although Weimann was wasteful in scooping his effort much too high after Albrighton's superb reverse pass and Lowton's astute cut-back had set up the opening.
Both sides were now looking far more likely to score, and Guzan had to make another important save when he pushed away Puncheon's deflected drive before Joel Ward fired not far over.
Villa: Guzan; Lowton, Clark, Baker, Luna (Bacuna 67); Albrighton, El Ahmadi, Delph, Weimann (Tonev 87); Kozak (Bowery 76), Agbonlahor. Unused subs: Steer, Helenius, Sylla, Gardner.
Crystal Palace: Speroni; Mariappa, Gabbidon, Delaney, Parr; Bolaise, Ward, Jedinak, Bannan (Moxey 86), Puncheon (Williams 65);Jerome (Gayle 72).