CodePaste Logo
New Snippet New Snippet Recent Snippets Recent Snippets My Snippets My Snippets My Favorites Favorites Web Code Search Snippets Search
Sign inor Register
Language: C#

WinRT Flyout Helper

1468 Views   
public class FlyoutHelper
{
    protected Popup m_Popup = new Popup();
    public Popup Show(Popup popup, FrameworkElement button, double offset = 35d)
    {
        if (popup == null)
            throw new Exception("Popup is not defined");
        m_Popup = popup;
        if (button == null)
            throw new Exception("Button is not defined");
        if (double.IsNaN(offset))
            throw new Exception("Offset is not defined");
        var _Child = popup.Child as FrameworkElement;
        if (_Child == null)
            throw new Exception("Popup.Child is not defined");
        if (double.IsNaN(_Child.Height))
            throw new Exception("Popup.Child.Height is not defined");
        if (double.IsNaN(_Child.Width))
            throw new Exception("Popup.Child.Width is not defined");
 
        // get position of the button
        var _Page = Window.Current.Content as Page;
        var _Visual = button.TransformToVisual(_Page);
        var _Point = _Visual.TransformPoint(new Point(0, 0));
        var _Button = new
        {
            Top = _Point.Y,
            Left = _Point.X,
            Width = button.ActualWidth,
            Height = button.ActualHeight,
        };
 
        // determine location
        var _TargetTop = (_Button.Top + (_Button.Height / 2)) - _Child.Height - offset;
        var _TargetLeft = (_Button.Left + (_Button.Width / 2)) - (_Child.Width / 2);
 
        if ((_TargetLeft + _Child.Width) > Window.Current.Bounds.Width)
            _TargetLeft = Window.Current.Bounds.Width - _Child.Width - offset;
        if (_TargetLeft < 0)
            _TargetLeft = offset;
 
        // setup popup
        popup.VerticalOffset = _TargetTop;
        popup.HorizontalOffset = _TargetLeft;
 
        // add pretty animation(s)
        popup.ChildTransitions = new Windows.UI.Xaml.Media.Animation.TransitionCollection 
        { 
            new Windows.UI.Xaml.Media.Animation.EntranceThemeTransition 
            { 
                FromHorizontalOffset = 0, 
                FromVerticalOffset = 20 
            }
        };
 
        // setup
        m_Popup.IsLightDismissEnabled = true;
        m_Popup.IsOpen = true;
 
        // handle when it closes
        m_Popup.Closed -= popup_Closed;
        m_Popup.Closed += popup_Closed;
 
        // handle making it close
        Window.Current.Activated -= Current_Activated;
        Window.Current.Activated += Current_Activated;
 
        // return
        return m_Popup;
    }
 
    protected void Current_Activated(object sender, Windows.UI.Core.WindowActivatedEventArgs e)
    {
        if (m_Popup == null)
            return;
        if (e.WindowActivationState == Windows.UI.Core.CoreWindowActivationState.Deactivated)
            m_Popup.IsOpen = false;
    }
 
    protected void popup_Closed(object sender, object e)
    {
        Window.Current.Activated -= Current_Activated;
        if (m_Popup == null)
            return;
        m_Popup.IsOpen = false;
    }
}
by Jerry Nixon
  July 25, 2012 @ 9:50am
Tags:

Add a comment


Report Abuse
brought to you by:
West Wind Techologies