file360

Log | Files | Refs

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 }