添加项目文件。
This commit is contained in:
parent
82c4c0c320
commit
ad8f3983c9
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
namespace Demo.Common
|
||||
{
|
||||
public static class RegionNames
|
||||
{
|
||||
public const string VideoRegion = "VideoRegion";
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Meeting.V2.Demo.Services.Interfaces
|
||||
{
|
||||
public interface IConfigureService
|
||||
{
|
||||
void Init();
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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))}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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}");
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
namespace Meeting.V2.Demo.Services.Interfaces
|
||||
{
|
||||
public interface IMessageService
|
||||
{
|
||||
string GetMessage();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
namespace WinFormsApp1
|
||||
{
|
||||
public partial class Form1 : Form
|
||||
{
|
||||
public Form1()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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><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></value>
|
||||
</data>
|
||||
<data name="btn_oper.IconSvg" xml:space="preserve">
|
||||
<value><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></value>
|
||||
</data>
|
||||
<data name="ava_manager.ImageSvg" xml:space="preserve">
|
||||
<value><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></value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -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>
|
||||
Loading…
Reference in New Issue