In the project I'm working on right now, I have a ListBox that shows the "important" text for each item, and beneath it a description that's less important. Here's a screenshot to illustrate:

ListBox with Primary and Secondary Item Text

The way I originally did this was by simply setting the "Foreground" property on the second TextBlock to "{x:Static SystemColors.GrayTextBrush}", making it appear "disabled" - ie gray.

The problem with that is that when an item is selected, the gray text is very difficult to read against the blue highlight colour. If the user has selected gray as their highlight colour (that is, they've customized their Windows theme) then the text would be nigh unreadable.

The solution? Well, originally I had used a DataTrigger to determine if the hosting ListBoxItem was selected, and setting the colour to something else if so. This was ugly, though, and difficult to get right if you wanted to take different highlight colours (ie not just blue) into account.

So now I'm using the Opacity property of TextBlock rather than its foreground colour. Setting the Opacity to "0.5" makes it 50% transparent. That way it renders as gray when it has a white background, and as light blue when selected. Here's the same screenshot with an item selected to show what I mean:

ListBox with Selected Item

Looks great! So try the Opacity property on TextBlocks for this sort of "secondary" text.