ChatX/chatclient/Data/ChatDataModel.cs
XuShanQiXun 015535c100 添加时间格式转换器和命名空间引用
在 `App.xaml` 中添加了对 `chatclient.Data` 命名空间的引用。
在 `ChatDataModel.cs` 中移除不必要的 `using` 语句,添加对 `System.Windows` 和 `System.Windows.Media.Imaging` 的引用,并为 `ConvertBack` 方法添加文档注释。
在 `MainWindow.xaml` 中定义了 `TimeFormatConverter` 资源,以增强时间显示功能。
2025-06-22 00:55:33 +08:00

134 lines
4.5 KiB
C#

using System.Windows.Media;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Globalization;
using System.Windows.Data;
namespace chatclient.Data
{
/// <summary>
/// 聊天消息类,表示一条消息的内容和显示属性
/// </summary>
public class ChatMessage
{
/// <summary>
/// 发送者名称
/// </summary>
public required string Sender { get; set; }
/// <summary>
/// 消息类型(文本、图片、文件、系统消息等)
/// </summary>
public required MessageType MsgType { get; set; } = MessageType.Text;
/// <summary>
/// 消息发送者的头像图片
/// </summary>
public required BitmapImage Image { get; set; }
/// <summary>
/// 消息内容
/// </summary>
public required string Content { get; set; }
/// <summary>
/// 消息发送时间
/// </summary>
public DateTime Timestamp { get; set; }
/// <summary>
/// 消息在界面中的对齐方式(左/右)
/// </summary>
public HorizontalAlignment Alignment { get; set; } = HorizontalAlignment.Left;
/// <summary>
/// 发送者名称的显示颜色
/// </summary>
public Brush SenderColor { get; set; } = Brushes.Black;
}
public enum MessageType
{
Text,
Image,//图片
File,//文件
System//系统信息
}
/// <summary>
/// 临时账户信息类,包含用户名和密码
/// </summary>
public class Account
{
public string? UserName { get; set; }
public string? UserPassword { get; set; }
}
public class TimeFormatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is DateTime timestamp)
{
// 获取本地时区信息
TimeZoneInfo localTimeZone = TimeZoneInfo.Local;
bool isLocalTimeZoneUtcPlus8 = localTimeZone.BaseUtcOffset == TimeSpan.FromHours(8);
DateTime localTime;
if (timestamp.Kind == DateTimeKind.Utc)
{
localTime = timestamp.ToLocalTime();
}
else if (timestamp.Kind == DateTimeKind.Unspecified)
{
localTime = DateTime.SpecifyKind(timestamp, DateTimeKind.Utc).ToLocalTime();
}
else
{
localTime = timestamp;
}
var now = DateTime.Now;
var today = now.Date;
var yesterday = today.AddDays(-1);
var localTimeDate = localTime.Date;
// 格式化时间字符串
string formattedTime;
if (localTimeDate == today)
{
formattedTime = localTime.ToString("HH:mm:ss");
}
else if (localTimeDate == yesterday)
{
formattedTime = "昨天 " + localTime.ToString("HH:mm");
}
else if (localTime.Year == now.Year)
{
formattedTime = localTime.ToString("MM/dd HH:mm");
}
else
{
formattedTime = localTime.ToString("yy/MM/dd HH:mm");
}
// 仅在非UTC+8时区显示时区信息
if (!isLocalTimeZoneUtcPlus8)
{
// 获取原始时间的时区信息
string timeZoneInfo = timestamp.Kind == DateTimeKind.Utc
? "UTC"
: "UTC"+localTime.ToString("zzz");
return $"{timeZoneInfo} {formattedTime}";
}
return formattedTime;
}
return value;
}
/// <summary>
/// 将格式化的时间字符串转换回DateTime对象
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}