From ad8f3983c9a2d90fdf699f30f98b85102313c05a Mon Sep 17 00:00:00 2001 From: youngq Date: Thu, 28 Nov 2024 17:25:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Converters/BoolToVisibilityConverter.cs | 38 +++++ Demo.Common/Demo.Common.csproj | 10 ++ Demo.Common/Models/UserInfo.cs | 15 ++ Demo.Common/RegionNames.cs | 7 + Meeting.V2.Demo.sln | 46 ++++++ .../Meeting.V2.Demo.Core.csproj | 9 ++ Meeting.V2.Demo/Meeting.V2.Demo/App.xaml | 15 ++ Meeting.V2.Demo/Meeting.V2.Demo/App.xaml.cs | 46 ++++++ .../Meeting.V2.Demo/Assets/manager.svg | 1 + .../Meeting.V2.Demo/Assets/more.svg | 1 + .../Configure/ConfigureService.cs | 23 +++ .../Configure/IConfigureService.cs | 11 ++ .../Meeting.V2.Demo/Meeting.V2.Demo.csproj | 29 ++++ .../Mvvm/RegionViewModelBase.cs | 35 +++++ .../Meeting.V2.Demo/Mvvm/ViewModelBase.cs | 18 +++ .../ViewModels/MainWindowViewModel.cs | 19 +++ .../ViewModels/VideoAreaViewModel.cs | 77 ++++++++++ .../ViewModels/VideoViewModel.cs | 39 +++++ .../Meeting.V2.Demo/Views/MainWindow.xaml | 33 ++++ .../Meeting.V2.Demo/Views/MainWindow.xaml.cs | 18 +++ .../Meeting.V2.Demo/Views/VideoAreaView.xaml | 39 +++++ .../Views/VideoAreaView.xaml.cs | 28 ++++ .../Meeting.V2.Demo/Views/VideoView.xaml | 84 ++++++++++ .../Meeting.V2.Demo/Views/VideoView.xaml.cs | 143 ++++++++++++++++++ .../IMessageService.cs | 7 + ...Meeting.V2.Demo.Services.Interfaces.csproj | 7 + .../Meeting.V2.Demo.Services.csproj | 11 ++ .../MessageService.cs | 12 ++ WinFormsApp1/Form1.Designer.cs | 39 +++++ WinFormsApp1/Form1.cs | 10 ++ WinFormsApp1/Form1.resx | 120 +++++++++++++++ WinFormsApp1/Program.cs | 17 +++ WinFormsApp1/VideoView.Designer.cs | 136 +++++++++++++++++ WinFormsApp1/VideoView.cs | 89 +++++++++++ WinFormsApp1/VideoView.resx | 129 ++++++++++++++++ WinFormsApp1/WinFormsApp1.csproj | 15 ++ 36 files changed, 1376 insertions(+) create mode 100644 Demo.Common/Converters/BoolToVisibilityConverter.cs create mode 100644 Demo.Common/Demo.Common.csproj create mode 100644 Demo.Common/Models/UserInfo.cs create mode 100644 Demo.Common/RegionNames.cs create mode 100644 Meeting.V2.Demo.sln create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo.Core/Meeting.V2.Demo.Core.csproj create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/App.xaml create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/App.xaml.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Assets/manager.svg create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Assets/more.svg create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Configure/ConfigureService.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Configure/IConfigureService.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Meeting.V2.Demo.csproj create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Mvvm/RegionViewModelBase.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Mvvm/ViewModelBase.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/MainWindowViewModel.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/VideoAreaViewModel.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/ViewModels/VideoViewModel.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Views/MainWindow.xaml create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Views/MainWindow.xaml.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoAreaView.xaml create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoAreaView.xaml.cs create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoView.xaml create mode 100644 Meeting.V2.Demo/Meeting.V2.Demo/Views/VideoView.xaml.cs create mode 100644 Meeting.V2.Demo/Services/Meeting.V2.Demo.Services.Interfaces/IMessageService.cs create mode 100644 Meeting.V2.Demo/Services/Meeting.V2.Demo.Services.Interfaces/Meeting.V2.Demo.Services.Interfaces.csproj create mode 100644 Meeting.V2.Demo/Services/Meeting.V2.Demo.Services/Meeting.V2.Demo.Services.csproj create mode 100644 Meeting.V2.Demo/Services/Meeting.V2.Demo.Services/MessageService.cs create mode 100644 WinFormsApp1/Form1.Designer.cs create mode 100644 WinFormsApp1/Form1.cs create mode 100644 WinFormsApp1/Form1.resx create mode 100644 WinFormsApp1/Program.cs create mode 100644 WinFormsApp1/VideoView.Designer.cs create mode 100644 WinFormsApp1/VideoView.cs create mode 100644 WinFormsApp1/VideoView.resx create mode 100644 WinFormsApp1/WinFormsApp1.csproj 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/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