From 1a32fef55c77a527b93ed349227e1e5896a62537 Mon Sep 17 00:00:00 2001
From: ltx <1006158920@qq.com>
Date: Sat, 11 Oct 2025 14:40:01 +0800
Subject: [PATCH] =?UTF-8?q?update=EF=BC=9A=E6=B7=BB=E5=8A=A0=E4=BA=8C?=
=?UTF-8?q?=E7=BA=A7=E5=AF=BC=E8=88=AA=E9=A1=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../MyUserControl/CoverFlowControl.xaml.cs | 14 +-
Wpf_AiSportsMicrospace/Views/Home.xaml | 29 ++--
Wpf_AiSportsMicrospace/Views/Home.xaml.cs | 62 +++++---
Wpf_AiSportsMicrospace/Views/Main.xaml.cs | 135 ++++++++++++++++--
.../Wpf_AiSportsMicrospace.csproj | 40 ++++++
5 files changed, 224 insertions(+), 56 deletions(-)
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