Shade.cs (7993B)
1 using System; 2 using System.Linq; 3 using System.Windows; 4 using Windows.Foundation; 5 using Windows.UI; 6 using Windows.UI.Xaml; 7 using Windows.UI.Xaml.Controls; 8 using Windows.UI.Xaml.Input; 9 using Windows.UI.Xaml.Media; 10 using Windows.UI.Xaml.Media.Animation; 11 12 namespace File360 13 { 14 public class Shade : Grid 15 { 16 #region Globals and events 17 18 private readonly PropertyPath _translatePath = new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)"); 19 private readonly PropertyPath _colorPath = new PropertyPath("(Grid.Background).(SolidColorBrush.Color)"); 20 21 private readonly TranslateTransform _listFragmentTransform = new TranslateTransform(); 22 private readonly TranslateTransform _deltaTransform = new TranslateTransform(); 23 private const int MaxAlpha = 190; 24 25 public delegate void DrawerEventHandler(object sender); 26 public event DrawerEventHandler DrawerOpened; 27 public event DrawerEventHandler DrawerClosed; 28 29 private Storyboard _fadeInStoryboard; 30 private Storyboard _fadeOutStoryboard; 31 private Grid _shadowFragment; 32 private Grid _slideFragment; 33 34 #endregion 35 36 #region Properties 37 38 public bool Shadowed { get; set; } 39 private PropertyPath TranslatePath 40 { 41 get { return _translatePath; } 42 } 43 private PropertyPath ColorPath 44 { 45 get { return _colorPath; } 46 } 47 48 #endregion 49 50 #region Methods 51 52 public Shade() 53 { 54 Shadowed = false; 55 } 56 57 public void Shadow(Grid Element) 58 { 59 _slideFragment = (Grid)Element; 60 // Create a shadow element 61 _shadowFragment = new Grid 62 { 63 Name = "_shadowFragment", 64 Background = new SolidColorBrush(Color.FromArgb(0, 255, 255, 255)), 65 HorizontalAlignment = HorizontalAlignment.Stretch, 66 VerticalAlignment = VerticalAlignment.Stretch, 67 Visibility = Visibility.Collapsed 68 }; 69 _shadowFragment.Tapped += shadowFragment_Tapped; 70 _shadowFragment.IsHitTestVisible = false; 71 72 // Set ZIndexes 73 Canvas.SetZIndex(_shadowFragment, 50); 74 Canvas.SetZIndex(_slideFragment, 51); 75 Children.Add(_shadowFragment); 76 77 // Create a new fadeIn animation storyboard 78 _fadeInStoryboard = new Storyboard(); 79 80 // New double animation 81 var doubleAnimation1 = new DoubleAnimation 82 { 83 Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200)), 84 To = 0 85 }; 86 87 Storyboard.SetTarget(doubleAnimation1, _slideFragment); 88 Storyboard.SetTargetProperty(doubleAnimation1, TranslatePath.Path); 89 _fadeInStoryboard.Children.Add(doubleAnimation1); 90 91 // New color animation for _shadowFragment 92 var colorAnimation1 = new ColorAnimation 93 { 94 Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200)), 95 To = Color.FromArgb(190, 0, 0, 0) 96 }; 97 98 Storyboard.SetTarget(colorAnimation1, _shadowFragment); 99 Storyboard.SetTargetProperty(colorAnimation1, ColorPath.Path); 100 _fadeInStoryboard.Children.Add(colorAnimation1); 101 102 // Create a new fadeOut animation storyboard 103 _fadeOutStoryboard = new Storyboard(); 104 105 // New double animation 106 var doubleAnimation2 = new DoubleAnimation 107 { 108 Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200)), 109 To = -_slideFragment.Width - 200 110 }; 111 112 Storyboard.SetTarget(doubleAnimation2, _slideFragment); 113 Storyboard.SetTargetProperty(doubleAnimation2, TranslatePath.Path); 114 _fadeOutStoryboard.Children.Add(doubleAnimation2); 115 116 // New color animation for _shadowFragment 117 var colorAnimation2 = new ColorAnimation 118 { 119 Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200)), 120 To = Color.FromArgb(0, 0, 0, 0) 121 }; 122 123 Storyboard.SetTarget(colorAnimation2, _shadowFragment); 124 Storyboard.SetTargetProperty(colorAnimation2, ColorPath.Path); 125 _fadeOutStoryboard.Children.Add(colorAnimation2); 126 127 } 128 129 public void UnShadow() 130 { 131 var shadow = new Storyboard(); 132 133 var doubleAnimation = new DoubleAnimation 134 { 135 Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200)), 136 To = -_slideFragment.Width 137 }; 138 139 Storyboard.SetTarget(doubleAnimation, _slideFragment); 140 Storyboard.SetTargetProperty(doubleAnimation, TranslatePath.Path); 141 shadow.Children.Add(doubleAnimation); 142 143 var colorAnimation = new ColorAnimation 144 { 145 Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200)), 146 To = Color.FromArgb(0, 0, 0, 0) 147 }; 148 149 Storyboard.SetTarget(colorAnimation, _shadowFragment); 150 Storyboard.SetTargetProperty(colorAnimation, ColorPath.Path); 151 shadow.Children.Add(colorAnimation); 152 153 shadow.Completed += shadow_Completed; 154 shadow.Begin(); 155 } 156 private void shadowFragment_Tapped(object sender, TappedRoutedEventArgs e) 157 { 158 var shadow = new Storyboard(); 159 160 var doubleAnimation = new DoubleAnimation 161 { 162 Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200)), 163 To = -_slideFragment.Width 164 }; 165 166 Storyboard.SetTarget(doubleAnimation, _slideFragment); 167 Storyboard.SetTargetProperty(doubleAnimation, TranslatePath.Path); 168 shadow.Children.Add(doubleAnimation); 169 170 var colorAnimation = new ColorAnimation 171 { 172 Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200)), 173 To = Color.FromArgb(0, 0, 0, 0) 174 }; 175 176 Storyboard.SetTarget(colorAnimation, _shadowFragment); 177 Storyboard.SetTargetProperty(colorAnimation, ColorPath.Path); 178 shadow.Children.Add(colorAnimation); 179 180 shadow.Completed += shadow_Completed; 181 shadow.Begin(); 182 } 183 private void shadow_Completed(object sender, object e) 184 { 185 _shadowFragment.IsHitTestVisible = false; 186 _shadowFragment.Visibility = Visibility.Collapsed; 187 Shadowed = false; 188 189 // raise close event 190 if (DrawerClosed != null) DrawerClosed(this); 191 } 192 private void fadeOutStoryboard_Completed(object sender, object e) 193 { 194 _shadowFragment.Visibility = Visibility.Collapsed; 195 Shadowed = false; 196 if (DrawerClosed != null) DrawerClosed(this); 197 } 198 #region MoveShadow 199 private void MoveShadowFragment(double left) 200 { 201 // Show shadow fragment 202 _shadowFragment.Background = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255)); 203 _shadowFragment.Visibility = Visibility.Visible; 204 205 // Set bg color based on current _slideFragment position. 206 var maxLeft = _slideFragment.ActualWidth; 207 var currentLeft = maxLeft - left; 208 209 var temp = Convert.ToInt32((currentLeft / maxLeft) * MaxAlpha); 210 211 // Limit temp variable to 190 to avoid OverflowException 212 if (temp > MaxAlpha) temp = MaxAlpha; 213 214 byte alphaColorIndex; 215 try 216 { 217 alphaColorIndex = Convert.ToByte(MaxAlpha - temp); 218 } 219 catch 220 { 221 alphaColorIndex = 0; 222 } 223 224 _shadowFragment.Background = new SolidColorBrush(Color.FromArgb(alphaColorIndex, 0, 0, 0)); 225 } 226 #endregion 227 #endregion 228 } 229 }