返回提交历史

XFEstudio/MyFirstRespo

改为nuget包途径

c5153b2
X
XFEstudio <mail@xfegzs.com>
提交于

代码差异

9 个文件 +4 -717
Deleted XFEToolBox/Console/XFEConsole.cs +0 -148
@@ -1,148 +0,0 @@
1 using System.Diagnostics;
2 using XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
3 using XFEExtension.NetCore.XFETransform;
4 using XFEExtension.NetCore.XFETransform.StringConverter;
5
6 namespace XFEExtension.NetCore.XFEConsole;
7
8 /// <summary>
9 /// XFE控制台
10 /// </summary>
11 public class XFEConsole
12 {
13 /// <summary>
14 /// 是否在本地调试的Debug中展示
15 /// </summary>
16 /// <remarks>
17 /// 默认为 true
18 /// </remarks>
19 public static bool ShowInDebug { get; set; } = true;
20 /// <summary>
21 /// 是否在本地控制台中显示
22 /// </summary>
23 /// <remarks>
24 /// 默认为 false
25 /// </remarks>
26 public static bool ShowInLocalConsole { get; set; } = false;
27 /// <summary>
28 /// 是否自动解析对象,而非直接输出对象的.ToString()方法
29 /// </summary>
30 /// <remarks>
31 /// 默认为 true
32 /// </remarks>
33 public static bool AutoAnalyzeObject { get; set; } = true;
34 /// <summary>
35 /// 客户端列表
36 /// </summary>
37 public static List<XFEConsoleProgramClient> ClientList { get; set; } = [];
38 /// <summary>
39 /// 使用XFE控制台
40 /// </summary>
41 /// <param name="ipAddress">IP地址</param>
42 /// <param name="name">客户端名称</param>
43 /// <param name="id">客户端ID</param>
44 /// <param name="password">密码</param>
45 /// <returns>是否连接成功</returns>
46 public static async Task<bool> UseXFEConsole(string ipAddress, string name, string id, string password)
47 {
48 SetConsoleOutput();
49 return await ConnectConsole(ipAddress, name, id, password);
50 }
51 /// <summary>
52 /// 使用XFE控制台
53 /// </summary>
54 /// <param name="port">端口</param>
55 /// <param name="password">密码</param>
56 /// <returns>是否连接成功</returns>
57 public static async Task<bool> UseXFEConsole(string port, string password = "") => await UseXFEConsole($"ws://*:{port}", AppDomain.CurrentDomain.FriendlyName, Guid.NewGuid().ToString(), password);
58 /// <summary>
59 /// 设置XFE控制台
60 /// </summary>
61 /// <returns></returns>
62 public static void SetConsoleOutput()
63 {
64 Console.SetOut(new XFEConsoleTextWriter());
65 }
66 /// <summary>
67 /// 连接XFE控制台
68 /// </summary>
69 /// <param name="ipAddress">IP地址</param>
70 /// <param name="name">客户端名称</param>
71 /// <param name="id">客户端ID</param>
72 /// <param name="password">密码</param>
73 /// <returns>是否连接成功</returns>
74 public static async Task<bool> ConnectConsole(string ipAddress, string name, string id, string password)
75 {
76 var client = new XFEConsoleProgramClient(ipAddress, name, id, password);
77 if (await client.Connect())
78 {
79 ClientList.Add(client);
80 return true;
81 }
82 else
83 {
84 return false;
85 }
86 }
87 /// <summary>
88 /// 输出对象信息
89 /// </summary>
90 /// <param name="obj">对象</param>
91 /// <param name="remarkName">对象注释</param>
92 /// <param name="onlyProperty">仅解析属性</param>
93 /// <param name="onlyPublic">仅解析公共属性或字段</param>
94 /// <returns></returns>
95 public static async Task WriteObject(object? obj, string remarkName = "分析对象", bool onlyProperty = true, bool onlyPublic = true)
96 {
97 var objectInfo = "无法分析对象:";
98 try
99 {
100 objectInfo = XFEConverter.GetObjectInfo(StringConverter.ObjectAnalyzer, remarkName, ObjectPlace.Main, 0, obj?.GetType(), obj, onlyProperty, onlyPublic).OutPutObject();
101 }
102 catch (Exception ex)
103 {
104 Debug.WriteLine(ex);
105 objectInfo += ex.StackTrace;
106 }
107 if (ShowInDebug)
108 Debug.WriteLine(objectInfo);
109 if (ShowInLocalConsole)
110 Console.WriteLine(objectInfo);
111 foreach (var client in ClientList)
112 await client.OutputMessage(objectInfo, true);
113 }
114 /// <summary>
115 /// 向已连接的XFE控制台输出一条消息
116 /// </summary>
117 /// <param name="text">文本</param>
118 /// <returns></returns>
119 public static async Task WriteLine(string? text)
120 {
121 if (text is not null)
122 {
123 if (ShowInDebug)
124 Debug.WriteLine(text);
125 if (ShowInLocalConsole)
126 Console.WriteLine(text);
127 foreach (var client in ClientList)
128 await client.OutputMessage(text, true);
129 }
130 }
131 /// <summary>
132 /// 向已连接的XFE控制台输出一条消息
133 /// </summary>
134 /// <param name="text">文本</param>
135 /// <returns></returns>
136 public static async Task Write(string? text)
137 {
138 if (text is not null)
139 {
140 if (ShowInDebug)
141 Debug.WriteLine(text);
142 if (ShowInLocalConsole)
143 Console.WriteLine(text);
144 foreach (var client in ClientList)
145 await client.OutputMessage(text, false);
146 }
147 }
148 }
Deleted XFEToolBox/Console/XFEConsoleClientInfo.cs +0 -30
@@ -1,30 +0,0 @@
1 using XFEExtension.NetCore.CyberComm;
2
3 namespace XFEExtension.NetCore.XFEConsole;
4
5 /// <summary>
6 /// XFE控制台客户端信息
7 /// </summary>
8 /// <param name="clientName">客户端名称</param>
9 /// <param name="clientUUID">客户端唯一标识符</param>
10 /// <param name="password">客户端连接时密码</param>
11 /// <param name="eventArgs">事件参数</param>
12 public class XFEConsoleClientInfo(string clientName, string clientUUID, string password, CyberCommServerEventArgs eventArgs)
13 {
14 /// <summary>
15 /// 客户端名称
16 /// </summary>
17 public string ClientName { get; set; } = clientName;
18 /// <summary>
19 /// 客户端唯一标识符
20 /// </summary>
21 public string ClientUUID { get; set; } = clientUUID;
22 /// <summary>
23 /// 客户端密码
24 /// </summary>
25 public string Password { get; set; } = password;
26 /// <summary>
27 /// 事件参数
28 /// </summary>
29 public CyberCommServerEventArgs EventArgs { get; set; } = eventArgs;
30 }
Deleted XFEToolBox/Console/XFEConsoleProgramClient.cs +0 -66
@@ -1,66 +0,0 @@
1 using XFEExtension.NetCore.CyberComm;
2 using XFEExtension.NetCore.FormatExtension;
3 using XFEExtension.NetCore.TaskExtension;
4
5 namespace XFEExtension.NetCore.XFEConsole;
6
7 /// <summary>
8 /// XFE控制台程序客户端
9 /// </summary>
10 /// <remarks>
11 /// 默认构造函数
12 /// </remarks>
13 /// <param name="ipAddress">控制台输出端IP地址</param>
14 /// <param name="clientName">客户端名称</param>
15 /// <param name="password">密码</param>
16 /// <param name="clientID">客户端ID</param>
17 public class XFEConsoleProgramClient(string ipAddress, string clientName, string password, string clientID)
18 {
19 private event EndTaskTrigger<bool>? ConnectTrigger;
20 /// <summary>
21 /// 客户端
22 /// </summary>
23 public CyberCommClient Client { get; set; } = new CyberCommClient(ipAddress);
24 /// <summary>
25 /// 客户端名称
26 /// </summary>
27 public string ClientName { get; set; } = clientName;
28 /// <summary>
29 /// 连接时密码
30 /// </summary>
31 public string Password { get; set; } = password;
32 /// <summary>
33 /// 客户端ID
34 /// </summary>
35 public string ClientID { get; set; } = clientID;
36 /// <summary>
37 /// 连接服务器
38 /// </summary>
39 /// <returns></returns>
40 public async Task<bool> Connect()
41 {
42 Client.Connected += Client_Connected;
43 _ = Client.StartCyberCommClient();
44 Client.ClientWebSocket!.Options.SetRequestHeader(nameof(ClientName), ClientName);
45 Client.ClientWebSocket!.Options.SetRequestHeader(nameof(Password), Password);
46 Client.ClientWebSocket!.Options.SetRequestHeader(nameof(ClientID), ClientID);
47 if (Client.IsConnected)
48 return true;
49 else
50 return await new XFEWaitTask<bool>(ref ConnectTrigger!);
51 }
52
53 private void Client_Connected(object? sender, EventArgs e) => ConnectTrigger?.Invoke(true);
54
55 /// <summary>
56 /// 输出控制台消息
57 /// </summary>
58 /// <param name="message">消息文本</param>
59 /// <param name="isLine">是否是一整行</param>
60 /// <returns></returns>
61 public async Task OutputMessage(string message, bool isLine)
62 {
63 if (Client.IsConnected)
64 await Client.SendTextMessage(new XFEDictionary("IsLine", isLine ? "true" : "false", "Text", message));
65 }
66 }
Deleted XFEToolBox/Console/XFEConsoleProgramServer.cs +0 -8
@@ -1,8 +0,0 @@
1 namespace XFEExtension.NetCore.XFEConsole;
2
3 /// <summary>
4 /// XFE控制台进程服务器
5 /// </summary>
6 public class XFEConsoleProgramServer
7 {
8 }
Deleted XFEToolBox/Console/XFEConsoleTerminalClient.cs +0 -8
@@ -1,8 +0,0 @@
1 namespace XFEExtension.NetCore.XFEConsole;
2
3 /// <summary>
4 /// XFE控制台终端客户端
5 /// </summary>
6 public class XFEConsoleTerminalClient
7 {
8 }
Deleted XFEToolBox/Console/XFEConsoleTerminalServer.cs +0 -150
@@ -1,150 +0,0 @@
1 using System.Net.WebSockets;
2 using XFEExtension.NetCore.CyberComm;
3 using XFEExtension.NetCore.DelegateExtension;
4 using XFEToolBox.Views.Pages;
5
6 namespace XFEExtension.NetCore.XFEConsole;
7
8 /// <summary>
9 /// XFE控制台终端服务器
10 /// </summary>
11 public class XFEConsoleTerminalServer
12 {
13 /// <summary>
14 /// 服务器
15 /// </summary>
16 public CyberCommServer Server { get; set; }
17 /// <summary>
18 /// 密码
19 /// </summary>
20 public string Password { get; set; }
21 /// <summary>
22 /// Socket客户端-客户端信息字典
23 /// </summary>
24 public Dictionary<WebSocket, XFEConsoleClientInfo> ClientInfoDictionary { get; set; } = [];
25 /// <summary>
26 /// 客户端连接事件
27 /// </summary>
28 public event XFEEventHandler<XFEConsoleTerminalServer, XFEConsoleClientInfo>? Connected;
29 /// <summary>
30 /// 客户端断开连接事件
31 /// </summary>
32 public event XFEEventHandler<XFEConsoleTerminalServer, XFEConsoleClientInfo>? Disconnected;
33 /// <summary>
34 /// 接收到客户端消息触发
35 /// </summary>
36 public event XFEEventHandler<XFEConsoleClientInfo, string>? MessageReceived;
37 /// <summary>
38 /// 发生错误
39 /// </summary>
40 public event XFEEventHandler<XFEConsoleClientInfo, Exception>? ErrorOccurred;
41 /// <summary>
42 /// 服务器启动事件
43 /// </summary>
44 public event XFEEventHandler<XFEConsoleTerminalServer>? ServerStarted;
45 /// <summary>
46 /// XFE控制台终端服务器
47 /// </summary>
48 /// <param name="port">端口号</param>
49 /// <param name="localOnly">是否只在本地开启</param>
50 /// <param name="password">密码(默认为空)</param>
51 public XFEConsoleTerminalServer(int port, bool localOnly = true, string password = "")
52 {
53 Password = password;
54 if (localOnly)
55 Server = new CyberCommServer($"http://localhost:{port}/");
56 else
57 Server = new CyberCommServer(port);
58 Server.ServerStarted += Server_ServerStarted;
59 Server.ClientConnected += Server_ClientConnected;
60 Server.ConnectionClosed += Server_ConnectionClosed;
61 Server.MessageReceived += Server_MessageReceived;
62 }
63 /// <summary>
64 /// XFE控制台终端服务器
65 /// </summary>
66 /// <param name="ipAddress">IP地址</param>
67 /// <param name="password">密码(默认为空)</param>
68 public XFEConsoleTerminalServer(string[] ipAddress, string password = "")
69 {
70 Password = password;
71 Server = new CyberCommServer(ipAddress);
72 Server.ServerStarted += Server_ServerStarted;
73 Server.ClientConnected += Server_ClientConnected;
74 Server.ConnectionClosed += Server_ConnectionClosed;
75 Server.MessageReceived += Server_MessageReceived;
76 }
77
78 private void Server_MessageReceived(object? sender, CyberCommServerEventArgs e)
79 {
80 switch (e.MessageType)
81 {
82 case BackMessageType.Text:
83 MessageReceived?.Invoke(ClientInfoDictionary[e.CurrentWebSocket], e.TextMessage!);
84 break;
85 case BackMessageType.Binary:
86 break;
87 case BackMessageType.Error:
88 ErrorOccurred?.Invoke(ClientInfoDictionary[e.CurrentWebSocket], e.Exception!);
89 break;
90 default:
91 break;
92 }
93 }
94
95 private void Server_ConnectionClosed(object? sender, CyberCommServerEventArgs e)
96 {
97 if (ClientInfoDictionary.TryGetValue(e.CurrentWebSocket, out XFEConsoleClientInfo? clientInfo))
98 {
99 ClientInfoDictionary.Remove(e.CurrentWebSocket);
100 Disconnected?.Invoke(this, clientInfo);
101 }
102 }
103
104 private async void Server_ClientConnected(object? sender, CyberCommServerEventArgs e)
105 {
106 try
107 {
108 if (e.WSHeader["ClientName"] is not null && e.WSHeader["ClientID"] is not null && e.WSHeader["Password"] is not null)
109 {
110 var password = e.WSHeader["Password"]!;
111 var clientName = e.WSHeader["ClientName"]!;
112 var clientUUID = e.WSHeader["ClientID"]!;
113 if (password == Password)
114 {
115 var clientInfo = new XFEConsoleClientInfo(clientName, clientUUID, password, e);
116 ClientInfoDictionary.Add(e.CurrentWebSocket, clientInfo);
117 Connected?.Invoke(this, clientInfo);
118 }
119 return;
120 }
121 }
122 catch { }
123 try
124 {
125 await e.Close();
126 }
127 catch
128 {
129 try
130 {
131 e.ForceClose();
132 }
133 catch { }
134 }
135 }
136
137 private void Server_ServerStarted(object? sender, EventArgs e)
138 {
139 ClientInfoDictionary = [];
140 ServerStarted?.Invoke(this);
141 }
142 /// <summary>
143 /// 启动服务器
144 /// </summary>
145 /// <returns></returns>
146 public async Task StartServer()
147 {
148 await Server.StartCyberCommServer();
149 }
150 }
Deleted XFEToolBox/Console/XFEConsoleTextWriter.cs +0 -305
@@ -1,305 +0,0 @@
1 using System.Diagnostics.CodeAnalysis;
2 using System.IO;
3 using System.Text;
4
5 namespace XFEExtension.NetCore.XFEConsole;
6
7 /// <summary>
8 /// XFE控制台文本写入器
9 /// </summary>
10 public class XFEConsoleTextWriter : TextWriter
11 {
12 /// <inheritdoc/>
13 public override Encoding Encoding => Encoding.UTF8;
14
15 /// <inheritdoc/>
16 public override async void Write(bool value)
17 {
18 base.Write(value);
19 await XFEConsole.Write(value.ToString());
20 }
21
22 /// <inheritdoc/>
23 public override async void Write(char value)
24 {
25 base.Write(value);
26 await XFEConsole.Write(value.ToString());
27 }
28
29 /// <inheritdoc/>
30 public override async void Write(char[]? buffer)
31 {
32 base.Write(buffer);
33 if(buffer is not null)
34 {
35 var stringBuilder = new StringBuilder();
36 foreach (var sigChar in buffer)
37 {
38 stringBuilder.Append(sigChar);
39 }
40 await XFEConsole.Write(stringBuilder.ToString());
41 }
42 }
43
44 /// <inheritdoc/>
45 public override async void Write(char[] buffer, int index, int count)
46 {
47 base.Write(buffer, index, count);
48 for (int i = index; i < count; i++)
49 {
50 var stringBuilder = new StringBuilder();
51 stringBuilder.Append(buffer[i]);
52 await XFEConsole.Write(stringBuilder.ToString());
53 }
54 }
55
56 /// <inheritdoc/>
57 public override async void Write(decimal value)
58 {
59 base.Write(value);
60 await XFEConsole.Write(value.ToString());
61 }
62
63 /// <inheritdoc/>
64 public override async void Write(double value)
65 {
66 base.Write(value);
67 await XFEConsole.Write(value.ToString());
68 }
69
70 /// <inheritdoc/>
71 public override async void Write(int value)
72 {
73 base.Write(value);
74 await XFEConsole.Write(value.ToString());
75 }
76
77 /// <inheritdoc/>
78 public override async void Write(long value)
79 {
80 base.Write(value);
81 await XFEConsole.Write(value.ToString());
82 }
83
84 /// <inheritdoc/>
85 public override async void Write(object? value)
86 {
87 base.Write(value);
88 await XFEConsole.Write(value?.ToString());
89 }
90
91 /// <inheritdoc/>
92 public override async void Write(float value)
93 {
94 base.Write(value);
95 await XFEConsole.Write(value.ToString());
96 }
97
98 /// <inheritdoc/>
99 public override async void Write(string? value)
100 {
101 base.Write(value);
102 await XFEConsole.Write(value);
103 }
104
105 /// <inheritdoc/>
106 public override async void Write(StringBuilder? value)
107 {
108 base.Write(value);
109 await XFEConsole.Write(value?.ToString());
110 }
111
112 /// <inheritdoc/>
113 public override async void Write(uint value)
114 {
115 base.Write(value);
116 await XFEConsole.Write(value.ToString());
117 }
118
119 /// <inheritdoc/>
120 public override async void Write(ulong value)
121 {
122 base.Write(value);
123 await XFEConsole.Write(value.ToString());
124 }
125
126 /// <inheritdoc/>
127 public override async Task WriteAsync(char value)
128 {
129 await base.WriteAsync(value);
130 await XFEConsole.Write(value.ToString());
131 }
132
133 /// <inheritdoc/>
134 public override async Task WriteAsync(char[] buffer, int index, int count)
135 {
136 await base.WriteAsync(buffer, index, count);
137 for (int i = index; i < count; i++)
138 {
139 var stringBuilder = new StringBuilder();
140 stringBuilder.Append(buffer[i]);
141 await XFEConsole.Write(stringBuilder.ToString());
142 }
143 }
144
145 /// <inheritdoc/>
146 public override async Task WriteAsync(string? value)
147 {
148 await base.WriteAsync(value);
149 await XFEConsole.Write(value);
150 }
151
152 /// <inheritdoc/>
153 public override async void WriteLine()
154 {
155 base.WriteLine();
156 await XFEConsole.WriteLine("");
157 }
158
159 /// <inheritdoc/>
160 public override async void WriteLine(bool value)
161 {
162 base.WriteLine(value);
163 await XFEConsole.WriteLine(value.ToString());
164 }
165
166 /// <inheritdoc/>
167 public override async void WriteLine(char value)
168 {
169 base.WriteLine(value);
170 await XFEConsole.WriteLine(value.ToString());
171 }
172
173 /// <inheritdoc/>
174 public override async void WriteLine(char[]? buffer)
175 {
176 base.WriteLine(buffer);
177 if (buffer is not null)
178 {
179 var stringBuilder = new StringBuilder();
180 foreach (var sigChar in buffer)
181 {
182 stringBuilder.Append(sigChar);
183 }
184 await XFEConsole.WriteLine(stringBuilder.ToString());
185 }
186 }
187
188 /// <inheritdoc/>
189 public override async void WriteLine(char[] buffer, int index, int count)
190 {
191 base.WriteLine(buffer, index, count);
192 for (int i = index; i < count; i++)
193 {
194 var stringBuilder = new StringBuilder();
195 stringBuilder.Append(buffer[i]);
196 await XFEConsole.WriteLine(stringBuilder.ToString());
197 }
198 }
199
200 /// <inheritdoc/>
201 public override async void WriteLine(decimal value)
202 {
203 base.WriteLine(value);
204 await XFEConsole.WriteLine(value.ToString());
205 }
206
207 /// <inheritdoc/>
208 public override async void WriteLine(double value)
209 {
210 base.WriteLine(value);
211 await XFEConsole.WriteLine(value.ToString());
212 }
213
214 /// <inheritdoc/>
215 public override async void WriteLine(int value)
216 {
217 base.WriteLine(value);
218 await XFEConsole.WriteLine(value.ToString());
219 }
220
221 /// <inheritdoc/>
222 public override async void WriteLine(long value)
223 {
224 base.WriteLine(value);
225 await XFEConsole.WriteLine(value.ToString());
226 }
227
228 /// <inheritdoc/>
229 public override async void WriteLine(object? value)
230 {
231 base.WriteLine(value);
232 if(XFEConsole.AutoAnalyzeObject)
233 await XFEConsole.WriteObject(value);
234 else
235 await XFEConsole.WriteLine(value?.ToString());
236 }
237
238 /// <inheritdoc/>
239 public override async void WriteLine(float value)
240 {
241 base.WriteLine(value);
242 await XFEConsole.WriteLine(value.ToString());
243 }
244
245 /// <inheritdoc/>
246 public override async void WriteLine(string? value)
247 {
248 base.WriteLine(value);
249 await XFEConsole.WriteLine(value);
250 }
251
252 /// <inheritdoc/>
253 public override async void WriteLine(StringBuilder? value)
254 {
255 base.WriteLine(value);
256 await XFEConsole.WriteLine(value?.ToString());
257 }
258
259 /// <inheritdoc/>
260 public override async void WriteLine(uint value)
261 {
262 base.WriteLine(value);
263 await XFEConsole.WriteLine(value.ToString());
264 }
265
266 /// <inheritdoc/>
267 public override async void WriteLine(ulong value)
268 {
269 base.WriteLine(value);
270 await XFEConsole.WriteLine(value.ToString());
271 }
272
273 /// <inheritdoc/>
274 public override async Task WriteLineAsync()
275 {
276 await base.WriteLineAsync();
277 await XFEConsole.WriteLine("");
278 }
279
280 /// <inheritdoc/>
281 public override async Task WriteLineAsync(char value)
282 {
283 await base.WriteLineAsync(value);
284 await XFEConsole.WriteLine(value.ToString());
285 }
286
287 /// <inheritdoc/>
288 public override async Task WriteLineAsync(char[] buffer, int index, int count)
289 {
290 await base.WriteLineAsync(buffer, index, count);
291 for (int i = index; i < count; i++)
292 {
293 var stringBuilder = new StringBuilder();
294 stringBuilder.Append(buffer[i]);
295 await XFEConsole.WriteLine(stringBuilder.ToString());
296 }
297 }
298
299 /// <inheritdoc/>
300 public override async Task WriteLineAsync(string? value)
301 {
302 await base.WriteLineAsync(value);
303 await XFEConsole.WriteLine(value);
304 }
305 }
Modified XFEToolBox/Views/Pages/MainPage.xaml.cs +2 -1
@@ -18,6 +18,7 @@ public partial class MainPage : Page
18 18
19 19 private void Page_Loaded(object sender, System.Windows.RoutedEventArgs e)
20 20 {
21 notifyText.Text = FileHelper.GetDirectorySize(new(@"C:\Users\XFEstudio\Downloads")).FileSize();
21 //notifyText.Text = FileHelper.GetDirectorySize(new(@"C:\Users\XFEstudio\Downloads")).FileSize();
22 notifyText.Text = "持续开发中...";
22 23 }
23 24 }
Modified XFEToolBox/XFEToolBox.csproj +2 -1
@@ -7,6 +7,7 @@
7 7 <ImplicitUsings>enable</ImplicitUsings>
8 8 <UseWPF>true</UseWPF>
9 9 <ApplicationIcon>Resources\Icon\XFEToolBoxIcon.ico</ApplicationIcon>
10 <Version>0.0.1</Version>
10 11 </PropertyGroup>
11 12
12 13 <ItemGroup>
@@ -31,7 +32,7 @@
31 32
32 33 <ItemGroup>
33 34 <PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
34 <PackageReference Include="XFEExtension.NetCore" Version="3.0.0" />
35 <PackageReference Include="XFEExtension.NetCore" Version="3.0.1" />
35 36 <PackageReference Include="XFEExtension.NetCore.AutoConfig" Version="1.1.1" />
36 37 <PackageReference Include="XFEExtension.NetCore.AutoPath" Version="1.0.1" />
37 38 <PackageReference Include="XFEExtension.NetCore.InputSimulator" Version="2.2.0" />