实现提供了完整的弹幕功能,包括多行显示、不同颜色、头像支持、防重叠、椭圆形边框、透明度渐变、点击事件、字体样式设置、暂停/继续功能、过滤功能等。还包含了批处理队列处理逻辑、速率限制、错误处理和性能监控等功能。Initial commit

This commit is contained in:
2025-03-28 22:55:34 +08:00
committed by yangwx01
commit d347357448
2 changed files with 243 additions and 0 deletions

170
README.md Normal file
View File

@@ -0,0 +1,170 @@
# YwxAppWpfDanMu
YwxAppWpfDanMu/
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Controls/
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuControl.xaml
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuControl.xaml.cs
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuItem.xaml
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuItem.xaml.cs
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuPool.cs
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuSettings.cs
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuFilter.cs
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Models/
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuMessage.cs
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuEventArgs.cs
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Services/
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuDispatcher.cs
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuPerformanceMonitor.cs
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IDanMuService.cs
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Utils/
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DanMuQueueProcessor.cs
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RateLimiter.cs
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Properties/
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AssemblyInfo.cs
<20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ɫ<EFBFBD><C9AB>ͷ<EFBFBD><CDB7>֧<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD>α߿<CEB1><DFBF><EFBFBD>͸<EFBFBD><CDB8><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><E4A1A2><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>á<EFBFBD><C3A1><EFBFBD>ͣ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܡ<EFBFBD><DCA1><EFBFBD><EFBFBD>˹<EFBFBD><CBB9>ܵȡ<DCB5><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD><C6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC>صȹ<D8B5><C8B9>ܡ<EFBFBD>
<Window x:Class="YourApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:danmu="clr-namespace:YwxAppWpfDanMu.Controls;assembly=YwxAppWpfDanMu"
Title="<22><>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<danmu:DanMuControl x:Name="DanMuControl" Grid.Row="0" LineCount="8"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="<22><>ͣ" Width="80" Margin="5" Click="PauseButton_Click"/>
<Button Content="<22><><EFBFBD><EFBFBD>" Width="80" Margin="5" Click="ResumeButton_Click"/>
<Button Content="<22><><EFBFBD><EFBFBD>" Width="80" Margin="5" Click="ClearButton_Click"/>
<Button Content="<22><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>" Width="80" Margin="5" Click="AddTestButton_Click"/>
</StackPanel>
</Grid>
</Window>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Ļ<EFBFBD>ؼ<EFBFBD>
public partial class MainWindow : Window
{
private readonly Random _random = new Random();
public MainWindow()
{
InitializeComponent();
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
DanMuControl.DanMuClick += OnDanMuClick;
DanMuControl.DanMuAdded += OnDanMuAdded;
DanMuControl.DanMuRemoved += OnDanMuRemoved;
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2>Ե<EFBFBD>Ļ
AddTestDanMu();
}
private void AddTestDanMu()
{
var colors = new[] { Colors.Red, Colors.Green, Colors.Blue, Colors.Yellow, Colors.White };
for (int i = 0; i < 100; i++)
{
var message = new DanMuMessage
{
Content = $"<22><><EFBFBD>Dz<EFBFBD><C7B2>Ե<EFBFBD>Ļ {i + 1}",
Color = colors[_random.Next(colors.Length)],
FontSize = 12 + _random.Next(10),
Opacity = 0.7 + _random.NextDouble() * 0.3
};
DanMuControl.AddDanMu(message);
}
}
private void OnDanMuClick(object sender, DanMuEventArgs e)
{
MessageBox.Show($"<22><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>Ļ: {e.Message.Content}");
}
private void OnDanMuAdded(object sender, DanMuEventArgs e)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
}
private void OnDanMuRemoved(object sender, DanMuEventArgs e)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>Ƴ<EFBFBD><EFBFBD>¼<EFBFBD>
}
private void PauseButton_Click(object sender, RoutedEventArgs e)
{
DanMuControl.IsPaused = true;
}
private void ResumeButton_Click(object sender, RoutedEventArgs e)
{
DanMuControl.IsPaused = false;
}
private void ClearButton_Click(object sender, RoutedEventArgs e)
{
DanMuControl.ClearAll();
}
private void AddTestButton_Click(object sender, RoutedEventArgs e)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1: <EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ
AddSingleTestDanMu();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>2: <EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ(<28><><EFBFBD><EFBFBD>)
// AddMultipleTestDanMu(5);
}
// <EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>Ļ
private void AddSingleTestDanMu()
{
var colors = new[] { Colors.Red, Colors.Green, Colors.Blue, Colors.Yellow, Colors.White, Colors.Cyan, Colors.Magenta };
var fonts = new[] { "Microsoft YaHei", "SimSun", "Arial", "Segoe UI" };
var message = new DanMuMessage
{
Content = $"<22><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>Ļ {DateTime.Now:HH:mm:ss}",
Color = colors[_random.Next(colors.Length)],
FontSize = 12 + _random.Next(10),
FontFamily = new FontFamily(fonts[_random.Next(fonts.Length)]),
FontWeight = _random.Next(2) == 0 ? FontWeights.Normal : FontWeights.Bold,
FontStyle = _random.Next(2) == 0 ? FontStyles.Normal : FontStyles.Italic,
Opacity = 0.7 + _random.NextDouble() * 0.3,
AvatarUrl = "https://via.placeholder.com/30" // ʹ<EFBFBD><EFBFBD>ռλͼ<EFBFBD><EFBFBD>Ϊͷ<EFBFBD><EFBFBD>
};
DanMuControl.AddDanMu(message);
}
// <EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>Ļ
private void AddMultipleTestDanMu(int count)
{
var messages = new List<DanMuMessage>();
var colors = new[] { Colors.Red, Colors.Green, Colors.Blue, Colors.Yellow, Colors.White, Colors.Cyan, Colors.Magenta };
var fonts = new[] { "Microsoft YaHei", "SimSun", "Arial", "Segoe UI" };
for (int i = 0; i < count; i++)
{
messages.Add(new DanMuMessage
{
Content = $"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>Ļ {i + 1} - {DateTime.Now:HH:mm:ss}",
Color = colors[_random.Next(colors.Length)],
FontSize = 12 + _random.Next(10),
FontFamily = new FontFamily(fonts[_random.Next(fonts.Length)]),
FontWeight = _random.Next(2) == 0 ? FontWeights.Normal : FontWeights.Bold,
FontStyle = _random.Next(2) == 0 ? FontStyles.Normal : FontStyles.Italic,
Opacity = 0.7 + _random.NextDouble() * 0.3,
AvatarUrl = $"https://via.placeholder.com/30?text={i + 1}" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>ͷ<EFBFBD><EFBFBD>
});
}
DanMuControl.AddDanMuBatch(messages);
}
}