using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using MaterialDesignThemes.Wpf.Converters;
namespace MaterialDesignThemes.Wpf
{
///
/// Defines the content of a message within a . Primary content should be set via the
/// standard property. Where an action is allowed, content
/// can be provided in . Standard button properties are
/// provided for actions, includiing .
///
[TypeConverter(typeof(SnackbarMessageTypeConverter))]
[TemplatePart(Name = ActionButtonPartName, Type = typeof(ButtonBase))]
public class SnackbarMessage : ContentControl
{
public const string ActionButtonPartName = "PART_ActionButton";
private Action _templateCleanupAction = () => {};
static SnackbarMessage()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(SnackbarMessage), new FrameworkPropertyMetadata(typeof(SnackbarMessage)));
}
public static readonly DependencyProperty ActionCommandProperty = DependencyProperty.Register(
"ActionCommand", typeof(ICommand), typeof(SnackbarMessage), new PropertyMetadata(default(ICommand)));
public ICommand ActionCommand
{
get { return (ICommand) GetValue(ActionCommandProperty); }
set { SetValue(ActionCommandProperty, value); }
}
public static readonly DependencyProperty ActionCommandParameterProperty = DependencyProperty.Register(
"ActionCommandParameter", typeof(object), typeof(SnackbarMessage), new PropertyMetadata(default(object)));
public object ActionCommandParameter
{
get { return (object) GetValue(ActionCommandParameterProperty); }
set { SetValue(ActionCommandParameterProperty, value); }
}
public static readonly DependencyProperty ActionContentProperty = DependencyProperty.Register(
"ActionContent", typeof(object), typeof(SnackbarMessage), new PropertyMetadata(default(object)));
public object ActionContent
{
get { return (object) GetValue(ActionContentProperty); }
set { SetValue(ActionContentProperty, value); }
}
public static readonly DependencyProperty ActionContentTemplateProperty = DependencyProperty.Register(
"ActionContentTemplate", typeof(DataTemplate), typeof(SnackbarMessage), new PropertyMetadata(default(DataTemplate)));
public DataTemplate ActionContentTemplate
{
get { return (DataTemplate) GetValue(ActionContentTemplateProperty); }
set { SetValue(ActionContentTemplateProperty, value); }
}
public static readonly DependencyProperty ActionContentStringFormatProperty = DependencyProperty.Register(
"ActionContentStringFormat", typeof(string ), typeof(SnackbarMessage), new PropertyMetadata(default(string )));
public string ActionContentStringFormat
{
get { return (string ) GetValue(ActionContentStringFormatProperty); }
set { SetValue(ActionContentStringFormatProperty, value); }
}
public static readonly DependencyProperty ActionContentTemplateSelectorProperty = DependencyProperty.Register(
"ActionContentTemplateSelector", typeof(DataTemplateSelector), typeof(SnackbarMessage), new PropertyMetadata(default(DataTemplateSelector)));
public DataTemplateSelector ActionContentTemplateSelector
{
get { return (DataTemplateSelector) GetValue(ActionContentTemplateSelectorProperty); }
set { SetValue(ActionContentTemplateSelectorProperty, value); }
}
///
/// Event correspond to left mouse button click on the Action button.
///
public static readonly RoutedEvent ActionClickEvent = EventManager.RegisterRoutedEvent("ActionClick",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SnackbarMessage));
///
/// Add / Remove ActionClickEvent handler
///
[Category("Behavior")]
public event RoutedEventHandler ActionClick { add { AddHandler(ActionClickEvent, value); } remove { RemoveHandler(ActionClickEvent, value); } }
protected virtual void OnActionClick()
{
var newEvent = new RoutedEventArgs(ActionClickEvent, this);
RaiseEvent(newEvent);
}
public override void OnApplyTemplate()
{
_templateCleanupAction();
var buttonBase = GetTemplateChild(ActionButtonPartName) as ButtonBase;
if (buttonBase != null)
{
buttonBase.Click += ButtonBaseOnClick;
_templateCleanupAction = () => buttonBase.Click -= ButtonBaseOnClick;
}
else
_templateCleanupAction = () => { };
base.OnApplyTemplate();
}
private void ButtonBaseOnClick(object sender, RoutedEventArgs routedEventArgs)
{
OnActionClick();
}
}
}