lixiaojun
2025-04-15 b21146005583515244d7d66340766a8d2e767481
增加背景图片,文本
已重命名2个文件
已修改6个文件
已添加4个文件
692 ■■■■■ 文件已修改
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalGridLineHelper.cs 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardLeadLabelHelper.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardLeadLabelVisual3D.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalTextL3d.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/04-backgroud/LogicalBackgroudHelper.cs 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/04-backgroud/LogicalBackgroudVisual3D.cs 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/GlobalUsings.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Test.Core/MainWindow.xaml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Test.Core/MainWindow.xaml.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalGridLineHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,162 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡ç½‘格线辅助类
    /// </summary>
    internal class LogicalGridLineHelper
    {
        /// <summary>
        ///
        /// </summary>
        public LogicalGridLineHelper(HelixViewport3D viewport)
        {
            _viewport = viewport;
            _gridLines = CreateGridLinesVisual3D();
            _viewport.CameraChanged += Viewport_CameraChanged;
        }
        private readonly HelixViewport3D _viewport = null;//三维组件
        private readonly GridLinesVisual3D _gridLines = null;//网格线
        /// <summary>
        /// æ˜¾ç¤ºç½‘格线
        /// </summary>
        public void Show()
        {
            var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault();
            if (gridLines == null)
            {
                _gridLines.Visible = true;
                _viewport.Children.Add(_gridLines);
                UpdateGridLinesVisual3D();
            }
            else
            {
                gridLines.Visible = true;
            }
        }
        /// <summary>
        /// éšè—ç½‘格线
        /// </summary>
        public void Hide()
        {
            var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault();
            if (gridLines != null)
            {
                gridLines.Visible = false;
            }
        }
        /// <summary>
        /// å¯è§æ€§
        /// </summary>
        public bool Visible
        {
            get
            {
                var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault();
                if (gridLines == null)
                {
                    return false;
                }
                if (!gridLines.Visible)
                {
                    return false;
                }
                return true;
            }
            set
            {
                if (value)
                {
                    Show();
                }
                else
                {
                    Hide();
                }
            }
        }
        //创建网格线
        private GridLinesVisual3D CreateGridLinesVisual3D()
        {
            var gridLines = new GridLinesVisual3D();
            gridLines.Thickness = 0.05;
            gridLines.MajorDistance = 5;
            gridLines.MinorDistance = 1;
            gridLines.Fill = Brushes.Black;
            return gridLines;
        }
        //相机改变
        private void Viewport_CameraChanged(object sender, RoutedEventArgs e)
        {
            UpdateGridLinesVisual3D();
        }
        // æ›´æ–°ç½‘格大小的方法
        private void UpdateGridLinesVisual3D()
        {
            var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault();
            if (gridLines == null)
            {
                return;
            }
            if (!gridLines.Visible)
            {
                return;
            }
            Rect3D bounds = Rect3D.Empty;
            foreach (Visual3D child in _viewport.Children.OfType<LogicalVisual3D>())
            {
                if (!(child is IBoundsIgnoredVisual3D))
                {
                    Rect3D rect = child.FindBounds(Transform3D.Identity);
                    bounds.Union(rect);
                }
            }
            if (!bounds.IsEmpty)
            {
                // è®¡ç®—最大尺寸并增加20%边距
                double maxSize = Math.Max(bounds.SizeX,
                                        Math.Max(bounds.SizeY, bounds.SizeZ)) * 1.5;
                // è®¾ç½®ç½‘格大小
                gridLines.Width = maxSize;
                gridLines.Length = maxSize;
                // ä¿æŒç½‘格居中
                gridLines.Center = new Point3D(
                    bounds.X + bounds.SizeX / 2,
                    bounds.Y + bounds.SizeY / 2,
                    0);
                // æ ¹æ®å°ºå¯¸è‡ªåŠ¨è°ƒæ•´ç½‘æ ¼å¯†åº¦
                gridLines.MinorDistance = Math.Max(1, maxSize / 20d);
                gridLines.MajorDistance = gridLines.MinorDistance * 5;
            }
            else
            {
                // é»˜è®¤å¤§å°ï¼ˆå½“场景为空时)
                gridLines.Width = 100;
                gridLines.Length = 100;
                gridLines.Center = new Point3D(0, 0, 0);
            }
        }
    }
}
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardLeadLabelHelper.cs
ÎļþÃû´Ó Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardTextHelper.cs ÐÞ¸Ä
@@ -1,14 +1,14 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡å…¬å‘Šç‰Œæ–‡æœ¬è¾…助类
    /// æŠ½è±¡å¼•线标签辅助类
    /// </summary>
    internal class LogicalBillboardTextHelper
    internal class LogicalBillboardLeadLabelHelper
    {
        /// <summary>
        /// 
        /// </summary>
        public LogicalBillboardTextHelper(HelixViewport3D viewport)
        public LogicalBillboardLeadLabelHelper(HelixViewport3D viewport)
        {
            _viewport = viewport;
        }
@@ -16,13 +16,14 @@
        private readonly HelixViewport3D _viewport = null;//三维组件
        private readonly double _fontSize = 12;//字体大小
        private readonly Brush _foregroud = Brushes.Black;//前景色
        private readonly Brush _background = Brushes.White;//背景色
        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<LogicalBillboardText> items)
        public void Set(List<LogicalTextL3d> items)
        {
            Clear();
            items?.ForEach(x => AddTextVisual3D(x));
@@ -46,7 +47,7 @@
        /// <summary>
        /// æ›´æ–°
        /// </summary>
        public void Update(LogicalBillboardText item)
        public void Update(LogicalTextL3d item)
        {
            if (item == null)
            {
@@ -69,14 +70,14 @@
        /// <summary>
        /// æ›´æ–°
        /// </summary>
        public void Update(List<LogicalBillboardText> items)
        public void Update(List<LogicalTextL3d> items)
        {
            items?.ForEach(x => Update(x));
        }
        //添加公告牌文本
        private void AddTextVisual3D(LogicalBillboardText item)
        private void AddTextVisual3D(LogicalTextL3d item)
        {
            if (!_cache.ContainsKey(item.Id))
            {
@@ -90,7 +91,7 @@
        }
        //创建公告牌文本
        private BillboardTextVisual3D CreateTextVisual3D(LogicalBillboardText item)
        private BillboardTextVisual3D CreateTextVisual3D(LogicalTextL3d item)
        {
            if (item == null)
            {
@@ -110,13 +111,12 @@
            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;
        }
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardLeadLabelVisual3D.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡å¼•线标签
    /// </summary>
    public class LogicalBillboardLeadLabelVisual3D : ModelVisual3D
    {
    }
}
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalTextL3d.cs
ÎļþÃû´Ó Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardText.cs ÐÞ¸Ä
@@ -1,9 +1,9 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡å…¬å‘Šç‰Œæ–‡æœ¬
    /// æŠ½è±¡æ–‡æœ¬
    /// </summary>
    public class LogicalBillboardText
    public class LogicalTextL3d
    {
        /// <summary>
        /// æž„ä»¶id
@@ -15,6 +15,10 @@
        /// </summary>
        public string Text { get; set; }
        /// <summary>
        /// è·ç¦»
        /// </summary>
        public int? Distance { get; set; }
    }
Yw.WpfUI.Hydro.L3d.Core/03-logical/04-backgroud/LogicalBackgroudHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡èƒŒæ™¯è¾…助类
    /// </summary>
    internal class LogicalBackgroudHelper
    {
        /// <summary>
        ///
        /// </summary>
        public LogicalBackgroudHelper(HelixViewport3D viewport)
        {
            _viewport = viewport;
            _backgroud = new LogicalBackgroudVisual3D();
        }
        private readonly HelixViewport3D _viewport = null;//三维组件
        private readonly LogicalBackgroudVisual3D _backgroud = null;//背景
        /// <summary>
        /// æ˜¾ç¤ºèƒŒæ™¯
        /// </summary>
        public void Show()
        {
            var bc = _viewport.Children.OfType<LogicalBackgroudVisual3D>().FirstOrDefault();
            if (bc == null)
            {
                _backgroud.Visible = true;
                _viewport.Children.Add(_backgroud);
            }
            else
            {
                bc.Visible = true;
            }
        }
        /// <summary>
        /// éšè—èƒŒæ™¯
        /// </summary>
        public void Hide()
        {
            var bc = _viewport.Children.OfType<LogicalBackgroudVisual3D>().FirstOrDefault();
            if (bc != null)
            {
                bc.Visible = false;
            }
        }
        /// <summary>
        /// å¯è§æ€§
        /// </summary>
        public bool Visible
        {
            get
            {
                var bc = _viewport.Children.OfType<LogicalBackgroudVisual3D>().FirstOrDefault();
                if (bc == null)
                {
                    return false;
                }
                if (!bc.Visible)
                {
                    return false;
                }
                return true;
            }
            set
            {
                if (value)
                {
                    Show();
                }
                else
                {
                    Hide();
                }
            }
        }
        /// <summary>
        /// è®¾ç½®èƒŒæ™¯
        /// </summary>
        public void Set(string url)
        {
            var bitmap = new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute));
            _backgroud.UpdateVisual(bitmap);
        }
        /// <summary>
        /// è®¾ç½®èƒŒæ™¯
        /// </summary>
        public void Set(string url, double width, double height)
        {
            var bitmap = new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute));
            _backgroud.UpdateVisual(bitmap, width, height);
        }
    }
}
Yw.WpfUI.Hydro.L3d.Core/03-logical/04-backgroud/LogicalBackgroudVisual3D.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡èƒŒæ™¯
    /// </summary>
    internal class LogicalBackgroudVisual3D : MeshGeometryVisual3D
    {
        /// <summary>
        ///
        /// </summary>
        public LogicalBackgroudVisual3D()
        {
            UpdateVisual();
        }
        /// <summary>
        ///
        /// </summary>
        public LogicalBackgroudVisual3D(BitmapImage bitmap) : this()
        {
            _bitmap = bitmap;
            _width = bitmap.Width;
            _height = bitmap.Height;
        }
        /// <summary>
        ///
        /// </summary>
        public LogicalBackgroudVisual3D(BitmapImage bitmap, double width, double height) : this()
        {
            _bitmap = bitmap;
            _width = width;
            _height = height;
        }
        private BitmapImage _bitmap = null;//背景图片
        private double _width = 100d;//背景宽度
        private double _height = 100d;//背景高度
        //更新材质
        private void UpdateMaterial()
        {
            Material material = null;
            if (_bitmap == null)
            {
                material = MaterialHelper.CreateMaterial(Colors.Black);
            }
            else
            {
                material = MaterialHelper.CreateImageMaterial(_bitmap, 1.0);
            }
            this.Material = material;
        }
        //更新几何图形
        private void UpdateGeometry()
        {
            double halfWidth = _width / 2;
            double halfHeight = _height / 2;
            var meshBuilder = new MeshBuilder();
            // åˆ›å»ºå¹³é¢ç½‘æ ¼
            meshBuilder.AddQuad(
                new Point3D(-halfWidth, -halfHeight, 0),  // å·¦ä¸‹
                new Point3D(halfWidth, -halfHeight, 0),  // å³ä¸‹
                new Point3D(halfWidth, halfHeight, 0),   // å³ä¸Š
                new Point3D(-halfWidth, halfHeight, 0)); // å·¦ä¸Š
            var geometry = meshBuilder.ToMesh();
            this.MeshGeometry = geometry;
        }
        /// <summary>
        /// æ›´æ–°å¯è§å…ƒç´ 
        /// </summary>
        public void UpdateVisual()
        {
            this.UpdateGeometry();
            this.UpdateMaterial();
        }
        /// <summary>
        /// æ›´æ–°å¯è§å…ƒç´ 
        /// </summary>
        public void UpdateVisual(BitmapImage bitmap)
        {
            _bitmap = bitmap;
            _width = bitmap.Width;
            _height = bitmap.Height;
            UpdateVisual();
        }
        /// <summary>
        /// æ›´æ–°å¯è§å…ƒç´ 
        /// </summary>
        public void UpdateVisual(BitmapImage bitmap, double width, double height)
        {
            _bitmap = bitmap;
            _width = width;
            _height = height;
            UpdateVisual();
        }
    }
}
Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs
@@ -15,10 +15,12 @@
            _overrideColorHelper = new LogicalOverrideColorHelper();
            _overrideOpacityHelper = new LogicalOverrideOpacityHelper();
            _overrideVisibleHelper = new LogicalOverrideVisibleHelper();
            _backgroundHelper = new LogicalBackgroudHelper(_viewport);
            _gridLinesHelper = new LogicalGridLineHelper(_viewport);
            _highlightHelper = new LogicalHighlightHelper(_viewport);
            _selectionHelper = new LogicalSelectionHelper(_viewport);
            _zoomHelper = new LogicalZoomHelper(_viewport);
            _billboardTextHelper = new LogicalBillboardTextHelper(_viewport);
            _billboardTextHelper = new LogicalBillboardLeadLabelHelper(_viewport);
        }
        #region äº‹ä»¶é›†åˆ
@@ -38,10 +40,12 @@
        protected readonly LogicalOverrideColorHelper _overrideColorHelper = null;//覆盖颜色辅助类
        protected readonly LogicalOverrideOpacityHelper _overrideOpacityHelper = null;//覆盖透明度辅助类
        protected readonly LogicalOverrideVisibleHelper _overrideVisibleHelper = null;//覆盖可见性辅助类
        protected readonly LogicalBackgroudHelper _backgroundHelper = null;//背景辅助类
        protected readonly LogicalGridLineHelper _gridLinesHelper = null;//网格线辅助类
        protected readonly LogicalHighlightHelper _highlightHelper = null;//高亮辅助类
        protected readonly LogicalSelectionHelper _selectionHelper = null;//选择辅助类
        protected readonly LogicalZoomHelper _zoomHelper = null;//缩放辅助类
        protected readonly LogicalBillboardTextHelper _billboardTextHelper = null;//公告版文字辅助类
        protected readonly LogicalBillboardLeadLabelHelper _billboardTextHelper = null;//公告版文字辅助类
        #endregion
@@ -503,13 +507,138 @@
        #endregion
        #region èƒŒæ™¯
        /// <summary>
        /// æ˜¾ç¤ºèƒŒæ™¯
        /// </summary>
        public virtual void ShowBackgroud()
        {
            if (!Initialized)
            {
                return;
            }
            _backgroundHelper.Show();
        }
        /// <summary>
        /// éšè—èƒŒæ™¯
        /// </summary>
        public virtual void HideBackgroud()
        {
            if (!Initialized)
            {
                return;
            }
            _backgroundHelper.Hide();
        }
        /// <summary>
        /// èƒŒæ™¯å¯è§æ€§
        /// </summary>
        public virtual bool BackgroudVisible
        {
            get
            {
                if (!Initialized)
                {
                    return false;
                }
                return _backgroundHelper.Visible;
            }
            set
            {
                if (!Initialized)
                {
                    return;
                }
                _backgroundHelper.Visible = value;
            }
        }
        /// <summary>
        /// è®¾ç½®èƒŒæ™¯
        /// </summary>
        public virtual void SetBackgroud(string url)
        {
            if (!Initialized)
            {
                return;
            }
            _backgroundHelper.Set(url);
        }
        /// <summary>
        /// è®¾ç½®èƒŒæ™¯
        /// </summary>
        public virtual void SetBackgroud(string url, double width, double height)
        {
            if (!Initialized)
            {
                return;
            }
            _backgroundHelper.Set(url, width, height);
        }
        #endregion
        #region ç½‘格线
        /// <summary>
        /// æ˜¾ç¤ºç½‘格线
        /// </summary>
        public virtual void ShowGridLines()
        {
            if (!Initialized)
            {
                return;
            }
            _gridLinesHelper.Show();
        }
        /// <summary>
        /// éšè—ç½‘格线
        /// </summary>
        public virtual void HideGridLines()
        {
            if (!Initialized)
            {
                return;
            }
            _gridLinesHelper.Hide();
        }
        /// <summary>
        /// ç½‘格线可见性
        /// </summary>
        public virtual bool GridLinesVisible
        {
            get
            {
                if (!Initialized)
                {
                    return false;
                }
                return _gridLinesHelper.Visible;
            }
            set
            {
                if (!Initialized)
                {
                    return;
                }
                _gridLinesHelper.Visible = value;
            }
        }
        #endregion
        #region å…¬å‘Šæ¿æ–‡æœ¬
        /// <summary>
        /// è®¾ç½®å…¬å‘Šæ¿æ–‡æœ¬
        /// </summary>
        public virtual void SetBillboardText(List<LogicalBillboardText> items)
        public virtual void SetBillboardText(List<LogicalTextL3d> items)
        {
            if (!Initialized)
            {
@@ -518,6 +647,41 @@
            _billboardTextHelper.Set(items);
        }
        /// <summary>
        /// æ›´æ–°å…¬å‘Šæ¿æ–‡æœ¬
        /// </summary>
        public virtual void UpdateBillboardText(LogicalTextL3d item)
        {
            if (!Initialized)
            {
                return;
            }
            _billboardTextHelper.Update(item);
        }
        /// <summary>
        /// æ›´æ–°å…¬å‘Šæ¿æ–‡æœ¬
        /// </summary>
        public virtual void UpdateBillboardText(List<LogicalTextL3d> items)
        {
            if (!Initialized)
            {
                return;
            }
            _billboardTextHelper.Update(items);
        }
        /// <summary>
        /// æ¸…理公告板文本
        /// </summary>
        public virtual void ClearBillboardText()
        {
            if (!Initialized)
            {
                return;
            }
            _billboardTextHelper.Clear();
        }
        #endregion
Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml
@@ -14,7 +14,6 @@
            x:Name="viewport"
            ShowCoordinateSystem="True"
            ZoomExtentsWhenLoaded="True">
            <hx:DefaultLights />
        </hx:HelixViewport3D>
    </Grid>
</UserControl>
Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml.cs
@@ -128,13 +128,78 @@
        #region å…¬å‘Šæ¿æ–‡æœ¬
        public void SetBillboardText(List<LogicalBillboardText> items)
        public void SetBillboardText(List<LogicalTextL3d> items)
        {
            _manager.SetBillboardText(items);
        }
        #endregion
        #region ç½‘格线
        /// <summary>
        /// æ˜¾ç¤ºç½‘格线
        /// </summary>
        public void ShowGridLines()
        {
            _manager.ShowGridLines();
        }
        /// <summary>
        /// éšè—ç½‘格线
        /// </summary>
        public void HideGridLines()
        {
            _manager.HideGridLines();
        }
        /// <summary>
        /// ç½‘格线可见性
        /// </summary>
        public bool GridLinesVisible
        {
            get { return _manager.GridLinesVisible; }
            set { _manager.GridLinesVisible = value; }
        }
        #endregion
        #region èƒŒæ™¯
        /// <summary>
        /// æ˜¾ç¤ºèƒŒæ™¯
        /// </summary>
        public void ShowBackgroud()
        {
            _manager.ShowBackgroud();
        }
        /// <summary>
        /// éšè—èƒŒæ™¯
        /// </summary>
        public void HideBackgroud()
        {
            _manager.HideBackgroud();
        }
        /// <summary>
        /// èƒŒæ™¯å¯è§æ€§
        /// </summary>
        public bool BackgroudVisible
        {
            get { return _manager.BackgroudVisible; }
            set { _manager.BackgroudVisible = value; }
        }
        /// <summary>
        /// è®¾ç½®èƒŒæ™¯
        /// </summary>
        public void SetBackgroud(string url)
        {
            _manager.SetBackgroud(url);
        }
        #endregion
    }
}
Yw.WpfUI.Hydro.L3d.Core/GlobalUsings.cs
@@ -6,4 +6,5 @@
global using System.Collections.Concurrent;
global using System.Text;
global using System.IO;
global using System.Windows.Input;
global using System.Windows.Input;
global using System.Windows.Media.Imaging;
Yw.WpfUI.Test.Core/MainWindow.xaml
@@ -92,7 +92,18 @@
                </Button.ContextMenu>
            </Button>
            <Separator />
            <Button Content="文本" Click="BillboardText_Click"></Button>
            <Button Click="BillboardText_Click" Content="文本" />
            <CheckBox
                Name="ckGridLines"
                Checked="CheckBox_Checked"
                Content="网格线"
                Unchecked="ckGridLines_Unchecked" />
            <Separator />
            <CheckBox
                Name="ckBackgroud"
                Checked="ckBackgroud_Checked"
                Content="背景"
                Unchecked="ckBackgroud_Unchecked" />
        </ToolBar>
        <local:LogicalEditerL3d Name="editer" Grid.Row="1" />
    </Grid>
Yw.WpfUI.Test.Core/MainWindow.xaml.cs
@@ -200,13 +200,34 @@
        private void BillboardText_Click(object sender, RoutedEventArgs e)
        {
            var list = _nw.Visuals.Select(x => new LogicalBillboardText()
            var list = _nw.Visuals.Select(x => new LogicalTextL3d()
            {
                Id = x.Id,
                Text = x.Id
            }).ToList();
            this.editer.SetBillboardText(list);
        }
        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            this.editer.GridLinesVisible = true;
        }
        private void ckGridLines_Unchecked(object sender, RoutedEventArgs e)
        {
            this.editer.GridLinesVisible = false;
        }
        private void ckBackgroud_Checked(object sender, RoutedEventArgs e)
        {
            this.editer.BackgroudVisible = true;
            this.editer.SetBackgroud("mt.png");
        }
        private void ckBackgroud_Unchecked(object sender, RoutedEventArgs e)
        {
            this.editer.BackgroudVisible = false;
        }
    }