diff --git a/Wpf_AiSportsMicrospace/MyUserControl/CoverFlowControl.xaml.cs b/Wpf_AiSportsMicrospace/MyUserControl/CoverFlowControl.xaml.cs index e79269c..14c5fe5 100644 --- a/Wpf_AiSportsMicrospace/MyUserControl/CoverFlowControl.xaml.cs +++ b/Wpf_AiSportsMicrospace/MyUserControl/CoverFlowControl.xaml.cs @@ -192,9 +192,9 @@ namespace Wpf_AiSportsMicrospace.MyUserControl private void UpdateLayoutWithAnimation(bool instant = false) { double centerX = ActualWidth / 2; - double spacing = 550; - double sideScale = 0.93; - double centerScale = 1.43; + double spacing = 530; + double sideScale = 0.98; + double centerScale = 1.33; for (int i = 0; i < ItemsHost.Items.Count; i++) { @@ -214,25 +214,25 @@ namespace Wpf_AiSportsMicrospace.MyUserControl if (i == SelectedIndex) { - targetX = centerX - 75; + targetX = centerX - 175; targetScale = centerScale; targetOpacity = 1.0; } else if (i == SelectedIndex - 1 || (SelectedIndex == 0 && i == Images.Count - 1)) { - targetX = centerX - spacing - 75; + targetX = centerX - spacing -175; targetScale = sideScale; targetOpacity = 1.0; } else if (i == SelectedIndex + 1 || (SelectedIndex == Images.Count - 1 && i == 0)) { - targetX = centerX + spacing - 75; + targetX = centerX + spacing - 175; targetScale = sideScale; targetOpacity = 1.0; } else { - targetX = centerX - 75; + targetX = centerX - 175; targetScale = sideScale; targetOpacity = 0.0; } diff --git a/Wpf_AiSportsMicrospace/Views/Home.xaml b/Wpf_AiSportsMicrospace/Views/Home.xaml index 5a188f5..ec96960 100644 --- a/Wpf_AiSportsMicrospace/Views/Home.xaml +++ b/Wpf_AiSportsMicrospace/Views/Home.xaml @@ -15,22 +15,23 @@ HorizontalAlignment="Center" VerticalAlignment="Top" Width="615" - Margin="0,100,0,0" + Margin="0,50,0,0" /> - + x:Name="coverFlow" + HorizontalAlignment="Center" + VerticalAlignment="Top" + Height="900" + Width="1920" + Margin="0,180,0,0" + Padding="0,100" + /> + - + diff --git a/Wpf_AiSportsMicrospace/Views/Home.xaml.cs b/Wpf_AiSportsMicrospace/Views/Home.xaml.cs index a451699..08869a6 100644 --- a/Wpf_AiSportsMicrospace/Views/Home.xaml.cs +++ b/Wpf_AiSportsMicrospace/Views/Home.xaml.cs @@ -11,8 +11,10 @@ using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; +using Wpf_AiSportsMicrospace; using Wpf_AiSportsMicrospace.Common; using Wpf_AiSportsMicrospace.Enum; using Wpf_AiSportsMicrospace.MyUserControl; @@ -38,7 +40,6 @@ namespace Wpf_AiSportsMicrospace private SportOperate _sportOperate; public static Uri loadingImage = new Uri("/Resources/Img/Album/1.gif", UriKind.Relative); - public Home() { InitializeComponent(); @@ -70,19 +71,19 @@ namespace Wpf_AiSportsMicrospace private void Window_Loaded(object sender, RoutedEventArgs e) { - //_sportOperate = new SportOperate(); - //_webcamClient = _sportOperate.CreateRTSP(); + _sportOperate = new SportOperate(); + _webcamClient = _sportOperate.CreateRTSP(); - //_webcamClient.OnExtractFrame += frame => - //{ - // if (frame != null) - // _frameQueue.Enqueue(frame); - //}; - //_webcamClient.StartExtract(); + _webcamClient.OnExtractFrame += frame => + { + if (frame != null) + _frameQueue.Enqueue(frame); + }; + _webcamClient.StartExtract(); StartFrameProcessing(); - Utils.PlayBackgroundMusic("homeprojectselected.mp3"); + //Utils.PlayBackgroundMusic("homeprojectselected.mp3"); //coverFlow.ProgressCompleted += CoverFlow_ProgressCompleted; } @@ -105,7 +106,7 @@ namespace Wpf_AiSportsMicrospace //coverFlow.ProgressCompleted -= CoverFlow_ProgressCompleted; // 根据图片跳转新窗口 - string uri = item.ImageUri.ToString(); + //string uri = item.ImageUri.ToString(); //if (uri.EndsWith("1.jpg")) // newWindow = new GroupJumpRope(); @@ -115,12 +116,13 @@ namespace Wpf_AiSportsMicrospace // newWindow = new GroupJumpRope(); // 找到主窗口,切换内容到 GroupJumpRopePage - var mainWin = Application.Current.MainWindow as Main; - if (mainWin != null) - { - Utils.PlayBackgroundMusic("musicjumprope1.mp3"); - mainWin.SwitchPage(new GroupJumpRope(), true); - } + //var mainWin = Application.Current.MainWindow as Main; + //if (mainWin != null) + //{ + // Utils.PlayBackgroundMusic("musicjumprope1.mp3"); + // mainWin.SwitchPage(new GroupJumpRope(), true); + //} + RouterGoNew(); } private void StartFrameProcessing() @@ -215,5 +217,31 @@ namespace Wpf_AiSportsMicrospace { throw new NotImplementedException(); } + + //测试点击 + private void GoNew(object sender, MouseButtonEventArgs e) + { + // 跳转逻辑(如导航到新页面并传递参数) + // 例如:RaiseEvent、调用外部委托、或使用导航框架 + var mainWin = Application.Current.MainWindow as Main; + var newPage = new CenterHome + { + NowSelect = coverFlow.SelectedIndex == 0 ? "test" : "play" + }; + mainWin?.SwitchPage(newPage, true); + } + + //跳转二级页面 + private void RouterGoNew() + { + // 跳转逻辑(如导航到新页面并传递参数) + // 例如:RaiseEvent、调用外部委托、或使用导航框架 + var mainWin = Application.Current.MainWindow as Main; + var newPage = new CenterHome + { + NowSelect = coverFlow.SelectedIndex == 0 ? "test" : "play" + }; + mainWin?.SwitchPage(newPage, true); + } } } diff --git a/Wpf_AiSportsMicrospace/Views/Main.xaml.cs b/Wpf_AiSportsMicrospace/Views/Main.xaml.cs index 0ead876..4d85ae6 100644 --- a/Wpf_AiSportsMicrospace/Views/Main.xaml.cs +++ b/Wpf_AiSportsMicrospace/Views/Main.xaml.cs @@ -27,15 +27,79 @@ namespace Wpf_AiSportsMicrospace.Views // 默认显示首页 MainContent.Content = new Home(); } + //public void SwitchPage(UserControl newPage, bool fromRight) + //{ + // if (MainContent.Content == newPage) return; + + // var oldPage = MainContent.Content as UserControl; + + // if (oldPage != null) + // { + // // 旧页面动画 + // var oldTransformGroup = new TransformGroup(); + // var oldScale = new ScaleTransform(1, 1); + // var oldSkew = new SkewTransform(0, 0); + // var oldTranslate = new TranslateTransform(0, 0); + // oldTransformGroup.Children.Add(oldScale); + // oldTransformGroup.Children.Add(oldSkew); + // oldTransformGroup.Children.Add(oldTranslate); + // oldPage.RenderTransformOrigin = new Point(fromRight ? 1 : 0, 0.5); // 左右翻页中心 + // oldPage.RenderTransform = oldTransformGroup; + + // var scaleAnim = new DoubleAnimation(1, 0.7, TimeSpan.FromMilliseconds(600)) { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } }; + // var skewAnim = new DoubleAnimation(0, fromRight ? 45 : -45, TimeSpan.FromMilliseconds(600)) { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } }; + // var fadeAnim = new DoubleAnimation(1, 0.2, TimeSpan.FromMilliseconds(600)); + // var translateAnim = new DoubleAnimation(0, fromRight ? -ActualWidth : ActualWidth, TimeSpan.FromMilliseconds(600)) { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } }; + + // oldScale.BeginAnimation(ScaleTransform.ScaleXProperty, scaleAnim); + // oldScale.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnim); + // oldSkew.BeginAnimation(SkewTransform.AngleYProperty, skewAnim); + // oldTranslate.BeginAnimation(TranslateTransform.XProperty, translateAnim); + // oldPage.BeginAnimation(OpacityProperty, fadeAnim); + + // fadeAnim.Completed += (s, e) => + // { + // MainContent.Content = newPage; + // AnimateNewPageEnhanced(newPage, fromRight); + // }; + // } + // else + // { + // MainContent.Content = newPage; + // AnimateNewPageEnhanced(newPage, fromRight); + // } + //} + public void SwitchPage(UserControl newPage, bool fromRight) { if (MainContent.Content == newPage) return; var oldPage = MainContent.Content as UserControl; + // 预加载新页面资源 + PreloadPageResources(newPage); + if (oldPage != null) { - // 旧页面动画 + MainContent.Content = null; + // 创建容器同时显示新旧页面 + var container = new Grid(); + container.Children.Add(newPage); // 新页面在底层 + container.Children.Add(oldPage); // 旧页面在顶层 + + MainContent.Content = container; + + // 设置新页面初始状态 - 轻微缩放和偏移 + var newTransformGroup = new TransformGroup(); + var newScale = new ScaleTransform(0.95, 0.95); + var newTranslate = new TranslateTransform(fromRight ? 80 : -80, 0); + newTransformGroup.Children.Add(newScale); + newTransformGroup.Children.Add(newTranslate); + newPage.RenderTransformOrigin = new Point(0.5, 0.5); + newPage.RenderTransform = newTransformGroup; + newPage.Opacity = 1; + + // 旧页面动画 - 飞出效果 var oldTransformGroup = new TransformGroup(); var oldScale = new ScaleTransform(1, 1); var oldSkew = new SkewTransform(0, 0); @@ -43,33 +107,74 @@ namespace Wpf_AiSportsMicrospace.Views oldTransformGroup.Children.Add(oldScale); oldTransformGroup.Children.Add(oldSkew); oldTransformGroup.Children.Add(oldTranslate); - oldPage.RenderTransformOrigin = new Point(fromRight ? 1 : 0, 0.5); // 左右翻页中心 + oldPage.RenderTransformOrigin = new Point(fromRight ? 1 : 0, 0.5); oldPage.RenderTransform = oldTransformGroup; + oldPage.Opacity = 1; - var scaleAnim = new DoubleAnimation(1, 0.7, TimeSpan.FromMilliseconds(600)) { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } }; - var skewAnim = new DoubleAnimation(0, fromRight ? 45 : -45, TimeSpan.FromMilliseconds(600)) { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } }; - var fadeAnim = new DoubleAnimation(1, 0.2, TimeSpan.FromMilliseconds(600)); - var translateAnim = new DoubleAnimation(0, fromRight ? -ActualWidth : ActualWidth, TimeSpan.FromMilliseconds(600)) { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } }; + // 动画参数 + var duration = TimeSpan.FromMilliseconds(1200); + var easing = new CubicEase { EasingMode = EasingMode.EaseInOut }; - oldScale.BeginAnimation(ScaleTransform.ScaleXProperty, scaleAnim); - oldScale.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnim); - oldSkew.BeginAnimation(SkewTransform.AngleYProperty, skewAnim); - oldTranslate.BeginAnimation(TranslateTransform.XProperty, translateAnim); - oldPage.BeginAnimation(OpacityProperty, fadeAnim); - - fadeAnim.Completed += (s, e) => + // 旧页面飞出动画 + var oldScaleAnim = new DoubleAnimation(1, 1.1, duration) { EasingFunction = easing }; + var oldSkewAnim = new DoubleAnimation(0, fromRight ? 15 : -15, duration) { EasingFunction = easing }; + var oldTranslateAnim = new DoubleAnimation(0, fromRight ? ActualWidth * 1.1 : -ActualWidth * 1.1, duration) { + EasingFunction = easing + }; + + // 新页面进入动画 + var newScaleAnim = new DoubleAnimation(0.8, 1, duration) { EasingFunction = easing }; + var newTranslateAnim = new DoubleAnimation(fromRight ? -80 : -80, 0, duration) { EasingFunction = easing }; + + // 开始动画 + oldScale.BeginAnimation(ScaleTransform.ScaleXProperty, oldScaleAnim); + oldScale.BeginAnimation(ScaleTransform.ScaleYProperty, oldScaleAnim); + oldSkew.BeginAnimation(SkewTransform.AngleYProperty, oldSkewAnim); + oldTranslate.BeginAnimation(TranslateTransform.XProperty, oldTranslateAnim); + + newScale.BeginAnimation(ScaleTransform.ScaleXProperty, newScaleAnim); + newScale.BeginAnimation(ScaleTransform.ScaleYProperty, newScaleAnim); + newTranslate.BeginAnimation(TranslateTransform.XProperty, newTranslateAnim); + + // 动画完成后清理 + oldTranslateAnim.Completed += (s, e) => + { + // 确保最终状态 + newPage.RenderTransform = null; + newPage.Opacity = 1; + + // 切换到只有新页面 MainContent.Content = newPage; - AnimateNewPageEnhanced(newPage, fromRight); + + // 清理资源 + if (oldPage is IDisposable disposable) + disposable.Dispose(); + + container.Children.Clear(); }; } else { MainContent.Content = newPage; - AnimateNewPageEnhanced(newPage, fromRight); + newPage.Opacity = 1; } } + private void PreloadPageResources(UserControl page) + { + // 先从原来的父容器中移除页面(如果存在) + if (page.Parent != null) + { + var parent = page.Parent as Panel; + parent?.Children.Remove(page); + } + + // 强制WPF加载所有资源 + page.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + page.Arrange(new Rect(0, 0, page.DesiredSize.Width, page.DesiredSize.Height)); + } + private void AnimateNewPageEnhanced(UserControl newPage, bool fromRight) { var transformGroup = new TransformGroup(); diff --git a/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.csproj b/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.csproj index 7947066..aa963af 100644 --- a/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.csproj +++ b/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.csproj @@ -38,6 +38,16 @@ + + + + + + + + + + @@ -170,6 +180,36 @@ Always + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + Always