I found a solution on my own, though I am not certain it's the best in terms of performance. I wound up changing the type of the Icon dependency property back to Image and defined the following in the XAML:
HTML Code:
<Image Stretch="None" Margin="{TemplateBinding IconMargin}"
Source="{Binding RelativeSource={RelativeSource FindAncestory, AncestoryType={x:Type TextBox}}, Path=Icon.Source}"/>
Works very well, but I believe this is instantiating two separate images for each textbox control. One or the Icon property and another for the Image tag in the XAML.
Any ideas?
Here's the current state of the ControlTemplate (I've made some aesthetic improvements as well):
HTML Code:
<Grid>
<Border x:Name="opMask" CornerRadius="{TemplateBinding CornerRadius}" Background="White" BorderThickness="0"/>
<Grid Background="{TemplateBinding Background}">
<Grid.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis"/>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.OpacityMask>
<VisualBrush Visual="{Binding ElementName=opMask}"/>
</Grid.OpacityMask>
<Image Grid.Column="0" Stretch="None" Margin="{TemplateBinding IconMargin}"
Source="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TextBox}}, Path=Icon.Source}"/>
<TextBlock Grid.Column="1" Background="Transparent" Text="{TemplateBinding Watermark}" FontStyle="Italic"
Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TextBox}}, Path=Text.IsEmpty, Converter={StaticResource BoolToVis}}"
Foreground="{TemplateBinding WatermarkColor}" Margin="{TemplateBinding WatermarkMargin}"
Opacity="{TemplateBinding WatermarkOpacity}" FontWeight="Normal"/>
<ScrollViewer Grid.Column="1" x:Name="PART_ContentHost" Background="Transparent"
VerticalScrollBarVisibility="{TemplateBinding VerticalScrollBarVisibility}"
Margin="{TemplateBinding TextMargin}"/>
</Grid>
<Border BorderBrush="Black" BorderThickness="1,1,0,0" Margin="0,0,0,0" CornerRadius="{TemplateBinding CornerRadius}" Height="{TemplateBinding ActualHeight}"
Width="{TemplateBinding ActualWidth}" Background="Transparent">
<Border.Effect>
<BlurEffect Radius="3"/>
</Border.Effect>
<Border.OpacityMask>
<VisualBrush Visual="{Binding ElementName=opMask}"/>
</Border.OpacityMask>
</Border>
<Border CornerRadius="{TemplateBinding CornerRadius}" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" Background="Transparent"/>
</Grid>