在 `App.xaml` 中添加了对 `chatclient.Data` 命名空间的引用。 在 `ChatDataModel.cs` 中移除不必要的 `using` 语句,添加对 `System.Windows` 和 `System.Windows.Media.Imaging` 的引用,并为 `ConvertBack` 方法添加文档注释。 在 `MainWindow.xaml` 中定义了 `TimeFormatConverter` 资源,以增强时间显示功能。
134 lines
4.5 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|