it didn't worked for me, now it doesn't wraps anymore. But what's strange is that it don't looks the way you defined it, red, size 20, it doens't read that configuration somehow... Two things I noticed is that HyperlinkButton doesn't declare its TemplateParts
and UnderlineTextBlock and DisabledOverlay originally is TextBlock and you declare as ContentPresenter...

Here is my code. It works fine. If I can figure out how to attach a picture of my screen in this post I will show you. And BTW - when a control is disabled, it doesn't render it's mouseover effects because the VisualStateManager only allows a control to
be in one VisualState at any time (per VisualStateGroup). So if it's disabled, it obviously can't be normal, or mouseover.

Also, there is no "Text" property on a HyperlinkButton because a HyperlinkButton is actually a "ContentControl" capable of displaying much more than just text.... It can display any "Content" you like as long you tell it how to display it. That is the role
of a the "ContentPresenter.ContentTemplate" property and part of the awesomeness of Silverlight/WPF. Think of it this way - you have a data object that represents a "Person" with properties like "Name", "Age", "Hair Colour". You can bind the "Content" of
a HyperlinkButton to a "Person" but the HyperlinkButton plays dumb and says "I don't know how to show a person"... so you tell it "well write the name here, and the age here" by setting the "ContentTemplate". (Yes, most of the time people use just text in
a hyperlink but that is SO Windows XP!!! :)

Somebody asked about why the DisabledTextBlock was changed into a ContentPresenter? Well, for the same reason the MouseOver one was. All that's happening in this style is the states are showing/hiding the different content presenters depending on which state
the control is in... If you're confused about that, try to find a tutorial on the VisualStateManager and things should be much clearer.