using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Animation; namespace SourceGit.UI { /// /// Common popup manager. /// public partial class PopupManager : UserControl { private static PopupManager instance = null; private static bool locked = false; /// /// Constructor. /// public PopupManager() { instance = this; InitializeComponent(); } /// /// Show content as popup. /// /// public static void Show(UIElement elem) { if (instance == null || locked) return; var gone = new Thickness(0, -(double)elem.GetValue(HeightProperty) - 16, 0, 0); ThicknessAnimation anim = new ThicknessAnimation(); anim.Duration = TimeSpan.FromMilliseconds(150); anim.From = gone; anim.To = new Thickness(0); instance.popupContent.Child = elem; instance.popupContent.Margin = gone; instance.Visibility = Visibility.Visible; instance.popupContent.BeginAnimation(MarginProperty, anim); } /// /// Is current locked. /// /// public static bool IsLocked() { return locked; } /// /// Lock /// public static void Lock() { locked = true; } /// /// Unlock /// public static void Unlock() { locked = false; } /// /// Close current popup. /// /// public static void Close(bool unlockFirst = false) { if (instance == null) return; if (instance.popupContent.Child == null) return; if (locked && !unlockFirst) return; locked = false; ThicknessAnimation anim = new ThicknessAnimation(); anim.Duration = TimeSpan.FromMilliseconds(150); anim.From = new Thickness(0); anim.To = new Thickness(0, -(double)instance.popupContent.Child.GetValue(HeightProperty) - 16, 0, 0); anim.Completed += (obj, ev) => { instance.Visibility = Visibility.Collapsed; instance.popupContent.Child = null; }; instance.popupContent.BeginAnimation(MarginProperty, anim); } /// /// Close by click blank area. /// /// /// private void Close(object sender, RoutedEventArgs e) { Close(); } } }