diff --git a/Demo.Common/Converters/BoolToVisibilityConverter.cs b/Demo.Common/Converters/BoolToVisibilityConverter.cs
new file mode 100644
index 0000000..40d1a4d
--- /dev/null
+++ b/Demo.Common/Converters/BoolToVisibilityConverter.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows;
+
+namespace Demo.Common.Converters
+{
+ public class BoolToVisibilityConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value == null)
+ {
+ return Visibility.Visible;
+ }
+ else
+ {
+ if ((bool)value)
+ {
+ return Visibility.Visible;
+ }
+ else
+ {
+ return Visibility.Collapsed;
+ }
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Demo.Common/Demo.Common.csproj b/Demo.Common/Demo.Common.csproj
new file mode 100644
index 0000000..89541cf
--- /dev/null
+++ b/Demo.Common/Demo.Common.csproj
@@ -0,0 +1,10 @@
+
+
+
+ net6.0-windows
+ enable
+ true
+ enable
+
+
+
diff --git a/Demo.Common/Models/UserInfo.cs b/Demo.Common/Models/UserInfo.cs
new file mode 100644
index 0000000..1706a69
--- /dev/null
+++ b/Demo.Common/Models/UserInfo.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Demo.Common.Models
+{
+ public class UserInfo
+ {
+ public long Id { get; set; }
+ public string UserName { get; set; }
+ public bool IsManager { get; set; }
+ }
+}
diff --git a/Demo.Common/RegionNames.cs b/Demo.Common/RegionNames.cs
new file mode 100644
index 0000000..a3a2641
--- /dev/null
+++ b/Demo.Common/RegionNames.cs
@@ -0,0 +1,7 @@
+namespace Demo.Common
+{
+ public static class RegionNames
+ {
+ public const string VideoRegion = "VideoRegion";
+ }
+}
diff --git a/Meeting.V2.Demo.sln b/Meeting.V2.Demo.sln
new file mode 100644
index 0000000..3bada02
--- /dev/null
+++ b/Meeting.V2.Demo.sln
@@ -0,0 +1,46 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.12.35506.116
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{13DA16E8-EB84-4F95-B120-F4CC4B0162E4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meeting.V2.Demo.Services", "Meeting.V2.Demo\Services\Meeting.V2.Demo.Services\Meeting.V2.Demo.Services.csproj", "{A4A5CAFF-287C-4833-98B6-D074132ED8BF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meeting.V2.Demo.Services.Interfaces", "Meeting.V2.Demo\Services\Meeting.V2.Demo.Services.Interfaces\Meeting.V2.Demo.Services.Interfaces.csproj", "{A4FC67BC-E1AE-48A3-A312-3BBB3FB1BAEB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meeting.V2.Demo", "Meeting.V2.Demo\Meeting.V2.Demo\Meeting.V2.Demo.csproj", "{ED1004D9-097A-4AB6-BA74-BD5CB40D9984}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Demo.Common", "Demo.Common\Demo.Common.csproj", "{B8ACCBD2-1C4D-4CF5-BBBD-C0A62DB64C31}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A4A5CAFF-287C-4833-98B6-D074132ED8BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A4A5CAFF-287C-4833-98B6-D074132ED8BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A4A5CAFF-287C-4833-98B6-D074132ED8BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A4A5CAFF-287C-4833-98B6-D074132ED8BF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A4FC67BC-E1AE-48A3-A312-3BBB3FB1BAEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A4FC67BC-E1AE-48A3-A312-3BBB3FB1BAEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A4FC67BC-E1AE-48A3-A312-3BBB3FB1BAEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A4FC67BC-E1AE-48A3-A312-3BBB3FB1BAEB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ED1004D9-097A-4AB6-BA74-BD5CB40D9984}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ED1004D9-097A-4AB6-BA74-BD5CB40D9984}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ED1004D9-097A-4AB6-BA74-BD5CB40D9984}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ED1004D9-097A-4AB6-BA74-BD5CB40D9984}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B8ACCBD2-1C4D-4CF5-BBBD-C0A62DB64C31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B8ACCBD2-1C4D-4CF5-BBBD-C0A62DB64C31}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B8ACCBD2-1C4D-4CF5-BBBD-C0A62DB64C31}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B8ACCBD2-1C4D-4CF5-BBBD-C0A62DB64C31}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {A4A5CAFF-287C-4833-98B6-D074132ED8BF} = {13DA16E8-EB84-4F95-B120-F4CC4B0162E4}
+ {A4FC67BC-E1AE-48A3-A312-3BBB3FB1BAEB} = {13DA16E8-EB84-4F95-B120-F4CC4B0162E4}
+ EndGlobalSection
+EndGlobal
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo.Core/Meeting.V2.Demo.Core.csproj b/Meeting.V2.Demo/Meeting.V2.Demo.Core/Meeting.V2.Demo.Core.csproj
new file mode 100644
index 0000000..adab35e
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo.Core/Meeting.V2.Demo.Core.csproj
@@ -0,0 +1,9 @@
+
+
+ net6.0-windows
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/App.xaml b/Meeting.V2.Demo/Meeting.V2.Demo/App.xaml
new file mode 100644
index 0000000..366ccd7
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/App.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/App.xaml.cs b/Meeting.V2.Demo/Meeting.V2.Demo/App.xaml.cs
new file mode 100644
index 0000000..33a2bc2
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/App.xaml.cs
@@ -0,0 +1,46 @@
+using Meeting.V2.Demo.Services;
+using Meeting.V2.Demo.Services.Interfaces;
+using Meeting.V2.Demo.ViewModels;
+using Meeting.V2.Demo.Views;
+using Prism.Ioc;
+using Prism.Modularity;
+using System.Windows;
+
+namespace Meeting.V2.Demo
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App
+ {
+ protected override Window CreateShell()
+ {
+ return Container.Resolve();
+ }
+
+ protected override void RegisterTypes(IContainerRegistry containerRegistry)
+ {
+ containerRegistry.RegisterSingleton();
+
+ containerRegistry.RegisterForNavigation();
+ containerRegistry.RegisterForNavigation();
+ }
+
+ protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
+ {
+ // 注册模块
+ //moduleCatalog.AddModule();
+ }
+
+ protected override void OnInitialized()
+ {
+ base.OnInitialized();
+
+ var config = Container.Resolve();
+ if (config != null)
+ {
+ config.Init();
+ }
+ }
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Assets/manager.svg b/Meeting.V2.Demo/Meeting.V2.Demo/Assets/manager.svg
new file mode 100644
index 0000000..d791b40
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Assets/manager.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Assets/more.svg b/Meeting.V2.Demo/Meeting.V2.Demo/Assets/more.svg
new file mode 100644
index 0000000..873bd91
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Assets/more.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Configure/ConfigureService.cs b/Meeting.V2.Demo/Meeting.V2.Demo/Configure/ConfigureService.cs
new file mode 100644
index 0000000..a8a7ace
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Configure/ConfigureService.cs
@@ -0,0 +1,23 @@
+using Demo.Common;
+using Meeting.V2.Demo.Views;
+using Prism.Regions;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Meeting.V2.Demo.Services.Interfaces
+{
+ public class ConfigureService : IConfigureService
+ {
+ private readonly IRegionManager _regionManager;
+
+ public ConfigureService(IRegionManager regionManager)
+ {
+ this._regionManager = regionManager;
+ }
+ public void Init()
+ {
+ _regionManager.RegisterViewWithRegion(RegionNames.VideoRegion);
+ }
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Configure/IConfigureService.cs b/Meeting.V2.Demo/Meeting.V2.Demo/Configure/IConfigureService.cs
new file mode 100644
index 0000000..c73691c
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Configure/IConfigureService.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Meeting.V2.Demo.Services.Interfaces
+{
+ public interface IConfigureService
+ {
+ void Init();
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Meeting.V2.Demo.csproj b/Meeting.V2.Demo/Meeting.V2.Demo/Meeting.V2.Demo.csproj
new file mode 100644
index 0000000..c0b61a3
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Meeting.V2.Demo.csproj
@@ -0,0 +1,29 @@
+
+
+ WinExe
+ net6.0-windows
+ true
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
\ No newline at end of file
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Mvvm/RegionViewModelBase.cs b/Meeting.V2.Demo/Meeting.V2.Demo/Mvvm/RegionViewModelBase.cs
new file mode 100644
index 0000000..9cdfe90
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Mvvm/RegionViewModelBase.cs
@@ -0,0 +1,35 @@
+using System;
+using Prism.Regions;
+
+namespace Meeting.V2.Demo.Core.Mvvm
+{
+ public class RegionViewModelBase : ViewModelBase, INavigationAware, IConfirmNavigationRequest
+ {
+ protected IRegionManager RegionManager { get; private set; }
+
+ public RegionViewModelBase(IRegionManager regionManager)
+ {
+ RegionManager = regionManager;
+ }
+
+ public virtual void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback)
+ {
+ continuationCallback(true);
+ }
+
+ public virtual bool IsNavigationTarget(NavigationContext navigationContext)
+ {
+ return true;
+ }
+
+ public virtual void OnNavigatedFrom(NavigationContext navigationContext)
+ {
+
+ }
+
+ public virtual void OnNavigatedTo(NavigationContext navigationContext)
+ {
+
+ }
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Mvvm/ViewModelBase.cs b/Meeting.V2.Demo/Meeting.V2.Demo/Mvvm/ViewModelBase.cs
new file mode 100644
index 0000000..fc8e24d
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Mvvm/ViewModelBase.cs
@@ -0,0 +1,18 @@
+using Prism.Mvvm;
+using Prism.Navigation;
+
+namespace Meeting.V2.Demo.Core.Mvvm
+{
+ public abstract class ViewModelBase : BindableBase, IDestructible
+ {
+ protected ViewModelBase()
+ {
+
+ }
+
+ public virtual void Destroy()
+ {
+
+ }
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/MainWindowViewModel.cs b/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/MainWindowViewModel.cs
new file mode 100644
index 0000000..8159fdc
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/MainWindowViewModel.cs
@@ -0,0 +1,19 @@
+using Prism.Mvvm;
+
+namespace Meeting.V2.Demo.ViewModels
+{
+ public class MainWindowViewModel : BindableBase
+ {
+ private string _title = "Prism Application";
+ public string Title
+ {
+ get { return _title; }
+ set { SetProperty(ref _title, value); }
+ }
+
+ public MainWindowViewModel()
+ {
+
+ }
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/VideoAreaViewModel.cs b/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/VideoAreaViewModel.cs
new file mode 100644
index 0000000..2b2e01b
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/VideoAreaViewModel.cs
@@ -0,0 +1,77 @@
+using Demo.Common.Models;
+using Meeting.V2.Demo.Core.Mvvm;
+using Prism.Commands;
+using Prism.Regions;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Meeting.V2.Demo.ViewModels
+{
+ public class VideoAreaViewModel : RegionViewModelBase
+ {
+ public VideoAreaViewModel(IRegionManager regionManager) : base(regionManager)
+ {
+ UserInfos.Add(new UserInfo() { Id = 1, UserName = "张三", IsManager = true });
+ UserInfos.Add(new UserInfo() { Id = 2, UserName = "李四", IsManager = false });
+
+ UinfoProp = new UserInfo
+ {
+ Id = 111,
+ UserName = "王五",
+ IsManager = false
+ };
+ }
+
+ private ObservableCollection userInfos = new();
+
+ ///
+ /// 用户列表
+ ///
+ public ObservableCollection UserInfos
+ {
+ get { return userInfos; }
+ set { SetProperty(ref userInfos, value); }
+ }
+
+ private string fieldName = "卧槽";
+ public string PropertyNameAA
+ {
+ get { return fieldName; }
+ set { SetProperty(ref fieldName, value); }
+ }
+
+ private UserInfo Uinfo;
+ public UserInfo UinfoProp
+ {
+ get { return Uinfo; }
+ set { SetProperty(ref Uinfo, value); }
+ }
+
+
+ public override void OnNavigatedTo(NavigationContext navigationContext)
+ {
+ //base.OnNavigatedTo(navigationContext);
+
+ Init();
+ }
+
+ private void Init()
+ {
+ UserInfos.Add(new UserInfo() { Id = 3, UserName = "王五", IsManager = true });
+ UserInfos.Add(new UserInfo() { Id = 4, UserName = "李2", IsManager = false });
+ }
+
+
+ public DelegateCommand TestCommand => new DelegateCommand(ExecuteCommandName);
+
+ void ExecuteCommandName()
+ {
+ MessageBox.Show($@"{UserInfos.Count} Id:{string.Join(',', UserInfos.Select(x => x.Id))}");
+ }
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/VideoViewModel.cs b/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/VideoViewModel.cs
new file mode 100644
index 0000000..d672c8c
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/VideoViewModel.cs
@@ -0,0 +1,39 @@
+using Demo.Common.Models;
+using Meeting.V2.Demo.Core.Mvvm;
+using Prism.Commands;
+using Prism.Regions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Meeting.V2.Demo.ViewModels
+{
+ public class VideoViewModel : RegionViewModelBase
+ {
+ public VideoViewModel(IRegionManager regionManager) : base(regionManager)
+ {
+ }
+
+ private UserInfo userInfo;
+ ///
+ /// 用户信息
+ ///
+ public UserInfo UserInfo
+ {
+ get { return userInfo; }
+ set { SetProperty(ref userInfo, value); }
+ }
+
+ public DelegateCommand OperClickCommand => new DelegateCommand(() =>
+ {
+ MessageBox.Show($@"id:{userInfo.Id} userName:{userInfo.UserName} isManager:{userInfo.IsManager}");
+ });
+
+
+
+
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Views/MainWindow.xaml b/Meeting.V2.Demo/Meeting.V2.Demo/Views/MainWindow.xaml
new file mode 100644
index 0000000..2e68170
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Views/MainWindow.xaml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Views/MainWindow.xaml.cs b/Meeting.V2.Demo/Meeting.V2.Demo/Views/MainWindow.xaml.cs
new file mode 100644
index 0000000..8585407
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Views/MainWindow.xaml.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Drawing;
+using System.Windows;
+using System.Xml.Linq;
+
+namespace Meeting.V2.Demo.Views
+{
+ ///
+ /// Interaction logic for MainWindow.xaml
+ ///
+ public partial class MainWindow : HandyControl.Controls.Window
+ {
+ public MainWindow()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoAreaView.xaml b/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoAreaView.xaml
new file mode 100644
index 0000000..9972295
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoAreaView.xaml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoAreaView.xaml.cs b/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoAreaView.xaml.cs
new file mode 100644
index 0000000..68d63d4
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoAreaView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Meeting.V2.Demo.Views
+{
+ ///
+ /// VideoAreaView.xaml 的交互逻辑
+ ///
+ public partial class VideoAreaView : UserControl
+ {
+ public VideoAreaView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoView.xaml b/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoView.xaml
new file mode 100644
index 0000000..cd133a8
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoView.xaml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoView.xaml.cs b/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoView.xaml.cs
new file mode 100644
index 0000000..ed29995
--- /dev/null
+++ b/Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoView.xaml.cs
@@ -0,0 +1,143 @@
+using Demo.Common.Models;
+using Meeting.V2.Demo.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Meeting.V2.Demo.Views
+{
+ ///
+ /// VideoView.xaml 的交互逻辑
+ ///
+ public partial class VideoView : UserControl
+ {
+ public VideoView()
+ {
+ InitializeComponent();
+ pic_frame.ImageLocation = $@"E:\桌面\Wall\wallhaven-j3m8v5.jpg";
+ }
+
+
+
+
+ //public UserInfo UserInfo
+ //{
+ // get { return (UserInfo)GetValue(UserInfoProperty); }
+ // set { SetValue(UserInfoProperty, value); }
+ //}
+
+ //// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
+ //public static readonly DependencyProperty UserInfoProperty =
+ // DependencyProperty.Register("UserInfo", typeof(UserInfo), typeof(VideoView), new FrameworkPropertyMetadata(null));
+
+
+
+ public string UserName
+ {
+ get { return (string)GetValue(UserNameProperty); }
+ set {
+ SetValue(UserNameProperty, value); }
+ }
+ // Using a DependencyProperty as the backing store for UserName. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty UserNameProperty =
+ DependencyProperty.Register("UserName", typeof(string), typeof(VideoView), new PropertyMetadata("未知名称", new PropertyChangedCallback(OnUserNamePropertyChangedCallback)));
+
+ private static void OnUserNamePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is VideoView videoView)
+ {
+ videoView.txt_uname.Text = (string)e.NewValue;
+
+
+ }
+ }
+
+
+
+ //public bool IsManager
+ //{
+ // get { return (bool)GetValue(IsManagerProperty); }
+ // set { SetValue(IsManagerProperty, value); }
+ //}
+
+ //// Using a DependencyProperty as the backing store for IsManager. This enables animation, styling, binding, etc...
+ //public static readonly DependencyProperty IsManagerProperty =
+ // DependencyProperty.Register("IsManager", typeof(bool), typeof(VideoView), new PropertyMetadata(false, new(OnIsManagerPropertyChangedCallback)));
+
+ //private static void OnIsManagerPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ //{
+ // if (d is VideoView videoView)
+ // {
+ // if (e.NewValue is bool b)
+ // {
+ // var db = videoView.DataContext as VideoViewModel;
+ // db.UserInfo.IsManager = b;
+ // //if (b)
+ // //{
+ // // videoView.icon_manager.Visibility = Visibility.Visible;
+ // //}
+ // //else
+ // //{
+ // // videoView.icon_manager.Visibility = Visibility.Collapsed;
+ // //}
+ // }
+ // }
+ //}
+
+
+
+
+ #region 控制右上角操作按钮显示与消失
+ ///
+ /// 控制操作按钮显示
+ ///
+ private bool IsOperVisible = false;
+ private void pic_frame_MouseEnter(object sender, EventArgs e)
+ {
+ btn_oper.Visibility = Visibility.Visible;
+ }
+
+ private async void pic_frame_MouseLeave(object sender, EventArgs e)
+ {
+
+ // 使用ConfigureAwait(false)可以避免不必要的线程上下文切换
+ await Task.Delay(50).ConfigureAwait(false);
+
+ // 如果需要操作UI,使用Dispatcher
+ await Application.Current.Dispatcher.InvokeAsync(() =>
+ {
+ // UI相关操作
+ if (!IsOperVisible)
+ {
+ btn_oper.Visibility = Visibility.Hidden;
+ }
+ });
+
+ }
+
+ private void btn_oper_MouseEnter(object sender, MouseEventArgs e)
+ {
+ IsOperVisible = true;
+ }
+
+ private async void btn_oper_MouseLeave(object sender, MouseEventArgs e)
+ {
+ await Task.Delay(50).ConfigureAwait(false);
+
+ IsOperVisible = false;
+ }
+ #endregion
+ }
+}
diff --git a/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services.Interfaces/IMessageService.cs b/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services.Interfaces/IMessageService.cs
new file mode 100644
index 0000000..54e0baf
--- /dev/null
+++ b/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services.Interfaces/IMessageService.cs
@@ -0,0 +1,7 @@
+namespace Meeting.V2.Demo.Services.Interfaces
+{
+ public interface IMessageService
+ {
+ string GetMessage();
+ }
+}
diff --git a/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services.Interfaces/Meeting.V2.Demo.Services.Interfaces.csproj b/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services.Interfaces/Meeting.V2.Demo.Services.Interfaces.csproj
new file mode 100644
index 0000000..f45bdfc
--- /dev/null
+++ b/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services.Interfaces/Meeting.V2.Demo.Services.Interfaces.csproj
@@ -0,0 +1,7 @@
+
+
+
+ netstandard2.1
+
+
+
diff --git a/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services/Meeting.V2.Demo.Services.csproj b/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services/Meeting.V2.Demo.Services.csproj
new file mode 100644
index 0000000..57c3cf6
--- /dev/null
+++ b/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services/Meeting.V2.Demo.Services.csproj
@@ -0,0 +1,11 @@
+
+
+
+ netstandard2.1
+
+
+
+
+
+
+
diff --git a/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services/MessageService.cs b/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services/MessageService.cs
new file mode 100644
index 0000000..5a2fb76
--- /dev/null
+++ b/Meeting.V2.Demo/Services/Meeting.V2.Demo.Services/MessageService.cs
@@ -0,0 +1,12 @@
+using Meeting.V2.Demo.Services.Interfaces;
+
+namespace Meeting.V2.Demo.Services
+{
+ public class MessageService : IMessageService
+ {
+ public string GetMessage()
+ {
+ return "Hello from the Message Service";
+ }
+ }
+}
diff --git a/WinFormsApp1/Form1.Designer.cs b/WinFormsApp1/Form1.Designer.cs
new file mode 100644
index 0000000..1ac166c
--- /dev/null
+++ b/WinFormsApp1/Form1.Designer.cs
@@ -0,0 +1,39 @@
+namespace WinFormsApp1
+{
+ partial class Form1
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(800, 450);
+ this.Text = "Form1";
+ }
+
+ #endregion
+ }
+}
diff --git a/WinFormsApp1/Form1.cs b/WinFormsApp1/Form1.cs
new file mode 100644
index 0000000..dabe0d0
--- /dev/null
+++ b/WinFormsApp1/Form1.cs
@@ -0,0 +1,10 @@
+namespace WinFormsApp1
+{
+ public partial class Form1 : Form
+ {
+ public Form1()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/WinFormsApp1/Form1.resx b/WinFormsApp1/Form1.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/WinFormsApp1/Form1.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/WinFormsApp1/Program.cs b/WinFormsApp1/Program.cs
new file mode 100644
index 0000000..1e39c2a
--- /dev/null
+++ b/WinFormsApp1/Program.cs
@@ -0,0 +1,17 @@
+namespace WinFormsApp1
+{
+ internal static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ // To customize application configuration such as set high DPI settings or default font,
+ // see https://aka.ms/applicationconfiguration.
+ ApplicationConfiguration.Initialize();
+ Application.Run(new Form1());
+ }
+ }
+}
\ No newline at end of file
diff --git a/WinFormsApp1/VideoView.Designer.cs b/WinFormsApp1/VideoView.Designer.cs
new file mode 100644
index 0000000..094aef8
--- /dev/null
+++ b/WinFormsApp1/VideoView.Designer.cs
@@ -0,0 +1,136 @@
+namespace Meeting.VideoView.Controls
+{
+ partial class VideoView
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region 组件设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要修改
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(VideoView));
+ pic_frame = new PictureBox();
+ btn_oper = new AntdUI.Button();
+ stackPanel1 = new AntdUI.StackPanel();
+ lab_Name = new AntdUI.Label();
+ ava_manager = new AntdUI.Avatar();
+ ((System.ComponentModel.ISupportInitialize)pic_frame).BeginInit();
+ stackPanel1.SuspendLayout();
+ SuspendLayout();
+ //
+ // pic_frame
+ //
+ pic_frame.BackColor = Color.Black;
+ pic_frame.Dock = DockStyle.Fill;
+ pic_frame.Location = new Point(0, 0);
+ pic_frame.Name = "pic_frame";
+ pic_frame.Size = new Size(164, 90);
+ pic_frame.SizeMode = PictureBoxSizeMode.Zoom;
+ pic_frame.TabIndex = 0;
+ pic_frame.TabStop = false;
+ pic_frame.MouseEnter += pic_frame_MouseEnter;
+ pic_frame.MouseLeave += pic_frame_MouseLeave;
+ //
+ // btn_oper
+ //
+ btn_oper.Anchor = AnchorStyles.Top | AnchorStyles.Right;
+ btn_oper.Ghost = true;
+ btn_oper.IconGap = 0F;
+ btn_oper.IconHoverSvg = resources.GetString("btn_oper.IconHoverSvg");
+ btn_oper.IconRatio = 1.2F;
+ btn_oper.IconSvg = resources.GetString("btn_oper.IconSvg");
+ btn_oper.Location = new Point(132, 8);
+ btn_oper.Name = "btn_oper";
+ btn_oper.Radius = 0;
+ btn_oper.Shape = AntdUI.TShape.Circle;
+ btn_oper.Size = new Size(22, 22);
+ btn_oper.TabIndex = 1;
+ btn_oper.Visible = false;
+ btn_oper.MouseClick += btn_oper_MouseClick;
+ btn_oper.MouseEnter += btn_oper_MouseEnter;
+ btn_oper.MouseLeave += btn_oper_MouseLeave;
+ //
+ // stackPanel1
+ //
+ stackPanel1.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
+ stackPanel1.BackColor = Color.Transparent;
+ stackPanel1.Controls.Add(lab_Name);
+ stackPanel1.Controls.Add(ava_manager);
+ stackPanel1.Location = new Point(0, 72);
+ stackPanel1.Margin = new Padding(1);
+ stackPanel1.Name = "stackPanel1";
+ stackPanel1.Size = new Size(87, 18);
+ stackPanel1.TabIndex = 2;
+ stackPanel1.Text = "stackPanel1";
+ //
+ // lab_Name
+ //
+ lab_Name.AutoSizeMode = AntdUI.TAutoSize.Width;
+ lab_Name.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 0);
+ lab_Name.ForeColor = Color.FloralWhite;
+ lab_Name.Location = new Point(22, 0);
+ lab_Name.Margin = new Padding(0);
+ lab_Name.Name = "lab_Name";
+ lab_Name.Padding = new Padding(0, 3, 0, 0);
+ lab_Name.Size = new Size(29, 18);
+ lab_Name.TabIndex = 1;
+ lab_Name.Text = "用户";
+ //
+ // ava_manager
+ //
+ ava_manager.ImageFit = AntdUI.TFit.None;
+ ava_manager.ImageSvg = resources.GetString("ava_manager.ImageSvg");
+ ava_manager.Location = new Point(0, 0);
+ ava_manager.Margin = new Padding(0);
+ ava_manager.Name = "ava_manager";
+ ava_manager.Size = new Size(22, 18);
+ ava_manager.TabIndex = 0;
+ ava_manager.Text = "";
+ //
+ // VideoView
+ //
+ AutoScaleDimensions = new SizeF(7F, 17F);
+ AutoScaleMode = AutoScaleMode.Font;
+ BackColor = Color.Black;
+ Controls.Add(btn_oper);
+ Controls.Add(stackPanel1);
+ Controls.Add(pic_frame);
+ DoubleBuffered = true;
+ ForeColor = SystemColors.ButtonHighlight;
+ Name = "VideoView";
+ Size = new Size(164, 90);
+ Load += VideoView_Load;
+ ((System.ComponentModel.ISupportInitialize)pic_frame).EndInit();
+ stackPanel1.ResumeLayout(false);
+ stackPanel1.PerformLayout();
+ ResumeLayout(false);
+ }
+
+ #endregion
+ private AntdUI.StackPanel stackPanel1;
+ private AntdUI.Avatar ava_manager;
+ public AntdUI.Button btn_oper;
+ public PictureBox pic_frame;
+ private AntdUI.Label lab_Name;
+ }
+}
diff --git a/WinFormsApp1/VideoView.cs b/WinFormsApp1/VideoView.cs
new file mode 100644
index 0000000..82880ee
--- /dev/null
+++ b/WinFormsApp1/VideoView.cs
@@ -0,0 +1,89 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Meeting.VideoView.Controls
+{
+ public partial class VideoView : UserControl
+ {
+ public VideoView(bool isManager, string userName)
+ {
+ InitializeComponent();
+ this.IsManager = isManager;
+ this.UserName = userName;
+ }
+
+ private bool operVisible = false;
+ public bool IsManager
+ {
+ get
+ {
+ return ava_manager.Visible;
+ }
+ set
+ {
+ ava_manager.Visible = value;
+ }
+ }
+ public string UserName
+ {
+ get
+ {
+ return lab_Name.Text;
+ }
+ set
+ {
+ lab_Name.Text = value;
+ }
+ }
+
+ private void pic_frame_MouseLeave(object sender, EventArgs e)
+ {
+ Task.Run(async () =>
+ {
+ await Task.Delay(50);
+ btn_oper.BeginInvoke(new Action(() =>
+ {
+ if (!operVisible)
+ btn_oper.Visible = false;
+ }));
+ });
+ }
+
+
+ private void pic_frame_MouseEnter(object sender, EventArgs e)
+ {
+ btn_oper.Visible = true;
+ }
+ private void btn_oper_MouseClick(object sender, MouseEventArgs e)
+ {
+ MessageBox.Show("我被点击了");
+ }
+
+ private void btn_oper_MouseEnter(object sender, EventArgs e)
+ {
+ operVisible = true;
+ }
+
+ private void btn_oper_MouseLeave(object sender, EventArgs e)
+ {
+ Task.Run(async () =>
+ {
+ await Task.Delay(50);
+ operVisible = false;
+ });
+ }
+
+ private void VideoView_Load(object sender, EventArgs e)
+ {
+
+ stackPanel1.Width = ava_manager.Width + lab_Name.Width;
+ }
+ }
+}
diff --git a/WinFormsApp1/VideoView.resx b/WinFormsApp1/VideoView.resx
new file mode 100644
index 0000000..9581b67
--- /dev/null
+++ b/WinFormsApp1/VideoView.resx
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ <svg t="1732243208690" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12917" width="200" height="200"><path d="M228.266667 145.493333c24.405333-14.08 54.314667-22.016 99.541333-26.112C373.461333 115.2 431.701333 115.2 512 115.2c80.298667 0 138.538667 0 184.192 4.181333 45.226667 4.096 75.136 12.032 99.541333 26.112a226.133333 226.133333 0 0 1 82.773334 82.773334c14.08 24.405333 22.016 54.314667 26.112 99.541333 4.138667 45.653333 4.181333 103.893333 4.181333 184.192 0 80.298667 0 138.538667-4.181333 184.192-4.096 45.226667-12.032 75.136-26.112 99.541333a226.133333 226.133333 0 0 1-82.773334 82.773334c-24.405333 14.08-54.314667 22.016-99.541333 26.112-45.653333 4.138667-103.893333 4.181333-184.192 4.181333-80.298667 0-138.538667 0-184.192-4.181333-45.226667-4.096-75.136-12.032-99.541333-26.112a226.133333 226.133333 0 0 1-82.773334-82.773334c-14.08-24.405333-22.016-54.314667-26.112-99.541333C115.2 650.538667 115.2 592.298667 115.2 512c0-80.298667 0-138.538667 4.181333-184.192 4.096-45.226667 12.032-75.136 26.112-99.541333a226.133333 226.133333 0 0 1 82.773334-82.773334zM512 55.466667h-1.493333c-78.506667 0-139.434667 0-188.074667 4.394666-49.365333 4.48-89.045333 13.696-124.032 33.92A285.866667 285.866667 0 0 0 93.781333 198.4c-20.224 34.986667-29.44 74.666667-33.92 124.032-4.394667 48.64-4.394667 109.568-4.394666 188.074667V513.536c0 78.464 0 139.392 4.394666 188.032 4.48 49.365333 13.696 89.045333 33.92 124.032l25.813334-14.933333-25.813334 14.933333a285.866667 285.866667 0 0 0 104.618667 104.618667c34.986667 20.224 74.666667 29.44 124.032 33.92 48.64 4.394667 109.568 4.394667 188.032 4.394666H513.536c78.506667 0 139.434667 0 188.074667-4.394666 49.365333-4.48 89.045333-13.653333 124.032-33.92a285.824 285.824 0 0 0 104.618666-104.618667c20.224-34.986667 29.44-74.666667 33.92-124.032 4.394667-48.64 4.394667-109.568 4.394667-188.032V510.464c0-78.506667 0-139.434667-4.394667-188.074667-4.48-49.365333-13.653333-89.045333-33.92-124.032a285.866667 285.866667 0 0 0-104.618666-104.618666l-14.933334 25.856 14.933334-25.856c-34.986667-20.224-74.666667-29.44-124.032-33.92-48.64-4.394667-109.568-4.394667-188.074667-4.394667H512zM369.792 512a47.402667 47.402667 0 1 0-94.848 0 47.402667 47.402667 0 0 0 94.848 0zM512 464.597333a47.402667 47.402667 0 1 1 0 94.805334 47.402667 47.402667 0 0 1 0-94.805334z m237.013333 47.36a47.402667 47.402667 0 1 0-94.805333 0 47.402667 47.402667 0 0 0 94.805333 0z" fill="#8a8a8a" p-id="12918"></path></svg>
+
+
+ <svg t="1732240808133" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12695" width="200" height="200"><path d="M228.266667 145.493333c24.405333-14.08 54.314667-22.016 99.541333-26.112C373.461333 115.2 431.701333 115.2 512 115.2c80.298667 0 138.538667 0 184.192 4.181333 45.226667 4.096 75.136 12.032 99.541333 26.112a226.133333 226.133333 0 0 1 82.773334 82.773334c14.08 24.405333 22.016 54.314667 26.112 99.541333 4.138667 45.653333 4.181333 103.893333 4.181333 184.192 0 80.298667 0 138.538667-4.181333 184.192-4.096 45.226667-12.032 75.136-26.112 99.541333a226.133333 226.133333 0 0 1-82.773334 82.773334c-24.405333 14.08-54.314667 22.016-99.541333 26.112-45.653333 4.138667-103.893333 4.181333-184.192 4.181333-80.298667 0-138.538667 0-184.192-4.181333-45.226667-4.096-75.136-12.032-99.541333-26.112a226.133333 226.133333 0 0 1-82.773334-82.773334c-14.08-24.405333-22.016-54.314667-26.112-99.541333C115.2 650.538667 115.2 592.298667 115.2 512c0-80.298667 0-138.538667 4.181333-184.192 4.096-45.226667 12.032-75.136 26.112-99.541333a226.133333 226.133333 0 0 1 82.773334-82.773334zM512 55.466667h-1.493333c-78.506667 0-139.434667 0-188.074667 4.394666-49.365333 4.48-89.045333 13.696-124.032 33.92A285.866667 285.866667 0 0 0 93.781333 198.4c-20.224 34.986667-29.44 74.666667-33.92 124.032-4.394667 48.64-4.394667 109.568-4.394666 188.074667V513.536c0 78.464 0 139.392 4.394666 188.032 4.48 49.365333 13.696 89.045333 33.92 124.032l25.813334-14.933333-25.813334 14.933333a285.866667 285.866667 0 0 0 104.618667 104.618667c34.986667 20.224 74.666667 29.44 124.032 33.92 48.64 4.394667 109.568 4.394667 188.032 4.394666H513.536c78.506667 0 139.434667 0 188.074667-4.394666 49.365333-4.48 89.045333-13.653333 124.032-33.92a285.824 285.824 0 0 0 104.618666-104.618667c20.224-34.986667 29.44-74.666667 33.92-124.032 4.394667-48.64 4.394667-109.568 4.394667-188.032V510.464c0-78.506667 0-139.434667-4.394667-188.074667-4.48-49.365333-13.653333-89.045333-33.92-124.032a285.866667 285.866667 0 0 0-104.618666-104.618666l-14.933334 25.856 14.933334-25.856c-34.986667-20.224-74.666667-29.44-124.032-33.92-48.64-4.394667-109.568-4.394667-188.074667-4.394667H512zM369.792 512a47.402667 47.402667 0 1 0-94.848 0 47.402667 47.402667 0 0 0 94.848 0zM512 464.597333a47.402667 47.402667 0 1 1 0 94.805334 47.402667 47.402667 0 0 1 0-94.805334z m237.013333 47.36a47.402667 47.402667 0 1 0-94.805333 0 47.402667 47.402667 0 0 0 94.805333 0z" fill="#ffffff" p-id="12696"></path></svg>
+
+
+ <svg t="1732244463838" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="48630" width="200" height="200"><path d="M308.48 388.48A23.04 23.04 0 0 0 339.84 384l131.84-229.12a45.44 45.44 0 0 1 79.36 0L682.88 384a23.04 23.04 0 0 0 31.36 7.68c57.6-35.2 123.52-78.08 174.08-112A45.44 45.44 0 0 1 960 320a4321.28 4321.28 0 0 1-76.8 499.84 64 64 0 0 1-39.04 46.08A1169.28 1169.28 0 0 1 512 896a1228.16 1228.16 0 0 1-329.6-29.44 64 64 0 0 1-41.6-50.56C103.68 643.2 77.44 437.12 64 320a45.44 45.44 0 0 1 71.68-40.96c50.56 32 115.84 74.88 172.8 109.44z" fill="#FFC950" p-id="48631"></path><path d="M646.4 602.24c0 33.92-101.12 179.2-134.4 179.2s-134.4-145.28-134.4-179.2 100.48-179.2 134.4-179.2 134.4 145.92 134.4 179.2z" fill="#FFFFFF" p-id="48632"></path></svg>
+
+
\ No newline at end of file
diff --git a/WinFormsApp1/WinFormsApp1.csproj b/WinFormsApp1/WinFormsApp1.csproj
new file mode 100644
index 0000000..b95507a
--- /dev/null
+++ b/WinFormsApp1/WinFormsApp1.csproj
@@ -0,0 +1,15 @@
+
+
+
+ WinExe
+ net8.0-windows
+ enable
+ true
+ enable
+
+
+
+
+
+
+
\ No newline at end of file