Themes/MaterialDesignTheme.SmartHint.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters"
                    xmlns:convertersInternal="clr-namespace:MaterialDesignThemes.Wpf.Converters.Internal"
                    xmlns:system="clr-namespace:System;assembly=mscorlib"
                    xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf"
                    xmlns:behaviors="clr-namespace:MaterialDesignThemes.Wpf.Behaviors">
 
  <Style TargetType="{x:Type wpf:SmartHint}">
    <Style.Resources>
      <system:Double x:Key="NoContentFloatingScale">1.0</system:Double>
      <CubicEase x:Key="AnimationEasingFunction" EasingMode="EaseInOut" />
    </Style.Resources>
    <Setter Property="wpf:BehaviorsAssist.Behaviors">
      <Setter.Value>
        <wpf:BehaviorCollection>
          <behaviors:SmartHintBehavior />
        </wpf:BehaviorCollection>
      </Setter.Value>
    </Setter>
    <Setter Property="HorizontalAlignment" Value="Stretch" />
    <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="IsHitTestVisible" Value="False" />
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type wpf:SmartHint}">
          <Grid Margin="{TemplateBinding Padding}"
                HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                VerticalAlignment="{TemplateBinding VerticalAlignment}">
            <VisualStateManager.VisualStateGroups>
              <VisualStateGroup x:Name="ContentStates">
                <VisualStateGroup.Transitions>
                  <VisualTransition From="*" To="HintFloatingPosition">
                    <Storyboard>
                      <DoubleAnimation Storyboard.TargetName="SimpleHintTextBlock"
                                       Storyboard.TargetProperty="Opacity"
                                       To="0"
                                       Duration="0:0:0" />
                    </Storyboard>
                  </VisualTransition>
                  <VisualTransition From="*" To="HintRestingPosition">
                    <Storyboard>
                      <DoubleAnimation EasingFunction="{StaticResource AnimationEasingFunction}"
                                       Storyboard.TargetName="SimpleHintTextBlock"
                                       Storyboard.TargetProperty="Opacity"
                                       Duration="0:0:0.15" />
                    </Storyboard>
                  </VisualTransition>
                </VisualStateGroup.Transitions>
                <VisualState x:Name="HintFloatingPosition">
                  <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="SimpleHintTextBlock"
                                     Storyboard.TargetProperty="Opacity"
                                     To="0"
                                     Duration="0" />
                  </Storyboard>
                </VisualState>
                <VisualState x:Name="HintRestingPosition">
                  <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="SimpleHintTextBlock"
                                     Storyboard.TargetProperty="Opacity"
                                     Duration="0" />
                  </Storyboard>
                </VisualState>
              </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <ContentControl x:Name="SimpleHintTextBlock"
                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                            Content="{TemplateBinding Hint}"
                            FontSize="{TemplateBinding FontSize}"
                            IsHitTestVisible="False"
                            IsTabStop="False"
                            Opacity="{TemplateBinding HintOpacity}"
                            Visibility="{TemplateBinding UseFloating, Converter={x:Static converters:BooleanToVisibilityConverter.NotCollapsedInstance}}" />
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
    <Setter Property="VerticalAlignment" Value="Top" />
    <Setter Property="VerticalContentAlignment" Value="Bottom" />
    <Style.Triggers>
      <Trigger Property="UseFloating" Value="True">
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="{x:Type wpf:SmartHint}">
              <Grid Margin="{TemplateBinding Padding}"
                    HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                    VerticalAlignment="{TemplateBinding VerticalAlignment}">
                <VisualStateManager.VisualStateGroups>
                  <VisualStateGroup x:Name="ContentStates">
                    <VisualStateGroup.Transitions>
                      <VisualTransition From="*" To="HintFloatingPosition">
                        <Storyboard>
                          <DoubleAnimation EasingFunction="{StaticResource AnimationEasingFunction}"
                                           Storyboard.TargetName="FloatingHintTextBlock"
                                           Storyboard.TargetProperty="Opacity"
                                           To="{TemplateBinding HintOpacity}"
                                           Duration="0:0:0.15" />
                          <DoubleAnimation EasingFunction="{StaticResource AnimationEasingFunction}"
                                           Storyboard.TargetName="ScaleHost"
                                           Storyboard.TargetProperty="Scale"
                                           To="1"
                                           Duration="0:0:0.15" />
                        </Storyboard>
                      </VisualTransition>
                      <VisualTransition From="*" To="HintRestingPosition">
                        <Storyboard>
                          <DoubleAnimation EasingFunction="{StaticResource AnimationEasingFunction}"
                                           Storyboard.TargetName="FloatingHintTextBlock"
                                           Storyboard.TargetProperty="Opacity"
                                           Duration="0:0:0.15" />
                          <DoubleAnimation EasingFunction="{StaticResource AnimationEasingFunction}"
                                           Storyboard.TargetName="ScaleHost"
                                           Storyboard.TargetProperty="Scale"
                                           Duration="0:0:0.15" />
                        </Storyboard>
                      </VisualTransition>
                    </VisualStateGroup.Transitions>
                    <VisualState x:Name="HintFloatingPosition">
                      <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock"
                                         Storyboard.TargetProperty="Opacity"
                                         To="{TemplateBinding HintOpacity}"
                                         Duration="0" />
                        <DoubleAnimation Storyboard.TargetName="ScaleHost"
                                         Storyboard.TargetProperty="Scale"
                                         To="1"
                                         Duration="0" />
                      </Storyboard>
                    </VisualState>
                    <VisualState x:Name="HintRestingPosition">
                      <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock"
                                         Storyboard.TargetProperty="Opacity"
                                         Duration="0" />
                        <DoubleAnimation Storyboard.TargetName="ScaleHost"
                                         Storyboard.TargetProperty="Scale"
                                         Duration="0" />
                      </Storyboard>
                    </VisualState>
                  </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <wpf:ScaleHost x:Name="ScaleHost" />
                <Grid>
                  <Grid.Clip>
                    <MultiBinding Converter="{x:Static converters:FloatingHintClippingGridConverter.Instance}">
                      <Binding Path="ActualWidth" RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Path="ActualHeight" RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Path="FloatingScale" RelativeSource="{RelativeSource TemplatedParent}" />
                    </MultiBinding>
                  </Grid.Clip>
                  <Grid.RenderTransform>
                    <MultiBinding Converter="{x:Static converters:FloatingHintTranslateTransformConverter.Instance}">
                      <Binding ElementName="ScaleHost" Path="Scale" />
                      <Binding Path="FloatingScale" RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Source="{StaticResource NoContentFloatingScale}" />
                      <Binding Path="." RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Path="FloatingOffset" RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Path="(behaviors:SmartHintBehavior.YOffset)" RelativeSource="{RelativeSource TemplatedParent}" />
                      <!-- The bindings below are only here to trigger a recalculation - needed to support AcceptsReturn=true scenario for TextBoxes for example as well as "runtime" changes to the desired hint placement -->
                      <Binding Path="InitialVerticalOffset" RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Path="InitialHorizontalOffset" RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Path="FloatingTarget.ActualHeight" RelativeSource="{RelativeSource TemplatedParent}" FallbackValue="{x:Static DependencyProperty.UnsetValue}" />
                      <Binding Path="FontSize" RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Path="HintHost.ActualWidth" RelativeSource="{RelativeSource TemplatedParent}" />
                      <Binding Path="HintHost.ActualHeight" RelativeSource="{RelativeSource TemplatedParent}" />
                    </MultiBinding>
                  </Grid.RenderTransform>
                  <Canvas Width="{Binding ElementName=FloatingHintTextBlock, Path=ActualWidth}"
                          Height="{Binding ElementName=FloatingHintTextBlock, Path=ActualHeight}"
                          HorizontalAlignment="Left">
                    <ContentControl x:Name="FloatingHintTextBlock"
                                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                    FontFamily="{TemplateBinding FontFamily}"
                                    FontSize="{TemplateBinding FontSize}"
                                    IsHitTestVisible="False"
                                    IsTabStop="False"
                                    Opacity="{TemplateBinding HintOpacity}"
                                    RenderTransformOrigin="0,0"
                                    Visibility="{TemplateBinding UseFloating, Converter={x:Static converters:BooleanToVisibilityConverter.CollapsedInstance}}">
                       
                      <ContentControl.Margin>
                        <MultiBinding Converter="{x:Static convertersInternal:FloatingHintTextBlockMarginConverter.Instance}">
                          <Binding Path="(wpf:HintAssist.HintHorizontalAlignment)" RelativeSource="{RelativeSource TemplatedParent}" />
                          <Binding Path="(wpf:HintAssist.FloatingHintHorizontalAlignment)" RelativeSource="{RelativeSource TemplatedParent}" />
                          <Binding Path="HorizontalContentAlignment" RelativeSource="{RelativeSource TemplatedParent}" />
                          <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}" />
                          <Binding Path="ActualWidth" RelativeSource="{RelativeSource TemplatedParent}" />
                          <Binding ElementName="ScaleHost" Path="Scale" />
                          <Binding Path="FloatingScale" RelativeSource="{RelativeSource TemplatedParent}" />
                          <Binding Source="{StaticResource NoContentFloatingScale}" />
                        </MultiBinding>
                      </ContentControl.Margin>
                      <ContentControl.Tag>
                        <system:Double>0.0</system:Double>
                      </ContentControl.Tag>
                      <ContentControl.RenderTransform>
                        <MultiBinding Converter="{x:Static converters:FloatingHintScaleTransformConverter.Instance}">
                          <Binding ElementName="ScaleHost" Path="Scale" />
                          <Binding Path="FloatingScale" RelativeSource="{RelativeSource TemplatedParent}" />
                          <Binding Source="{StaticResource NoContentFloatingScale}" />
                        </MultiBinding>
                      </ContentControl.RenderTransform>
                      <Grid x:Name="HintBackgroundGrid" Tag="{DynamicResource MaterialDesign.Brush.Background}" IsHitTestVisible="False">
                        <ContentControl Content="{TemplateBinding Hint}" IsTabStop="False">
                          <ContentControl.Margin>
                            <MultiBinding Converter="{x:Static converters:FloatingHintContainerMarginConverter.Instance}">
                              <Binding ElementName="ScaleHost" Path="Scale" />
                              <Binding Path="FloatingMargin" RelativeSource="{RelativeSource TemplatedParent}" />
                              <Binding Path="FloatingScale" RelativeSource="{RelativeSource TemplatedParent}" />
                            </MultiBinding>
                          </ContentControl.Margin>
                        </ContentControl>
                      </Grid>
                    </ContentControl>
                  </Canvas>
                </Grid>
              </Grid>
              <ControlTemplate.Triggers>
                <MultiTrigger>
                  <MultiTrigger.Conditions>
                    <Condition Property="IsHintInFloatingPosition" Value="True" />
                    <Condition Property="wpf:HintAssist.ApplyHintPaddingBrush" Value="True" />
                  </MultiTrigger.Conditions>
                  <Setter TargetName="HintBackgroundGrid" Property="Background">
                    <Setter.Value>
                      <MultiBinding Converter="{x:Static converters:FirstNonNullConverter.Instance}">
                        <Binding Path="(wpf:HintAssist.HintPaddingBrush)" RelativeSource="{RelativeSource TemplatedParent}" />
                        <Binding Path="Tag" ElementName="HintBackgroundGrid" />
                      </MultiBinding>
                    </Setter.Value>
                  </Setter>
                </MultiTrigger>
              </ControlTemplate.Triggers>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Trigger>
    </Style.Triggers>
  </Style>
 
</ResourceDictionary>