namespace Yw.WpfUI.Hydro
|
{
|
/// <summary>
|
/// 抽象公告文本辅助类
|
/// </summary>
|
internal class LogicalBillboardTextHelper
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public LogicalBillboardTextHelper(HelixViewport3D viewport)
|
{
|
_viewport = viewport;
|
}
|
|
private readonly HelixViewport3D _viewport = null;//三维组件
|
private readonly double _fontSize = 12;//字体大小
|
private readonly Brush _foregroud = Brushes.Black;//前景色
|
private readonly Brush _background = Brushes.Transparent;//背景色
|
private readonly Brush _borderbrush = Brushes.Transparent;//边框色
|
private readonly Dictionary<string, BillboardTextVisual3D> _cache = new();//缓存
|
|
/// <summary>
|
/// 设置
|
/// </summary>
|
public void Set(List<TextL3d> items)
|
{
|
Clear();
|
items?.ForEach(x => AddTextVisual3D(x));
|
}
|
|
/// <summary>
|
/// 清理
|
/// </summary>
|
public void Clear()
|
{
|
if (_cache.Count > 0)
|
{
|
foreach (var item in _cache)
|
{
|
_viewport.Children.Remove(item.Value);
|
}
|
_cache.Clear();
|
}
|
}
|
|
/// <summary>
|
/// 更新
|
/// </summary>
|
public void Update(TextL3d item)
|
{
|
if (item == null)
|
{
|
return;
|
}
|
if (_cache.ContainsKey(item.Id))
|
{
|
var billboardText = _cache[item.Id];
|
if (billboardText != null)
|
{
|
billboardText.Text = item.Text;
|
}
|
}
|
else
|
{
|
AddTextVisual3D(item);
|
}
|
}
|
|
/// <summary>
|
/// 更新
|
/// </summary>
|
public void Update(List<TextL3d> items)
|
{
|
items?.ForEach(x => Update(x));
|
}
|
|
|
//添加公告牌文本
|
private void AddTextVisual3D(TextL3d item)
|
{
|
if (!_cache.ContainsKey(item.Id))
|
{
|
var billboardText = CreateTextVisual3D(item);
|
if (billboardText != null)
|
{
|
_cache.Add(item.Id, billboardText);
|
_viewport.Children.Add(billboardText);
|
}
|
}
|
}
|
|
//创建公告牌文本
|
private BillboardTextVisual3D CreateTextVisual3D(TextL3d item)
|
{
|
if (item == null)
|
{
|
return default;
|
}
|
var logicalVisual = _viewport.Children.OfType<LogicalVisual3D>()
|
.Where(x => x.Vmo.Id == item.Id).FirstOrDefault();
|
if (logicalVisual == null)
|
{
|
return default;
|
}
|
|
var bounds = Visual3DHelper.FindBounds(logicalVisual, Transform3D.Identity);
|
var position = bounds.GetCenter();
|
|
var billboardText = new BillboardTextVisual3D();
|
billboardText.Text = item.Text;
|
billboardText.Foreground = _foregroud;
|
billboardText.Background = _background;
|
billboardText.BorderBrush = _borderbrush;
|
billboardText.FontSize = _fontSize;
|
billboardText.Padding = new Thickness(2);
|
billboardText.Position = position;
|
billboardText.HorizontalAlignment = HorizontalAlignment.Left;
|
billboardText.VerticalAlignment = VerticalAlignment.Bottom;
|
|
return billboardText;
|
}
|
|
|
|
|
|
|
|
}
|
}
|