How do you do transition effects using the Frame control in WPF?

后端 未结 4 743
情深已故
情深已故 2020-12-01 01:52

I thought this would be easy but I guess not.

I have 2 pages that load in my frame control. I want to be able to either have a nice slide effect from one page to the

4条回答
  •  悲&欢浪女
    2020-12-01 02:12

    i searched for a mvvm friendly answer and i didn't find any so i made my own using an attached property:

    public class FrameAnimator : DependencyObject
    {
        public static readonly DependencyProperty FrameNextNavigationStotryboardProperty = DependencyProperty.RegisterAttached("FrameNextNavigationStotryboard", typeof(Storyboard), typeof(FrameAnimator), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure, FrameNextNavigationStotryboardProprtyChanged));
        private static void FrameNextNavigationStotryboardProprtyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is Frame)
            {
    
                   Storyboard st = GetFrameNextNavigationStotryboard(d);
                if (st != null)
                {
                    (d as Frame).Navigating += (sm, ar) =>
                    {
                        if (ar.NavigationMode != System.Windows.Navigation.NavigationMode.Back)
                        {
                            st.Begin((d as Frame));
                        }
                    };
                }
            }
        }
        public static void SetFrameNextNavigationStotryboard(DependencyObject control, Storyboard st)
        {
            control.SetValue(FrameNextNavigationStotryboardProperty, st);
        }
        public static Storyboard GetFrameNextNavigationStotryboard(DependencyObject control)
        {
            var val = control.GetValue(FrameNextNavigationStotryboardProperty);
            if (val is Storyboard)
                return (Storyboard)val;
            return null;
        }
    
        /// 
        /// /////////////////////////////////////////////////////////////////////
        /// 
    
        public static readonly DependencyProperty FrameBackNavigationStotryboardProperty = DependencyProperty.RegisterAttached("FrameBackNavigationStotryboard", typeof(Storyboard), typeof(FrameAnimator), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure, FrameBackNavigationStotryboardProprtyChanged));
        private static void FrameBackNavigationStotryboardProprtyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is Frame)
            {
                Storyboard st = GetFrameBackNavigationStotryboard(d);
                if (st != null)
                {
                    (d as Frame).Navigating += (sm, ar) =>
                    {
                        if (ar.NavigationMode == System.Windows.Navigation.NavigationMode.Back)
                        {
                            st.Begin((d as Frame));
                        }
                    };
                }
            }
        }
        public static void SetFrameBackNavigationStotryboard(DependencyObject control, Storyboard st)
        {
            control.SetValue(FrameBackNavigationStotryboardProperty, st);
        }
        public static Storyboard GetFrameBackNavigationStotryboard(DependencyObject control)
        {
            var val = control.GetValue(FrameBackNavigationStotryboardProperty);
            if (val is Storyboard)
                return (Storyboard)val;
            return null;
        }
    }
    

    Usage :

     
    
            
                    
                        1000
                    
                    
                        -1000
                    
                    
                        
                        
                    
                    
                        
                        
                    
                 
    
    
    
        
                  
                      
                  
               
         
    

    Am fairly new to mvvm so if there is any thing that can improve this answer please post it below

提交回复
热议问题