You could apply the concepts and ideas from this book to other areas and continue to experiment and explore their effect in these new areas. For example, we've learned about Adorner objects, so you could use that new-found knowledge to implement some visual feedback for the common drag and drop functionality in the main window's adorner layer.
You could then further extend this idea, using what you've discovered about Attached Properties, and completely encapsulate this drag and drop functionality, enabling the developers that utilize your application framework to make use of this feature in a property-based manner.
For example, you could create a DragDropProperties class that declared Attached Properties, such as IsDragSource, IsDragTarget, DragEffects, DragDropType, and DropCommand, and it could be extended by your relevant Attached Property classes, such as a ListBoxProperties class.
You could then declare a BaseDragDropManager class to be used in the DragDropProperties class, that stitches everything together, by attaching and removing the appropriate event handlers, starting the drag and drop procedure, updating the cursor via the drag and drop effects as it moves across the screen, and executing the ICommand object assigned to the DropCommand Property.
This leads to a further area that could be extended. Not only can we handle UI events in Attached Properties, but we can also combine them to perform more complex functionality. For example, let's say that we have an Attached Property of type string, named Label.
When this property is set, it could apply a particular ControlTemplate element from resources to the current TextBox object's Template property. This template could display the text from this property in a secondary text element and therefore act as an internal label. When the TextBox object has a value, the label text element could be hidden via an IValueConverter implementation that extends our BaseVisibilityConverter class:
<TextBlock Text="{Binding (Attached:TextBoxProperties.Label), RelativeSource={RelativeSource AncestorType=TextBox}, FallbackValue=''}" Foreground="{Binding (Attached:TextBoxProperties.LabelColor), RelativeSource={RelativeSource AncestorType=TextBox}, FallbackValue=#FF000000}" Visibility="{Binding Text, RelativeSource={RelativeSource AncestorType=TextBox}, Converter={StaticResource StringToVisibilityConverter}, FallbackValue=Collapsed}" ... />
As shown in the preceding example, we could then declare another Attached Property, named LabelColor, of type Brush, which specifies the color to be used by the Label Attached Property when it is set. Note that if the LabelColor property is not set, then it will either use its default value if it is set, or the value specified in the FallbackValue property.