Themes/MaterialDesignTheme.Snackbar.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:system="clr-namespace:System;assembly=mscorlib"
                    xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
 
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Button.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.TextBlock.xaml" />
  </ResourceDictionary.MergedDictionaries>
 
  <Style x:Key="MaterialDesignSnackbarActionButton" TargetType="Button">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="BorderBrush" Value="Transparent" />
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}" />
    <Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Secondary}" />
    <Setter Property="Height" Value="36" />
    <Setter Property="HorizontalContentAlignment" Value="Center" />
    <Setter Property="Margin" Value="8,-10,-8,-10" />
    <Setter Property="Padding" Value="8" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
          <Grid x:Name="Root" Background="{TemplateBinding Background}">
            <wpf:Ripple Padding="{TemplateBinding Padding}"
                        HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                        Content="{TemplateBinding Content}"
                        ContentTemplate="{TemplateBinding ContentTemplate}"
                        Focusable="False"
                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
          </Grid>
          <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
              <Setter Property="Background" Value="{DynamicResource MaterialDesign.Brush.SnackBar.MouseOver}" />
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
              <Setter Property="Opacity" Value="0.38" />
            </Trigger>
            <Trigger Property="DockPanel.Dock" Value="Bottom">
              <Setter Property="Margin" Value="0,18,-8,-8" />
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
    <Setter Property="TextBlock.FontSize" Value="14" />
    <Setter Property="TextBlock.FontWeight" Value="Medium" />
    <Setter Property="VerticalAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="wpf:RippleAssist.Feedback" Value="{DynamicResource MaterialDesign.Brush.Button.Ripple}" />
  </Style>
 
  <Style x:Key="MaterialDesignSnackbarActionLightButton"
         TargetType="Button"
         BasedOn="{StaticResource MaterialDesignSnackbarActionButton}">
    <Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Primary.Light}" />
  </Style>
 
  <Style x:Key="MaterialDesignSnackbarActionMidButton"
         TargetType="Button"
         BasedOn="{StaticResource MaterialDesignSnackbarActionButton}">
    <Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Primary}" />
  </Style>
 
  <Style x:Key="MaterialDesignSnackbarActionDarkButton"
         TargetType="Button"
         BasedOn="{StaticResource MaterialDesignSnackbarActionButton}">
    <Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Primary.Dark}" />
  </Style>
 
  <Style TargetType="wpf:SnackbarMessage">
    <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Margin" Value="16" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="wpf:SnackbarMessage">
          <DockPanel>
            <!-- will become a Panel to wrap a "pretend" button -->
            <Button x:Name="PART_ActionButton"
                    HorizontalAlignment="Right"
                    Panel.ZIndex="1"
                    Command="{TemplateBinding ActionCommand}"
                    CommandParameter="{TemplateBinding ActionCommandParameter}"
                    Content="{TemplateBinding ActionContent}"
                    ContentStringFormat="{TemplateBinding ActionContentStringFormat}"
                    ContentTemplate="{TemplateBinding ActionContentTemplate}"
                    ContentTemplateSelector="{TemplateBinding ActionContentTemplateSelector}"
                    Style="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type wpf:Snackbar}}, Path=ActionButtonStyle}"
                    Visibility="{TemplateBinding ActionContent, Converter={x:Static converters:NullableToVisibilityConverter.CollapsedInstance}}">
              <DockPanel.Dock>
                <MultiBinding Converter="{x:Static converters:SnackbarActionButtonPlacementModeConverter.Instance}">
                  <Binding Path="ActionButtonPlacement" RelativeSource="{RelativeSource AncestorType={x:Type wpf:Snackbar}}" />
                  <Binding Path="(wpf:SnackbarMessage.InlineActionButtonMaxHeight)" RelativeSource="{RelativeSource AncestorType={x:Type wpf:Snackbar}}" />
                  <Binding Path="ActualHeight" RelativeSource="{RelativeSource AncestorType={x:Type wpf:Snackbar}}" />
                </MultiBinding>
              </DockPanel.Dock>
            </Button>
 
            <ContentPresenter MaxHeight="{Binding RelativeSource={RelativeSource AncestorType={x:Type wpf:Snackbar}}, Path=(wpf:SnackbarMessage.ContentMaxHeight)}"
                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                              Content="{TemplateBinding Content}"
                              ContentStringFormat="{TemplateBinding ContentStringFormat}"
                              ContentTemplate="{TemplateBinding ContentTemplate}"
                              ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}">
              <ContentPresenter.Resources>
                <DataTemplate DataType="{x:Type system:String}">
                  <TextBlock Padding="0" Text="{Binding}">
                    <TextBlock.Style>
                      <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource MaterialDesignBody1TextBlock}">
                        <Setter Property="FontSize" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type wpf:Snackbar}}, Path=FontSize}" />
                        <Setter Property="FontWeight" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type wpf:Snackbar}}, Path=FontWeight}" />
                        <Setter Property="TextTrimming" Value="CharacterEllipsis" />
                        <Setter Property="TextWrapping" Value="WrapWithOverflow" />
                      </Style>
                    </TextBlock.Style>
                  </TextBlock>
                </DataTemplate>
              </ContentPresenter.Resources>
            </ContentPresenter>
          </DockPanel>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
 
  <Style TargetType="wpf:Snackbar">
    <Setter Property="ActionButtonStyle" Value="{StaticResource MaterialDesignSnackbarActionButton}" />
    <Setter Property="Background" Value="{DynamicResource MaterialDesign.Brush.SnackBar.Background}" />
    <Setter Property="ClipToBounds" Value="True" />
    <Setter Property="FontSize" Value="14" />
    <Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Background}" />
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="MaxWidth" Value="568" />
    <Setter Property="MinWidth" Value="288" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="wpf:Snackbar">
          <ControlTemplate.Resources>
            <Storyboard x:Key="ActivateStoryboard" Duration="0:0:0.3">
              <DoubleAnimation Storyboard.TargetName="Root"
                               Storyboard.TargetProperty="Tag"
                               From="0"
                               To="1"
                               Duration="0:0:0.3">
                <DoubleAnimation.EasingFunction>
                  <SineEase EasingMode="EaseOut" />
                </DoubleAnimation.EasingFunction>
              </DoubleAnimation>
              <DoubleAnimation BeginTime="0"
                               Storyboard.TargetName="ContentPresenter"
                               Storyboard.TargetProperty="Opacity"
                               To="0"
                               Duration="0" />
              <DoubleAnimation BeginTime="0:0:0.075"
                               Storyboard.TargetName="ContentPresenter"
                               Storyboard.TargetProperty="Opacity"
                               From="0"
                               To="1"
                               Duration="0:0:0.225">
                <DoubleAnimation.EasingFunction>
                  <SineEase EasingMode="EaseOut" />
                </DoubleAnimation.EasingFunction>
              </DoubleAnimation>
            </Storyboard>
            <Storyboard x:Key="DeactivateStoryboard" Duration="0:0:0.3">
              <DoubleAnimation Storyboard.TargetName="Root"
                               Storyboard.TargetProperty="Tag"
                               From="1"
                               To="0"
                               Duration="0:0:0.3">
                <DoubleAnimation.EasingFunction>
                  <SineEase EasingMode="EaseOut" />
                </DoubleAnimation.EasingFunction>
              </DoubleAnimation>
            </Storyboard>
          </ControlTemplate.Resources>
          <StackPanel x:Name="Root">
            <StackPanel.Tag>
              <system:Double>0.0</system:Double>
            </StackPanel.Tag>
            <StackPanel.Height>
              <MultiBinding Converter="{x:Static converters:MathMultipleConverter.MultiplyInstance}">
                <Binding ElementName="ContentBorder" Path="ActualHeight" />
                <Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
              </MultiBinding>
            </StackPanel.Height>
            <Border x:Name="ContentBorder"
                    MinHeight="48"
                    VerticalAlignment="Stretch"
                    Background="{TemplateBinding Background}"
                    CornerRadius="3"
                    SnapsToDevicePixels="True">
              <ContentPresenter x:Name="ContentPresenter"
                                Margin="{TemplateBinding Padding}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                Content="{TemplateBinding Message}" />
            </Border>
          </StackPanel>
          <ControlTemplate.Triggers>
            <Trigger Property="IsActive" Value="True">
              <Trigger.EnterActions>
                <BeginStoryboard Storyboard="{StaticResource ActivateStoryboard}" />
              </Trigger.EnterActions>
              <Trigger.ExitActions>
                <BeginStoryboard Storyboard="{StaticResource DeactivateStoryboard}" />
              </Trigger.ExitActions>
            </Trigger>
            <Trigger Property="HorizontalAlignment" Value="Stretch">
              <Setter TargetName="ContentBorder" Property="CornerRadius" Value="0" />
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
    <Setter Property="VerticalAlignment" Value="Bottom" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Style.Triggers>
      <Trigger Property="HorizontalAlignment" Value="Stretch">
        <Setter Property="MaxWidth" Value="{x:Static system:Double.MaxValue}" />
      </Trigger>
    </Style.Triggers>
  </Style>
 
</ResourceDictionary>