添加项目文件。

This commit is contained in:
youngq 2024-11-28 17:25:52 +08:00
parent 82c4c0c320
commit ad8f3983c9
36 changed files with 1376 additions and 0 deletions

View File

@ -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();
}
}
}

View File

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>

View File

@ -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; }
}
}

View File

@ -0,0 +1,7 @@
namespace Demo.Common
{
public static class RegionNames
{
public const string VideoRegion = "VideoRegion";
}
}

46
Meeting.V2.Demo.sln Normal file
View File

@ -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

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Prism.Wpf" Version="8.1.97" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,15 @@
<prism:PrismApplication
x:Class="Meeting.V2.Demo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Meeting.V2.Demo"
xmlns:prism="http://prismlibrary.com/">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml" />
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</prism:PrismApplication>

View File

@ -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
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IConfigureService, ConfigureService>();
containerRegistry.RegisterForNavigation<VideoView, VideoViewModel>();
containerRegistry.RegisterForNavigation<VideoAreaView, VideoAreaViewModel>();
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
// 注册模块
//moduleCatalog.AddModule<ModuleNameModule>();
}
protected override void OnInitialized()
{
base.OnInitialized();
var config = Container.Resolve<IConfigureService>();
if (config != null)
{
config.Init();
}
}
}
}

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1732693773644" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="30874" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M503.3984 533.4016c120.6272 0 218.624-96.5632 218.624-215.4496 0-118.784-97.9968-215.4496-218.624-215.4496-120.576 0-218.6752 96.6656-218.6752 215.4496s98.1504 215.4496 218.6752 215.4496z m90.112 20.736H429.7216C277.4016 554.1376 153.6 676.096 153.6 826.0096v16.1792c0 78.2848 121.856 78.2848 276.0704 78.2848h163.8912c148.1728 0 276.0704 0 276.0704-78.2848v-16.1792c-0.1024-149.9136-123.904-271.872-276.1216-271.872z m0 0" fill="#ffffff" p-id="30875"></path></svg>

After

Width:  |  Height:  |  Size: 799 B

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1732688610223" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4924" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M157.538462 393.846154c64.984615 0 118.153846 53.169231 118.153846 118.153846s-53.169231 118.153846-118.153846 118.153846-118.153846-53.169231-118.153847-118.153846 53.169231-118.153846 118.153847-118.153846z m354.461538 0c64.984615 0 118.153846 53.169231 118.153846 118.153846s-53.169231 118.153846-118.153846 118.153846-118.153846-53.169231-118.153846-118.153846 53.169231-118.153846 118.153846-118.153846z m354.461538 0c64.984615 0 118.153846 53.169231 118.153847 118.153846s-53.169231 118.153846-118.153847 118.153846-118.153846-53.169231-118.153846-118.153846 53.169231-118.153846 118.153846-118.153846z" fill="#FFFFFF" p-id="4925"></path></svg>

After

Width:  |  Height:  |  Size: 983 B

View File

@ -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<VideoAreaView>(RegionNames.VideoRegion);
}
}
}

View File

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Meeting.V2.Demo.Services.Interfaces
{
public interface IConfigureService
{
void Init();
}
}

View File

@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<UseWindowsForms>True</UseWindowsForms>
</PropertyGroup>
<ItemGroup>
<None Remove="Assets\manager.svg" />
<None Remove="Assets\more.svg" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="HandyControl" Version="3.5.1" />
<PackageReference Include="MahApps.Microsoft.DwayneNeed" Version="1.0.1" />
<PackageReference Include="Prism.DryIoc" Version="8.1.97" />
<PackageReference Include="SharpVectors.Reloaded" Version="1.8.4.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Demo.Common\Demo.Common.csproj" />
<ProjectReference Include="..\Services\Meeting.V2.Demo.Services.Interfaces\Meeting.V2.Demo.Services.Interfaces.csproj" />
<ProjectReference Include="..\Services\Meeting.V2.Demo.Services\Meeting.V2.Demo.Services.csproj" />
</ItemGroup>
<ItemGroup>
<Resource Include="Assets\manager.svg" />
<Resource Include="Assets\more.svg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource>
</ItemGroup>
</Project>

View File

@ -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<bool> continuationCallback)
{
continuationCallback(true);
}
public virtual bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public virtual void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public virtual void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
}

View File

@ -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()
{
}
}
}

View File

@ -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()
{
}
}
}

View File

@ -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<UserInfo> userInfos = new();
/// <summary>
/// 用户列表
/// </summary>
public ObservableCollection<UserInfo> 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))}");
}
}
}

View File

@ -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;
/// <summary>
/// 用户信息
/// </summary>
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}");
});
}
}

View File

@ -0,0 +1,33 @@
<hc:Window
x:Class="Meeting.V2.Demo.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cmn="clr-namespace:Demo.Common;assembly=Demo.Common"
xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:intertop="clr-namespace:Microsoft.DwayneNeed.Interop;assembly=MahApps.Microsoft.DwayneNeed"
xmlns:local="clr-namespace:Meeting.V2.Demo.Views"
xmlns:prism="http://prismlibrary.com/"
xmlns:wfc="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns:wfh="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
Width="960"
Height="640"
prism:ViewModelLocator.AutoWireViewModel="True"
Background="#252525"
CloseButtonForeground="Red"
NonClientAreaBackground="Black"
NonClientAreaForeground="White"
OtherButtonForeground="White"
WindowStartupLocation="CenterScreen">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="55" />
</Grid.RowDefinitions>
<ContentControl prism:RegionManager.RegionName="{x:Static cmn:RegionNames.VideoRegion}" />
<DockPanel Grid.Row="1" Background="#242424">
<Button Height="45">加入频道</Button>
</DockPanel>
<!--<local:VideoView x:Name="videoVIew" />-->
</Grid>
</hc:Window>

View File

@ -0,0 +1,18 @@
using System;
using System.Drawing;
using System.Windows;
using System.Xml.Linq;
namespace Meeting.V2.Demo.Views
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : HandyControl.Controls.Window
{
public MainWindow()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,39 @@
<UserControl
x:Class="Meeting.V2.Demo.Views.VideoAreaView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Meeting.V2.Demo.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:prism="http://prismlibrary.com/"
d:DesignHeight="530"
d:DesignWidth="960"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="5*" />
</Grid.RowDefinitions>
<ItemsControl Padding="10" ItemsSource="{Binding UserInfos}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:VideoView UserName="{Binding UserName}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<!--<StackPanel Name="stack_user" Orientation="Horizontal" />-->
<local:VideoView x:Name="main_video" Grid.Row="1" />
<Button Command="{Binding TestCommand}" Content="测试按钮" />
</Grid>
</UserControl>

View File

@ -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
{
/// <summary>
/// VideoAreaView.xaml 的交互逻辑
/// </summary>
public partial class VideoAreaView : UserControl
{
public VideoAreaView()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,84 @@
<UserControl
x:Class="Meeting.V2.Demo.Views.VideoView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cnt="clr-namespace:Demo.Common.Converters;assembly=Demo.Common"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:intertop="clr-namespace:Microsoft.DwayneNeed.Interop;assembly=MahApps.Microsoft.DwayneNeed"
xmlns:local="clr-namespace:Meeting.V2.Demo.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:prism="http://prismlibrary.com/"
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
xmlns:wfc="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns:wfh="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
MinWidth="160"
MinHeight="90"
d:DesignHeight="90"
d:DesignWidth="160"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d">
<UserControl.Resources>
<cnt:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
</UserControl.Resources>
<Grid>
<!--#region 视频区域 + 右上角按钮-->
<intertop:AirspaceDecorator
AirspaceMode="Redirect"
IsInputRedirectionEnabled="True"
IsOutputRedirectionEnabled="True">
<WindowsFormsHost x:Name="gridHost">
<wfc:PictureBox
x:Name="pic_frame"
BackColor="#2d3033"
Dock="Fill"
MouseEnter="pic_frame_MouseEnter"
MouseLeave="pic_frame_MouseLeave"
SizeMode="StretchImage" />
</WindowsFormsHost>
</intertop:AirspaceDecorator>
<Button
x:Name="btn_oper"
Margin="0,8,8,0"
Padding="5"
HorizontalAlignment="Right"
VerticalAlignment="Top"
hc:BorderElement.CornerRadius="4"
Background="#99727169"
BorderBrush="Transparent"
Command="{Binding OperClickCommand}"
MouseEnter="btn_oper_MouseEnter"
MouseLeave="btn_oper_MouseLeave"
Visibility="Collapsed">
<svgc:SvgViewbox Width="15" Source="Assets/more.svg" />
</Button>
<!--#endregion-->
<!--#region 左下角用户名-->
<StackPanel
Height="22"
HorizontalAlignment="Left"
VerticalAlignment="Bottom"
Orientation="Horizontal">
<Border Background="#ff801a" Visibility="{Binding UserInfo.IsManager, Converter={StaticResource BoolToVisibilityConverter}}">
<svgc:SvgViewbox
x:Name="icon_manager"
Margin="3"
MessageFillBrush="red"
Source="Assets/manager.svg" />
</Border>
<Border Background="#8C000000" CornerRadius="0,8,0,0">
<TextBlock
x:Name="txt_uname"
Margin="5"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="12"
Foreground="White"
Text="{Binding UserInfo.UserName}" />
</Border>
</StackPanel>
<!--#endregion-->
</Grid>
</UserControl>

View File

@ -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
{
/// <summary>
/// VideoView.xaml 的交互逻辑
/// </summary>
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
/// <summary>
/// 控制操作按钮显示
/// </summary>
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
}
}

View File

@ -0,0 +1,7 @@
namespace Meeting.V2.Demo.Services.Interfaces
{
public interface IMessageService
{
string GetMessage();
}
}

View File

@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Meeting.V2.Demo.Services.Interfaces\Meeting.V2.Demo.Services.Interfaces.csproj" />
</ItemGroup>
</Project>

View File

@ -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";
}
}
}

39
WinFormsApp1/Form1.Designer.cs generated Normal file
View File

@ -0,0 +1,39 @@
namespace WinFormsApp1
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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
}
}

10
WinFormsApp1/Form1.cs Normal file
View File

@ -0,0 +1,10 @@
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

120
WinFormsApp1/Form1.resx Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

17
WinFormsApp1/Program.cs Normal file
View File

@ -0,0 +1,17 @@
namespace WinFormsApp1
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[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());
}
}
}

136
WinFormsApp1/VideoView.Designer.cs generated Normal file
View File

@ -0,0 +1,136 @@
namespace Meeting.VideoView.Controls
{
partial class VideoView
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
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;
}
}

89
WinFormsApp1/VideoView.cs Normal file
View File

@ -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;
}
}
}

129
WinFormsApp1/VideoView.resx Normal file
View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="btn_oper.IconHoverSvg" xml:space="preserve">
<value>&lt;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"&gt;&lt;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"&gt;&lt;/path&gt;&lt;/svg&gt;</value>
</data>
<data name="btn_oper.IconSvg" xml:space="preserve">
<value>&lt;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"&gt;&lt;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"&gt;&lt;/path&gt;&lt;/svg&gt;</value>
</data>
<data name="ava_manager.ImageSvg" xml:space="preserve">
<value>&lt;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"&gt;&lt;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"&gt;&lt;/path&gt;&lt;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"&gt;&lt;/path&gt;&lt;/svg&gt;</value>
</data>
</root>

View File

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AntdUI" Version="1.7.7" />
</ItemGroup>
</Project>