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

WinRT Flyout Helper

2040 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